source: tol/tolbase/lib/toltk/tolpkg_gui.tcl @ 567b369

1941-docker-image-to-testdevel
Last change on this file since 567b369 was 567b369, checked in by Jorge Pérez <josp.jorge@…>, 15 years ago

refs #1424, implementing the menu options to remove packages

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@4097 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 66.5 KB
RevLine 
[5b6b63c]1package require wtree
2package require BWidget
[00c4270]3package require msgcat
[5b6b63c]4
5namespace eval ::TolPkgGUI {
6
[00c4270]7  namespace import ::msgcat::*
8
[5b6b63c]9  variable widgets
10
11  variable cwd [ file normalize [ file dir [ info script ] ] ]
12
13  variable urlmap
[e4c69c1]14
15  array set urlmap {
16    http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php OTAN
[633537f]17    OTAN http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php
[e4c69c1]18    http://packages.localbayes.es/BayesPrivateTolPackages/repository.php BPTP
[633537f]19    BPTP http://packages.localbayes.es/BayesPrivateTolPackages/repository.php
[e4c69c1]20  }
[00c4270]21 
[633537f]22  variable win
23
[e83ccac]24  variable packSyncInfo
25  variable versSyncInfo
[00c4270]26  variable localVersionInfo
[e83ccac]27  variable localMostRecent
[00c4270]28
[e83ccac]29  variable nodesInfo
[5b6b63c]30  variable treeParents
31
32  if { ![ info exists localInfo ] } {
33    array set localInfo {}
34  }
35
36  if { [ lsearch [ image names ] green_light ] == -1 } {
37    image create photo green_light -data {
38      R0lGODlhEAAQAOedABoaGh0eHSUlJScnJykpKUtLS0xMTFxcXFxdXF1dXWNjY0l4KUt4LEt5LU57
39      L1Z4QG1ubVd5QW9wb0iJG0mLG2yBX22BYFiQM3KEZ1eSMXaGa3OJZHSJZ3mHb4KDgYOEgoSEhISG
40      g3yKdIWGhHCRWoWHhHCTWIeIhlegJliiJnSUYF+jM3eZYY6OjmClM1+oL2CqLouXg3ufZo2YhoCh
41      bIGibZqbmpubm4mldpucm4emdZifk52dnZ2fnJ6fnI6ofZ2jmJ+inZGqgXO4UaCknpSshHS7UaSm
42      oqSmo4e4ZaqsqKSvnKutqqSxnI69bK2urHfPPLGzr3jQPIjLW7S2sn3URX3VQ4zOYLa6s4/OdYLW
43      Wbm9tYTYUILYWJHRdoTZTp/NiqDNjL3Au7/AvsDAwL/BvsHBwcDDvsPDwrfKrMTEw7nKr4riUrzK
44      sovjVL3Ls5DkXZHkX5TmaJbmZ5Xma5fmZ67anJfmaZnnbZ3ncM/Pzpzoc53odNHR0ZrqgqHpeqXo
45      eaHpe6Xoep/qgJzrhaHqgqXpg6XphNTU1K7rh9fX1q/ridfY19TjycHto9fmzcPwpcPwpsTwp9fv
46      xdfvxtnzx9X2zNr1yNb2zuL52+P53ev25Oz35P//////////////////////////////////////
47      ////////////////////////////////////////////////////////////////////////////
48      ////////////////////////////////////////////////////////////////////////////
49      ////////////////////////////////////////////////////////////////////////////
50      ////////////////////////////////////////////////////////////////////////////
51      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
52      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjfAP8JHHiDjBkeAxMO7HNmhoUKMcQgUiiQkYgHQtq8KRKh
53      gyKFejQwaLSJE6dNjxxg6DMQBJAGSShVunSp0iQnC3a0EIiGw4QpjiJJkgTJ0RUKG9QIfKICBRRA
54      iRYtSiRISgoSTAQiYfGiips6efLUYWMFhokjAnv8WMElzh08eObA+eIChw+BNpZc0EKHT6A/e+R0
55      ydAkh8ADQXQMIVTokKFBfozUIKJg4AgsNLJg0pTJkhcZW04kFOAhypowduyASUPlAwGFACCEUDKm
56      DJMSEgJQFCigAIIEBgbsHk4xIAA7
57    }
58  }
59 
60  if { [ lsearch [ image names ] ok_green_16 ] == -1 } {
61    image create photo ok_green_16 -data {
62      R0lGODlhEAAQAOelAEhfPU5hRlFiTFNiTk5oP1NmS1VlUFRmTVllWFloUlxoW15rXF1sV1dwSVpy
63      S11yUmlyaGl0ZWxzbmB6UGaET1yOMXqCeWqLUV6XLH+Ie1KhCFOhCFOiCFSiCFWiCVejDVekDFik
64      DnGWVFqkEVilDlmmD1ymFF2nFl6nGGCpGoqSimGqHHWkTnijVGyxKm6yLmm7G3O2M3W2N5qimXyz
65      SWq/GZ6jnpykm3e5OH27Qn29P36/QYS9UoLBR3DNF3HOFnLQFonFT3PSFnTSGHjTHo/HW3jUHnjU
66      H3rUIXvVJLO3s5TKYX/WKpTLXbS5tJHNV5LOWIXWNpPPWbe8t5DSUYjZOYnZOorZPLu+vY/XSIra
67      PZXUWozaQJnTYY3aQY/ZRo3aQp/Rbo7bQ4/bRJDbRpDbR5vVZJDcRpLcSZLcSpTbT5PcS5PcTJvY
68      XpTcTZvZX5TdTZTdTpbdUMHFxJfdVJfeUpjeU5rdWpneVZvdWpzdXpveWpzeW5rfV6DcZZ7dYaPb
69      a5zfWp3fW6HdaKfadZ3gXJ/fYZ/gX6DhYaHhY6fecqLhZKPhZazcfaPhZq3cf6PiZqzfe63hfKvk
70      c8/Rz63kd7Higa7kd9DS0bDlfrPkgrTkhrrmj9ja2dvb29zd3eDh4OTl4+Xm4+7v7vLy8f//////
71      ////////////////////////////////////////////////////////////////////////////
72      ////////////////////////////////////////////////////////////////////////////
73      ////////////////////////////////////////////////////////////////////////////
74      ////////////////////////////////////////////////////////////////////////////
75      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
76      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjmAP8JHPiPAweCCAV+6NHFzyAzQUYk/OdCkZsqVq5wwSNJ
77      BsIXlc6QQbMGjpwLFBrlGBjCEh48fQIVOlQEApYBnFAIXDJpkSNGixIhevDJRgtIYQQ+MiTiwBZB
78      gXhYGGWAjp1IBTexkEBJAJU6E0CpoMEmTSYPHTSpceAEU4EsC0glGCMGzCUQ/wiV+dJgihIAM+ZU
79      MJKECSAN/5rE0RIlQKcbnjLUECLkCBSBJv4MEQJDQShRDCgLuZNiYAw2lDEgiECAshcdCHHoQSLk
80      hw8gRPLsmHjiSRs+e95IWTFx4AYSJTYkDAgAOw==
81    }
82  }
83  if { [ lsearch [ image names ] yellow_light ] == -1 } {
84    image create photo yellow_light -data {
85      R0lGODlhEAAQAPcAABoaGh4eHSUlJScnJykpKX9qOUtLS0xMTFxcXF1dXF1dXWNjY25ubXBwb5ds
86      DZptDIJkH4JlIoNmI4VnJZ56JZx5J4BrOoV5W4V5XId9Y4l/aLOBFbCAFriJH7qKHrKHJbSIJOKp
87      KeOqKeexMuixMeu5POq4PpuEUZmEUpuHWaCLWqaSX46AYI2BY4qBbI2EcaiWZamWZqybbquacK6e
88      eK+ge7GifsWmQ8mpQ9mtTMOiWtywUcenYujDR+bCSfXAQPXAQfXFTPXGTvbJVvbJV/bKV/bLWPbO
89      WPbPW/fNXffOXtrDat3HavfNYffMa/fNa/fQZPfRZffUbPjUbffccvbYdvbYd/jddfjSefjTevjU
90      fPjmdfjneISDgYWEgoaFg4SEhIaFhIeGhIiIho6OjpmSgZqTg5uampubm5ycm52dnZ+enKGckqCe
91      nKWgl6KgnKSinbGrmrSsmaeloaemo6yrqK2sqa2sqq6tq7Syrre1sbu5sr67tMG/u9bEgdbEg+LT
92      lPfamfrdnPrdnc7EqM3Drs7FrM3Er8HAvcHAvsPBvsDAwMHBwcPDwsTEw8/PztHR0dLR0dTU1NjX
93      1tjY1+fcxenfyvXkwPnowfvpwvz1xvz1yP342P342fjx4vny4gAAAAAAAAAAAAAAAAAAAAAAAAAA
94      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
95      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
96      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
97      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
98      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKAALAAAAAAQABAA
99      AAjfAEEJHIhmESM1AxMOhKTIDIYLZfpIUiiQ0osCNQodsmHBxSSFjzREqOTp0ydPliZkiDQQjBsJ
100      Oi5hypQJ0yUeENiQEdiohYMcgQQNGiQo0I4HLBwJxJOCQwgnWbRowfJExAYUdwTSUdFhBBAiTZoM
101      +UHCw4k5AtfQ+GBCiBElSYoEKQFiRhuBZ+JU8IEkyhQpUI70oCAnjUAEb2Tc4HLFShUqW3DEgLNg
102      YJg9MJZs6sRJE5MVfMYkFNAlj6E/gAD5IaTHCwGFABh8qYMokR0xDQJQFCjAQAIFBwbsHk4xIAA7
103    }
104  }
105
106  if { [ lsearch [ image names ] refresh_yellow_16 ] == -1 } {
107    image create photo refresh_yellow_16 -data {
108      R0lGODlhEAAQAMZJAI99Ob2SKdGaI9SbI8+fIOCjHbynYsSpSLypbeKmHL+qZdWsGryrd+upGdyw
109      FsaycuS0E+yzE+W3E/u0Evu1EfK4D+i7GPu3EPy4D/y4EPy6Dvy7Dfy9DPy+DP2+C/3ACv3BCv3C
110      Cf3DCP3DCf3ECP7ECOTEWfzGB/7GBv7GB/7HBv7JCP7JCf3JDP7KDPHJPf/MEP3MGf/MFPjMLf/N
111      Fv/NGv/PIf7PJf7QJ//QKv/SMv/TNv/TOP/VQ/7WR/7WSPjXaP/YU//YVf/ZWP/bZP/bZv/edf/e
112      d/7ggf//////////////////////////////////////////////////////////////////////
113      ////////////////////////////////////////////////////////////////////////////
114      /////////////////////////////////////////////////////////////////////////yH+
115      EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAH8ALAAAAAAQABAAAAdpgH+Cg4SFhoeIf0gKiYMPRkRB
116      PTo2MBKHQEM+OzcyKykjFYcvOTEtJyIfHBoBhxYAgwQZEw2NjQwIBraCR0VCB4MOEIcmPzw4NCwo
117      qRGHMzUuKiUgHRoXCYcLJCEeGxgUBbt/AgPi5o2BADs=
118    }
119  }
120
121  if { [ lsearch [ image names ] red_stop_16 ] == -1 } {
122    image create photo red_stop_16 -data {
123      R0lGODlhEAAQAOeLAKkAAKoAAKoBAasEBKsGBqwGBqsHB60ICMwAAKwJCcwCAq0NDa8PD68QEM4I
124      CMcMDLATE84MDLEUFLYbG4YpKoUrK4UtLbcjI4c0NLgnJ7srK4g7O9MnJ9QnJ7wvL5E7O7swMNQq
125      Kr4wMNUuLtUvL7w4OME3N8I4ONc0NMA7O9c1Ndc4OMU+Ptg6Otg7O9g9PcdCQtk/P9lCQshHR9pE
126      RNpFRdpGRtpHR9pISM5NTdpKSttKStpLS89OTtlMTNBPT9tNTdpPT9xPT81UVNxQUNZSUtdSUtxR
127      UdxSUtNVVd1UVNpVVc1ZWd1VVYFubtVZWYRvb91XV91YWNpZWd5YWNpbW9pgYNRlZdxmZuBmZtpr
128      a+Fra91xcd9xceJyctx2dpuIh5aKiI+NieB3d+R2duF3d56LiuJ7e6COjaOSkaaVlOSFhaiYl6eb
129      maubm6KfnKydnLKpp6+tqru+uL/CvcPFwMfJxcvNyc7QzNDSzdLU0dPV0dbY1NfY1Nrc2Nzd2d7f
130      3N/h3uLj4OPk4eXm5Obn5enq6Orr6e7u7fHy8fX19P//////////////////////////////////
131      ////////////////////////////////////////////////////////////////////////////
132      ////////////////////////////////////////////////////////////////////////////
133      ////////////////////////////////////////////////////////////////////////////
134      ////////////////////////////////////////////////////////////////////////////
135      ////////////////////////////////////////////////////////////////////////////
136      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
137      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjXAP8JHPgvQACCCAUSYJFkSpUnMxIk/HcBywsOHUKMqNHF
138      A8IMW1CoWNHiRQwZNsikGGhgDI0aN3YAIYKkCZUoaxoIZJKlSZQoTZQgOUJECBApVwR+QQIFjhs2
139      atKgMQPGCQwuBc/giKMoEaJDhQYF+iOnhBcBAcrEaGOIkCBAfvrsyfMGxJYB/7SoCMNHD547durQ
140      mSNmghUA/4a8+LABg4UKkCFTeNBD4IIlChBo3rzZB4SBGlxw5kzCBEIRQSJwdsDjxEQGOYoA0WHk
141      h4SJAwEUOIAYYUAAOw==
142    }
143  }
144
145  if { [ lsearch [ image names ] yellow_stop_16 ] == -1 } {
146    image create photo yellow_stop_16 -data {
147      R0lGODlhEAAQAOeQAIWFbpSLK4iIb5SMLZaNKpSNNJWOO5+WO5CTiZiaiZ6fh6GiiqOkjcqnDaKl
148      nMqoDcuoDcupDMupDaankcupE8yqEMuqE8yrEsyrFqiplKmpmc2sFM2sGs6uGs2uHausl8+vHq6u
149      m9CxIK+vnK+yqtS3LrO1p9W4MtG+G9e8NNe8OdHBMNq/ONLDOLu+uNrBRNzDP93EQL/Cvd7GR8PF
150      wODKTubPDN3NQsfJxe3UAO3UAuPPWuPPYO7VCMvNyebRUubRU+7WDOjTU87QzOnWWdDSzfDaJ+jW
151      afDbJ/DbKurYXdLU0fDcLvDcL9PV0e3aVPHdNO3bVPHdNfHdOPHeOvHeO/HePfHfP9bY1O/dW9fY
152      1PLfQu/eVu/dYfLfRfDfTPHfS/HfUO7dbfLgRPLgRfLgRvLgR/LgSO/fXPLgSvLgTfLhSvLhTfPh
153      T/PhUPDgaO7fevPiUPPiUfPiUtrc2PPiVPPiVfDgc/PjV/PjWNzd2fLjcvHjeN7f3PTlZvTla/Tm
154      a/Pled/h3vPlffTmcuLj4PbodvTohuPk4eXm5Obn5enq6Orr6e7u7fHy8fX19P//////////////
155      ////////////////////////////////////////////////////////////////////////////
156      ////////////////////////////////////////////////////////////////////////////
157      ////////////////////////////////////////////////////////////////////////////
158      ////////////////////////////////////////////////////////////////////////////
159      ////////////////////////////////////////////////////////////////////////////
160      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
161      SU1QACH5BAEKAP8ALAAAAAAQABAAAAjWAP8JHPjvAQSCCAVSmEEkCxolNTAk/FfijRUjSJIw8bJH
162      BcITgKBImULFypUtZQy9GGiBzxgyZtawcTPHTh48hzwI5OHHDh48durMkROnDZs8RwTCmSNgRIgP
163      GSYwWKAAwI07/yAMOmPikaNGjBQhEqSHRAtCEiIEuqJhUaJCfehocVLEwYo/Ff6JkZIAy5IhPnDQ
164      kOECAYouAndYOWCgwIAAkCETsAFEIAcuOnJo3rz5C4iBKapw5twEBkIWYYJw7gEmxsQOP56oSRNF
165      iIiJBC9saJAwIAA7
166    }
167  }
168
169  if { [ lsearch [ image names ] red_light ] == -1 } {
170    image create photo red_light -data {
171      R0lGODlhEAAQAPcAABoaGh4dHSUlJScnJykpKUtLS0xMTFxcXF1cXF1dXWNjY25tbXBvb54KB4ge
172      GqEJBrgTD7sSDocgHYgiH6QkH7siHbkkHoojIIM4NoQ5NqInIsIbFsAdGOwmIO0mIPEvKPAxKfM/
173      NvQ9NMxLPdBLPf5AN/5BOPFSP55QTZxST4dbWYhcWp5YVqRZVpBgXqpgXIljYotoZoxsa5BjYY5x
174      cKtnYq1mY7Bva65wbrF3dbJ7ebR+fMhXVcxfXeFJReNOS/5ORO5TQf5QRv9XTv9YT/9aT/9bUf5f
175      UP5iU/9hVv9iVv9iWf5pXf5rXv5pZP5qZeB1ZON3Zf9yZf9yZv5/bP95c/1+cP1/cf95dP98dtuI
176      fdqKf/6Cb/+Lbv+PcoSBgYWCgoaDg4SEhIaEhIiEhImGho6OjpqBgJyDgpuampubm5ybm52dnZ+c
177      nKKRkaWXl6CcnKOcnKWdnbOambaamaehoaejo6yoqK6pqa6qqq+rq7Svrreysbyzsr+1tOadkOed
178      kPyXlPyYlf6al/6bl/+cmc+trc+urtCpptCtqsG6u8G9vcG+vsS+vve/vvi/vvzAv8DAwMHBwcPC
179      wsTDw8/OztHR0dLR0dTU1NjW1tjX1+jExOvJyP7BwP/RxP/Sxv/e1v/g2Pnh4fvh4QAAAAAAAAAA
180      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
181      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
182      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
183      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
184      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKQALAAAAAAQABAA
185      AAjfAEkJHKgmkiQ2AxMOtNQIzQoVZxRhUihQEw0MOgwd2pFBRiaFlWJI2CRq1ChRnC7AuDRQzJsJ
186      PBxB6tQJ0qMeDtyYEThpRgMfgggVKjQo0I8HLigJ1MMCQgcnWLJkqfLEQ4QUeQTaacEBhAkiS5YM
187      KfFhA4o6AtvksBBCiBElSYoAEVEBBxyBaeZoCIKkyRQpTI6coEBnjcADcW6M8MLlihUqXUjYkKNg
188      4Jg+NaB8CgXKU5QXfsokFPBlT6ItfwBpQcQHDAGFABaEubOIER4yDAJQFCigAIIEBgbsHk4xIAA7
189    }
190  }
191 
192  if { [ lsearch [ image names ] database_refresh_32 ] == -1 } {
193    image create photo database_refresh_32 -data {
194      R0lGODlhIAAgAOf/ADRnADpsADpyAD53AEJ6BD18ADd/AEV7ADmAADKDADqBADuDAD2EAESCAD+G
195      AmtvckeFA0GHBUOJAGtzekaLAHJyh0iNAE6MD0qPAFWRB1uKO1SWAF6RM36Dhl2ZFWeUPn6GjnyI
196      iFihAIGFoIGIkGChAGWfEX2MkoeHqW6YUIWNlYOPkG2hIoePloiQmHWlAHylAJCQpnKqAHSiS46S
197      oXGkRW+kTIyUm4aWnHmlSIGqBIKrAH6tAIuaoXisLnSyAH2pS5KaonyqU4KxAJScpJWdpZaeppCg
198      pnq4AIOtY4OvUZigqIG4BX26AJmhqYKyRZmgtZOjqZmzAIurgpujq4G+AJ22AITAAJ28BKKqspS0
199      eZrAAKCsuYTHAJXCAKOstJHEAKSttZjEAKautpq0n57DAJa+Up22j47FK5rGAKSwvpvIAJ3JAK2x
200      wKqzu6qyx5/DQJnMBKK7k6HMAK+zz5zOAKHNDJ7QAKjEYaTPAJnTAKPPEqDSAK66x5XWAKHTAKy/
201      q7O7w7HLOrS70Z7XAK3RGafTGLHQKLa/x7jAyLnByZ/eALrCyrTHs7rC17vDy7zEzL3FzajgAL7G
202      z57lAL/H0L/G3LzI1sbG3cDJ0cHWVq/hLL/L2cLL08LK38PM1MnJ7cTN1azqAMTaWrLkMMbO1sjN
203      3MjM6cLdVMPP3cfP18XcY8TQ3s3N5cjQ2MbfTsnR2svP7MneXsbS4NHQ6MvT3Mjgbs/U18zV3czU
204      6tDU5M3W3tDhcMrjcM7X38rmZM/Y4NDX7c3Z59DZ4djic9LpR9fX79HpUNLa4svobdbjgdPb5Nba
205      6tPb8dTc5drb5dXd5tXmkNTohNbe59ne7tnojNfoktnd+tfg6Nvf797e9dnh6tzg8OTonOLootvj
206      7Nzsltno29zk+t3l7uTj++Hk/9/n8O3sqOPn9+Dp8eTp7OHq8ufvr+fn/+Ps9Orq/+jt8PHys+ru
207      /vXzwuzx9Ory+/Dx++7z9vb2//P4+/T5/PX6/fb7/vj+//7//P///yH+EUNyZWF0ZWQgd2l0aCBH
208      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JFHhkyRInCBMqNHhkoMOH/4xEGZPIFa505jJqzJgO
209      l6tEY5wYgTiwyBhc26ZBQ8aypUuW0KZtQzamCMl/UXbtwlWrp8+fQGvh0hnl5pFxnz6VWsq0qdNS
210      Scc1JFmE37dMjyBBisS1q1etjzJ940fFaKR7++rNVNWprdu2qpBtq5fWFBSjgRJ1QrYOnj59+QIL
211      /gtPHbJPjhJ8uGkkEaNHkTJ1KuXKF7KYyHzhYpWKU6ZLmBjoaEBVESOuk13tAoZsGrZnzJgFy0Wr
212      1SlQDIjpYADxxBjIkimvRoaNWzZhSTIgWK6AAQJlo3iQdqgiyxhFqWtZRpaNnBYPZqL+gStW7Nix
213      YtHEyBoCwWGQdWOIOHETKFInYN2BPLGGqtCePAACmMaAv1jgUA+d0LPOLYy4kQUXXLyRwhPSGBLH
214      HXxkqOEdGDJxwIGJJFIKNPDQww8//YSTQTJ/6KHHFSVQwMCMDBBCSBMDPNSDaVtl8okquDQzAxqb
215      +EFICRecAUgstzEgSRU5PhQEI6fZR5kv2iBAyiKLdHFBLrmY8gloDnQR5UMgjNFjasAIg4AolFAi
216      ghzBzFJKJpFYwsCZaFqHHWW1AAOMcggooEAjxujCSieZ9PHGCP9YQAEFFhj4zw3uxDdffZxkI047
217      77RTzjU1JDAIF06M4c5dLMzTzTnuluLwiYIMOgihGmq08QYdHMDAgCe+jGOPKTQogIc3VlgRa4gj
218      lsjPPtDuw48/SrwQDwP4kJMKGVMw4AM7gmCxQwEC3cBjZD9qx105NrxQTTWFMmcCHNZoskUZll5K
219      JWrCAfOMODnIwIsYthRsMC+rHFJGGhsIMBAOikBmpWr+koPAKwOmYcfGGw+YhxgbEOBQB0EoEpwr
220      texyGcA/8MGhhhn+AYYMFgAA0QQtBJFFII+whs036MgjBBI2MhCBBJNSAEEANw30QAgktNDCCitI
221      HYMGVUhCAQoVNO31TQN0ke/XZDt0wNhlp6322moHBAA7
222    }
223  }
224  if { [ lsearch [ image names ] install_zip_32 ] == -1 } {
225    image create photo install_zip_32 -data {
226      R0lGODlhIAAgAPcAACUmJSYoJikpJyorKD4/PFA0Clg7DEY2Gl0/Ez9BPm5EBmpECXBHCXJJC2VF
227      FWlIF2lJGHROEFdMNWtQJFBRTVpZUlxeWl9iXnpsUn5zXGJnYWlqZ21wbndwY3FybXx3and4dXt8
228      eJ9pEJJkG5hnG5loHKBmCqJoDqJtFKl0HpZpJZZrK4xpMKp1IqFzL698LLF8KaF1MqN4NopvR5F0
229      RJ58RIZ2WaB+SbaBLqmAP7WCNbWDOLuKPcaRP8+WPqWDS7WJRLiLRKeGU66LVK+PXbGPW7eRVrOR
230      WoGDf52Oda6RY7KTYbyZYr2caKuTcMeSQ82WQ8qXSsyaTtObRtSeS8OXUc+cUcacXNCfU9miTs6h
231      XNKiV9mjUdSlXdypW+CsXcOdYMmiZMikbNytZNKqa9uvad2wa9Svddy0ddi0fOGuYOa0Zum5buG1
232      cOa5c+y9dISFg4eJhYuLi52UhZSSiZSVlJeYlZiZl5eZmJydm6idjqukl6Chn6qmnqSlo6appauo
233      o6anqaepqqurqrCtpLOzramtsbS0s7i5t7u8u926hb7BvODAjcDBvvfVoPncr8XFxMfIxsnKx8vM
234      y9LPx8/QzsjL0NTU09fZ09nZ19bY29zc297g3+Dh393e4N/i5uTl4+fo5+nq5+bn6ezs6/Dx7vT0
235      8/n59/f4+P39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
236      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
237      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
238      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
239      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKoAIf8LSUNDUkdC
240      RzEwMTL/AAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVD
241      IHNSR0IAAAAAAAAAAAAAAAEAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
242      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAA
243      AAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAA
244      AlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmll/3cAAAPUAAAAJGx1bWkAAAP4AAAAFG1l
245      YXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAI
246      DHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj
247      AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAA
248      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA
249      81EAAf8AAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAA
250      AAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8v
251      d3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAA
252      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4x
253      IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0L/AAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIu
254      MSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl
255      c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAA
256      AAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAA
257      AAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFY
258      WVog/wAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJz
259      aWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBP
260      AFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA
261      4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
262      AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAv8UAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE
263      Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oD
264      xwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ
265      BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH
266      Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP
267      CWT/CXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvI
268      C+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsO
269      tg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHo
270      EgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV
271      mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kX/64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZ
272      kRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3s
273      HhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i
274      3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN
275      KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last
276      4f8uFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz
277      8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0
278      OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpB
279      rEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
280      SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk3/Sk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EG
281      UVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ
282      uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKc
283      YvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s
284      V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+
285      /3abdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4Co
286      gQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL
287      /IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1
288      l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj
289      5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqv8cqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACw
290      dbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
291      vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbL
292      tsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx
293      2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LxU
294      6Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4
295      qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//ACwAAAAAIAAgAAAI/gBVCRxIEASfO3f4KOQz6A8c
296      ghAjQhxkKtWpi6dSpaqU6FIkDRJDChyUqlQpUidLneqDJA8fSZUsiIwY4qKpmzdTNZJz6FChP5cG
297      zSRIYZLGoxpNcYATJw6eQ4g4cZhpARGkSEiRmmoUyU4FOoUIUcoztE7Ws6kO2cgRBIjbIDp0vBCZ
298      B61GTR8mqHARwwXfGDJkhKkiEtHRjKlQ+ZFgYMGCBpAhM1CgwMgjHiEJQEJ6ycOBAgYQOIDwgPRo
299      CA6OOOoi8kKlVKb6YKBxQwgRJmLOpEmjqHdvRmSgoIhYp6ecRHI6ELkCJgyZMm+iS3/D5k0ZVSlM
300      EIxzqNIlTZDq/mgaBUjJlS5hxnz54oVLlixTpviwMpzg8UmJIE3aJIoUKlSHLKFFFwRusYUVUkTx
301      xIJVpAARIpcgkt8lnoxCyk2kzDECCSV06OGHIpxAUB2bTHLVeCiVMsomo1gygwoqrCDjjDK6UMKD
302      o1xyySagTIJIhZdkssknSbyww5FIIhlECwTBMQkpn3xCyiQCIZJJJpVoAsoeT0DhAxRggunDFFTA
303      YN8lppCC0iEDBWlJJp4AAkV88VFB5xRc4ACRJLDdtAmbg3hSCUyb6EEmFYgmiugYOkB0SGKpkBLK
304      Jpt0cslVlVjixHtcdOqpe2NgZl8psAkqSSSJABKIIYjk0cQatmqMIesYZZRhRhtomDmRRpDAccgg
305      gAgCyCCDBGJDBCzUUMMNPwxxxBEq1BcRIqeM4oddfgQgRyCBHJLIJKAYMlQgm/yhiSkpoWRKJx5U
306      4h0mnIRSykNDqQLCHaeI0h8p+pYySCOl6CuKKZDUS5AkpFB6ZaWg2NEIKKCIAsoGBg9EgSSdYKIx
307      JpVwwskfi4jSSQgVE5SAHYgsskgjjawsSSN/XFByRAEMYPMAAdQ8wMw89+xzRAEBADs=
308    }
309  }
310  if { [ lsearch [ image names ] database_add_32 ] == -1 } {
311    image create photo database_add_32 -data {
312      R0lGODlhIAAgAOfXADpyADx0AD52AEV7ADmAADqBADuCAEKAADyDAD6FAUaEAmtvckeFBEKHAEOI
313      AESJAGtzekaLAEmOAEqPAFuJM0+SAFCTAFOWAFmRIliUDX6Dhl6aF36FjWGYKn+GjnyIiIGIkIKJ
314      kX2MkoSMk4WNlG2eOYOPkIaOlYePlm6hQomRmIqSpouTmoaVm4yUm4eWnI2VnGmwBGSyAHimT4ua
315      oW6zAJGZoZKaom+1AHazAJCbqJObo5ScpHG3AGu5AHK4AJWdpZibt3m3AHO5AJaeppCgpnS6ApGh
316      p5igqHe7AHa7BZmhqXi8AJOjqZqiqnm9AJSkqnq+AJujq368DIDEAKGqsYPGAKKrs4rFAKCsuYTH
317      AKOstIXIAKGtuofFHKSttYfJAKKuvKauto3IAKevt47JAInLAKiwuJLBU5DLAKiwxYvNAJLII6qy
318      upPJJauzu5DMGZvDV6y0vJLNG6m5oK21vZvFXpHSAK+3v6S+qZ7IYbK7w7S9xZ3TMbW+xra/x6XT
319      M7jAyLXBz7nBybrCyrvDy6nVWLzEzK/UWLfJtb3Fzb7Gz8XE3L/H0L/G3MDJ0cHI3sTI2MHK0rTa
320      ZcLL08DM2sPM1MTN1brbbsbO1sfP18TQ3sjQ2MfP5cnR2srS28vT3M/U18/T48zV3cHhiM3U6sXg
321      j83W3s7X38Tji9LW5sjikc/Y4M3Z59DZ4dDY7c7a6MjkmdLa4s/b6tPb5NTc5cvnndTc8tva8tXd
322      5tzb89be59fg6Nvf79jh6dni6trj69vk7N3l7t7m79/n8ODp8eTp7OHq8uXq7eLr8+Ps9Oft7+nu
323      8Ojw+evw8+zx9Orz++7z9vP4+/T5/PX6/fb7/v7//P//////////////////////////////////
324      ////////////////////////////////////////////////////////////////////////////
325      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
326      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JFFgECZIlCBMqNFhkoMOH/4hAEROI06hixDJqzFhs
327      FKdAYpYQgTgQiJhRvnblksWypUuWuXb5kiUGCMl/TU6dGgWqp8+fQEGN0tnkZhFhlixlWsq0qdNM
328      SYU1JAmkGrBHhQ4dUsS1q1ethR4BqybFqKJo1KD9kqWJktu3bjXJ+gWNmjNFUyEe8ROIkqxjzKZN
329      k0a4sGBmxmRZChToyE0igQgVUvSIUiZOqGTFlIVqlCZLjxQdIjRoJNVBhLha5nSKlaxdvFie4vQ5
330      dCFCNkmKEDO58uXWr2PLml1btJwQN0dUETNoNajMsnj5WokKFKdMlBThETPi5o1kZHj+OGmzRxEl
331      VLt+AYudKXSdKkvEIENykwalZ8dCEXpTpb+YM2d0kUV/chQyijHNUEJDfYxlkssyz1RDzYSCTUhN
332      Nc0ss0smgQiiQ32obfWIJZo8p9kunHmUSSWRQOIII0HcZAMhqZn3m2uwycbJJp3Q0QECCCQQgQMQ
333      cUCGiKsBlyNnopQygwRomGKLLavYkQEDDnmwXHOXgXIKS9KtJMsrKVywiiFTxBDDFIjEsgGWAsGg
334      THjjledXeuvJokoeEpDiRQ84WGMNDj14kUoGA71gCX768ecfgF10oQYGcbiRRBKBDnqpG3ooIFAL
335      DT4YoYUVVmMNAZNE0UMPMggqw6rDUWASgUAuhEgZiSZu1gouBfSRhKDAApsEILP+wwKNqt0YnCyw
336      6FIAHFEEG2wUcBTbwiCT2cgajrE1WwAVVEQRhQ+C+iAuFWMUq8EOg0ji3Jey+PJLLrPcUkIMYIAR
337      rqBRUJFvDgcMBIEKO1TBRyGu8QLMMMQE80sviUgwhhn6CuqvGWVcQNICH4CAwgkmmEDCyCegsAIF
338      F6SxRr75rpHGBQLcJLNDAVQgxBp33LGGEBUEMPPPAw0QwdARDAD00UgnnXRAADs=
339    }
340  }
341  if { [ lsearch [ image names ] system_upgrade_32 ] == -1 } {
342    image create photo system_upgrade_32 -data {
343      R0lGODlhIAAgAOf/ACwsNDg2Oi09LSRGHUo7V0BERkNFQh9hETlXM2BdYS17GkB5MGdqeGlqc3Zn
344      jCmJHm9tcTmGJHBtfEuBRXNwf3FyeyKWFAegEnp2hnx2gVOJTECTKSqbGxWkGACwBQ6rE0WYLiuk
345      GkCdMQC1AGOOX4SChgC3AA+zAIKDjAC4AFCbOR+wBwC7AxaxJoWGj4iGihC2Ehi2AGOXZTmpM1ue
346      PSKzHjCtNoyImTGxHUWnSQm/DIiNkB67GpCNnXiaeCi+DSO+HpGSnEW2JFWtTzy5JyPBLJSWkzq+
347      EC3DJZmZo0jAJC7HM3KuZz7EJznFO52eqHG0UT/GNKGeojzHPUPHKpygr6Cgt0zHNZ+kpqOiuVvH
348      LqSkulTKMKWnpIy0iU3NS1PNO6envqqorFLORZeykKaquVnMTGPKQ6mpv1/NPV3ORq6ssIW/cVzP
349      T2HNVa+tsaquvq2vrK2ut5+0pmjOR62txF7TObGuv1/SUZS8kbKwtLCwumjRUZm8mWzSTLK0sbOz
350      vbayw7ezxWzVVbW1v7i1unTWXnnWULq3yG3ZYLW5ybi6t3zVX7m5w6DEoHvWZnXZaHrZW7i8zKzC
351      tL68wLi+wLq+znrcZIDaa8G9z3zeZobacofcX73CxL3B0cbAy4XeZ8LCzL/D0oXfb8bDyMPFwrnM
352      uIficoziZIria8bH0ZDjc5XheorldMjJ08vJzZjidLvRw5PldtHK1p7lcZzld5boeM3O2NDO0sjR
353      zMvQ0pjnhbzXwdDR26LpidbS5KLsftnS3tTU387Y09jW2rnnn6Pwh9Xa3KfxgtzZ3tna5LHyhdvc
354      5rjupdze27Pykt/c7t3e6ODe4rH1juHf49bl2MLwqLX3ieDh6+Ph5eTh8+jh7d3m4ebj6MfyuN7o
355      4r/4oOXm8L77lOnm69D0u+ro7OXq7ejp8+vp7e3q7+Tu6err9u/s8dD9re3v6/Du8vLv9O/x7unz
356      7vTx9u7z9vHz8Pbz+Pj1+vz1//n3+/j69/37//j9//v9+v3//P///yH+EUNyZWF0ZWQgd2l0aCBH
357      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCBP+A+TPHyCFEAXiIvik4ROCEyMOLGTP
358      X6OBSRpiGZjJX75CGv9VaMgPAqVt6jbx2WWNXDNWjLw5SPnvVj9++/w9SuPrGbJly66Ja1dLC8Fi
359      ClHwy1ePyKhTqU7JkmULGLCj4CIJhEWroBxKAsXks3cvBKRBhhJd0nS11VZbtozBkjUNVcFu9saJ
360      sQdvnwg3Y9S0WYwkRQoWURJd1cqVE0FA99i9g8cOnqMZUZxM+QLEhIcLHVawiEEF06VLoEaJJeji
361      XDp06PApWFKkiBPHDw4MEIAgApEfTRgpZ3TIIIB048rFssCDBxAeKTgQDEBgQ5MjV/j+iPdjMMi4
362      budk1IABg0eMGgYXcFFyxYx9M2cMAsJGbduEGh7EEIMJOBhkRxp00KFGGlQcocRAr5BCSS/MMBOM
363      Bi14YIIJLBwkhAggqCAiDVCwMYtAmdyiTDQVBkOCDQPG0OFBGfTwyS/QaAPNL54IhMYWWWxRRyCu
364      +DCECRBJsYcqgdwRRpBoCIQBBRJY8aQkczDxAURydNJIFmFYIQEFGBR0w49oUONFDgoZ4YozZWyB
365      xg0IMVAHGmikM0keClUijDlloFEHAwgl0GQgntDDSx8IURKOPZ4cmsBBhCByhyWKSMKMOtWYQgZB
366      ceCSzjzKSKKIJXcgQkhBVaBxRyCyosQaCjbycMPNMLnockw65dyTTSixitIkGlUUlCocDQijyi0q
367      xlOPOdCyY489yjCrijANwGGpQQ00IFAF0fQiTDLJUGNOPPCkQw25xPQSTQUCdQtRCdRkI0023Yyj
368      73n2ZkNNCTz9Q0y588DjzsEIwzPPusTwtEa57xiwQynu1FOPO6XsUMA7676R0gvJCDZQFxZ3MZAY
369      5STzQsB6EPRHPPH8QVDLARu0iD76LFLzzhAFBAA7
370    }
371  }
372  if { [ lsearch [ image names ] package_down_16 ] == -1 } {
373    image create photo package_down_16 -data {
374      R0lGODlhEAAQAPcAADJwKjZ6MUFqIkNsJ0ZvJkBvK096LVyAPUePQEuPQUqMRUuNRk2PSFeNQ1CS
375      S1WaTleZUVejTlikT2a2XGi4XWytZXysZ22+Yny/dnDCZXLFZnPGZ3THaH7AecODIsOEI8CFJcSF
376      JMWHJsaKKMeNK8iPLcmQLsmSL8iVMsuVMsyYNMiUO86dOd6fMtGkP+KqN+KpOOOrOua0Pea1P+y2
377      OOm1PcqQStCXU9KlQNOoQtSqRNWsRdWtR9awSdewSteyS9iyS9i0TNi0Tdm1Tdm1Ttm3T9WmUdqt
378      UNuxVuGnQOa1QuaxR+i+Q+m9ReSxTOi/SOi7T/W9QOWvVtuyYt25ada4cNy9d+a2a+W/b+SzdIDB
379      eoLCfYXDfuzFR/nESOHAcuDAfeDGfvXPf//Vd/XQePXQf/7WeIfFgZHKiZPLjJ3QlaDSl6nXoKvY
380      otvDidfTj97JlezFg+7Eg+3Gh+zKhOvMhOfMiO7KiPHPhvvchPfViffXi/DQjOXPku3SkurVnPHV
381      kPXXkPLWlf7flfjbnf/hm+3ZpfLdr+3evv/kpfnhqvrjqv/oq/fksvrksP/qs//ptv/rt/blv//q
382      uf/ruv/rvf/tvv/uwf/vwfvty//vyPnrzfrszv/wyf/yzvXr0vfu0f/z1P/z1f/01//12f/02v/2
383      2//23fz24v324v724/744f344vz45v775//+8P//9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
384      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
385      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
386      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
387      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAALEALAAAAAAQABAA
388      AAjnAGMJHBgLiA+CCAcK+fHHzg4dCQcG6dNK1aFGX1wkJBIGFKxXmY7sUSRoCguBRYYY+oQIjpsq
389      VAKJIbSIjpEUQlZt8lMHC5IVnEhNGjQmUZ4TP1iFcoSnDBknjiAVMhOlBqASPVKVElVJD4cNGS54
390      ofEECh8SPFCN8qSJkoY2bCh0aaJkyZ0ROlCF6mTp0YQ1aiQwmREjSRwROVydwhSJUYQ0aBDIgNHi
391      ipwQOKxIMnXpzYMzXAK8kDIniw0PAlmAsZCgwhYtDgAcuPEBoQoUDSB0wLCgAIjaEU0YYKBgQIiI
392      CAkIiBgQADs=
393    }
394  }
[2c0158d]395  if { [ lsearch [ image names ] system_software_update_16 ] == -1 } {
396    image create photo system_software_update_16 -data {
397      R0lGODlhEAAQAPcAANpuFd5uFtVwFd1xFedyFedyFul7Fel8FuBxGOd2H+Z6G+l+G99yJ9x/IOBz
398      JeZ6Ieh7JOJ3LeJ4K+h/Leh7Meh7Muh8Mul+P+R/QOh/QcmBGM2GGd+AGt2LHdiRG9qTHN+YHd+a
399      HuWAH+CPHeOMH+iHJuyMJ+uOK+qdKOiCPOiFPuqOOuuOO+2WPeycPe2hLO+kP/CtPueGR+mCROmL
400      SuqMS+mMTOuOT+OZQeqRSOuSS+qQTuyZTueLU+mQVeqRVeybVeuTWO6qTvCwQvK3T/K4UuuQYeiS
401      YOuSY+uUYeqYZ+ued++oYOuheu6meeuhfO6kfvC1cvG3ffPCeu2mgO6ngO+uhe6ujfK9hfC1jO2s
402      kO+ukO2uku+xlO6xl+6ymPG6kPK+lfK/lvC4nvC5oPK+ovK/ovG9pfG9pvG9p/XJiPPAkPXJnPbO
403      nfXMoPTGq/LDrvTKr/TLsfjetfbWufbUuvbUvPbWvPbVvvfavfjevfnhu/bVxfbYwvjexPbXyPbW
404      yfbXyffZyPbZzffe0frmyfrny/jj1fji1vji1/nm1vjg2Pjh2fjl2vnk2/rp2frr2frs2/no4fvu
405      5Pz08AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
406      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
407      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
408      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
409      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
410      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJUALAAAAAAQABAA
411      AAjJACsJHEiwoMFKWrx84XJw4JItY9CkIdPlycEjVM4AWsRoEJwrTQpiUFLGUaM/fBJJCmSmB0EZ
412      VhAJqoLECBRClOT4GMjARpxDTmZcyJDkjZ0sNCIIdLCjD54bFihUSFEjyA8VEgQGeJBDx4QEBQgQ
413      gACmTg4EAgEoABJGDI8FBg6wuENnxYCBIqRMUsTkhIkWax5hKSFgYIMoeiL5ccMmD6Q2LjgUxCFk
414      ypxChvaogUHiYAcUMYgUGfJiRMNKGjyACPFhw+nXAgMCADs=
[5b6b63c]415    }
416  }
417  if { [ lsearch [ image names ] check_green_16 ] == -1 } {
418    image create photo check_green_16 -data {
419      R0lGODlhEAAQAPYAAACVAACWAACXAACYAACZAAKaAgOaAwecBwidCAmdCA6gDQ+gDhCgDxOgERWj
420      ExymGiSlISirJSqsJCqsJi+uKzCvLDKvLzayMTeyMjixNDy1Nz21OD61OT+1O0C2O0O1P0O4PUS4
421      PkW4P0m2REe5Qki7Q0q7REu7RlC+SlG6TFK6TF3CV17EWGjLWm3FZmnJYm7JZ3LMZnnNb3TQbHjU
422      a3vPcHrTcoDTdYDUeYXWeYbQfoXUfYfeeojeeovaf43VhY/VhY7WhonYgozdgI/dhJDXh5Peh5HV
423      iJHWiZLWiZLaiZPaiZbdjJTfjJnbkJ3elJHmhJTkh5rljpnikJ/ml57rkZ/qkqDgl6HgmKHimKbl
424      nKjmn6XsmajqnanvnanmoKnooKzroazoo6zuoK7qpbHtp7LsqLPtqbLuqbfzrLnzr7zzsr/1tQAA
425      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
426      BAEAAG0ALAAAAAAQABAAAAeZgG2Cg4SCBQgLhYptBSouKQ+LgwYfRzJIEpKCDD8xMUUTmgkwSy1P
427      KxSaFlc0TDsVmgtKRkNZHoIAECMNBJssWj1kLxeCATpAQRYHbRFiUWFNGIMCSTU3VyQOQl1WZSWE
428      AxlOOT5bOGdVazMahQUdWEQ8ZlxpVBuLCidfUlBeaiiaHmwAM4aNDRCa2kwwgWZKiISCMHAQISkQ
429      ADs=
430    }
431  }
432  if { [ lsearch [ image names ] cdr_tick_16 ] == -1 } {
433    image create photo cdr_tick_16 -data {
434      R0lGODlhEAAQAPZ2ADd7MTh8Mph/Mpl/Mpp/MjqUMECFOWuPPUijPFWcTVKtQ1ymUlyjVGuqXGC1
435      UGi3XmyyYnS5ZZmAMo2vZo6waY+ya5Czb821b861cM63cs+3cs+3c9C4ddC4dtC5dtC5d9G6edK8
436      fdO9f4HKdoPJeILLeIbJeYXLeYXIeoXJeofMe4bMfIfNfInNfYnOfovPf9S+gNS/gtW/g43PgZDS
437      hK/LlcDAhdbAhdnGjtnGj9nGkNrHkdvJldzKltzKl93Mmt7NnN7NneTWruTXsObZs+batebatufb
438      t+fbuOfduujduujdvOnevtPhvurgwOvhwuvixezixOzixezjx+3jyO3kyu7lzO7mzO/mze/mzu/n
439      z/Dp1PHq1fHr1/Lr1vLr1/Lr2PTv3vXv3/Xw4fXx4vby5Pfz5vj16vn27Pn27fn37fv48fz69Pz6
440      9fz69vz79v379/37+P78+v79+/7+/P///v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
441      BAEAAHcALAAAAAAQABAAAAfMgHeCg4SFhjxOXGRgPgSOhR9zYjg/WHN1cx+PdwQfa3ZwITJedm5v
442      dpqDXzdbdj0ZY3NncnRzjgQ+QSAdUFlDYWpncWxtjQRMMCAePSKOMW1lXVJMjlEcHyBFtwRXQDoU
443      DQcEURsYF0fbTzsTECgJBEsaFzlbMY4iRBYQMy8GuEZWzIRp8qAGkgoQWrAIQEDQnDRfpkQwscCG
444      gxUnGDbshEaLEgU0UkAgUSLABwmEPoyhIgSBCxUjTG4ixCNJlQIMGAowRGgAAQANCQUCADs=
445    }
446  }
447  if { [ lsearch [ image names ] database_1_16 ] == -1 } {
448    image create photo database_1_16 -data {
449      R0lGODlhEAAQAPeLAEdHR0dHSEtMTEtMTU1OTlNUVFRVVVZYWFdYWGFjY2JjY2JkZGNkZGVlZWRn
450      Z2VnZ2hoaGhpaWttbW5vb29xcXN1dXV3d3Z2eHh5eXl5eXh6enl6enp6en19f3x+fn6AgICCgoGD
451      g4mLi4qKjI6Ojo6OkJGRkZGRk5OUlJSUlZSUlpSVlpWWlpaXl5iXl5aXmJeYmJeYmZmYmJmampqb
452      m5ydnZycn5+fn6CgoKCgoqGioqCjo6Smpqeoqautraytrq2urq2vr66vr66wr62vsLCxsbCysrGy
453      s7Gzs7Kzs7GztLKztbK0tbO1trS1tbW1tbS1trW2trW2t7W3t7e3ura4uLe4uLe6uri4ubm7u7q7
454      u7u7vru8vr29vb6/wb6/wr/AwMLCwsPDxMXFxcXGxsXGx8bGxsXFyMbHycjIycjJysvKysvLy8rL
455      zcvLzcvNzcvMzs3Nz8/Ozs7Oz8/Pz8/Q0tHR0tLS1NfX19bX2Nvb29vc3Nzc3Nzd3d3e3t/f39/g
456      4Ofn5/Dx8fX19vj4+fn5+fz8+/v8/Pz9/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
457      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
458      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
459      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
460      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
461      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
462      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIwALAAAAAAQABAA
463      AAjOABkJHEiwYEEyRnYg0fPnzRWDc+7YiaOmjBUtZNjIWUOQyZYveQQFamFBBI8xWQhCoYJmkKE9
464      QT4kqFBkCsEmXNoQStTHx4cFGKI4IRjjgoo0fMzMmICAQQYZBInYGJGiBokGAgpMuHGEoJQtbggh
465      2gMkxIMNTqoQVLIFDiFFfoD8xPAkCcEXF06IwROGhYQDCji4ILgkRwkYOExAIGCAgg6bA3t4aVOI
466      pxCzGqz8ILjiTJ1DiwANAeHAAxgaBQN0wEKnC4oIAwQAMEjbYEAAOw==
467    }
468  }
469  if { [ lsearch [ image names ] back_to_ou_16 ] == -1 } {
470    image create photo back_to_ou_16 -data {
471      R0lGODlhEAAQAPYAALRmJ33VJtuPGd+aHeGhHt+bL+WwKuaxPOe4PYnVPu3UAO3VE+3QF+7VHPDb
472      KvDYL/HdN8+kU+m9Q82nYt62Ztq1aeewY+K1dY3cQJDXSpXdUZvdW4jCZZHJaJbObu7PR+zJS/Hd
473      QezHU/DYVPLgTPPiWfPjWfPfZmZ3mHiGq3aIsH+Pt6u816Kx3LPA4b/P4r3F9L3G9s7Pzs/Pz8/S
474      18/T19LX3dLY39jY2Nvb29zc3N3d3cHM48vZ68vb79LY4Nba4NPV8dPZ+ePj4+np6ert/PHx8QAA
475      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
476      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
477      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
478      BAEAAEcALAAAAAAQABAAAAd8gEeCg4SFhR8RLIoshoIDBw8MFT0+Pi+GCCQQDgoNF0VFPIUEJiUg
479      IQsUQUJCLoUSJwJHIxMwMbcthQYiggUqKykrKyiGFo3HRwDIy8xAPz80RzY3NzVHHhwcHYJERkY5
480      R0PeOkcbGBgagjtDQzNHOOwyRxkBAQnM+Pn5gQA7
481    }
482  }
[633537f]483
484  if { [ lsearch [ image names ] folder_yellow_16 ] == -1 } {
485    image create photo folder_yellow_16 -data {
486      R0lGODlhEAAQAPYAAK+KGLGMGLOOGbKNGrKMG7OMG7OOG7SOGbSPGbWPH7SQGaOFI8GLNMmJN8Se
487      MMSXOcSfO9eQOuOePN6xLcOhN8WgNMahNcehNcmjNMijN8mmNcukN8ulN8umNsumN8KgOMeiOMei
488      OcemPMekPselPsemPtGnN9uqNeG9K+K4LeO/LOS8LeW/LeytO/G5OeTALPTHN/XMNvTBOffQNcun
489      QtGtQtCuSd6+Q922Sum8S/TCTvjETvjITvjOTe/USO7USfrTTfzaS/veTPzgTPzkTfzmUfvpXd3A
490      ZurTg/rrhvLgl/nrqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
491      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
492      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
493      BAEAAEwALAAAAAAQABAAAAeSgEyCg4SFhoeGBwgICgGIggYTKSssAgqXlwiEAC4yMDEzKi8vKioo
494      A4MALScYGxwesLAdFRcgTAASJj9GSUu+v0tKFkwEERlCREW8wEtIIUwFDTVAQUPJy75HggUMODw9
495      1NbKvTbbDzk7O9/h1w7bEDrp6evVPhqCCTTy++s3gwsfSJQoQWIEiYIjRFB4xLAhoUAAOw==
496    }
497  }
[2c0158d]498  if { [ lsearch [ image names ] software_update_urgent_16 ] == -1 } {
499    image create photo software_update_urgent_16 -data {
500      R0lGODlhEAAQAPYAAHgXF6wiIqUtLa8vL7AjI+EXF+AZGeIaGuUdHdQoKNUpKdYrK9ctLdcvL8ox
501      Mco5OdgxMdg1Ndg2Ntk/P+giIu4nJ+gqKu4oKO4qKustLewxMe8wMO8zM+80NO44OO84OOk+PvA6
502      OvA7O/A8PPA+PsFCQshHR9hTU95YWOpHR+5FRe9FRetISOxKSvBCQvBDQ/BERPFGRvFMTOtSUuVe
503      Xu9YWPBQUPBTU/JWVvNbW/JcXPNcXPJeXvNeXulhYfR8fPV+fvR/f+mAgOqFhfWAgPjR0fjV1fzY
504      2Pje3vzf3/zn5/rq6vzu7v309P729v34+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
505      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
506      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
507      BAEAAFAALAAAAAAQABAAAAdzgFCCg4SFhoeIEIIFBoiDDRUHT08WUAmIkAhLTBoVCokXFEhKHRUL
508      iBIbGUZJHBgMhg8TKSEeRUcfHCARDoUzMC8uQUQkIyIshgE1MipCQysxNgSHAjwtTU43OAOOJT0/
509      QDomjoInOzko5IM0PuqEAO7qgQA7
510    }
511  }
512  if { [ lsearch [ image names ] view_refresh_16 ] == -1 } {
513    image create photo view_refresh_16 -data {
514      R0lGODlhEAAQAPeiAChAYClBYipDZSxIbixIby9LcS9Mcy9MdC9NdS9NdjBMcjBMczZSdzZSeDZS
515      eTZTeTdTeTdTejdUelBtlVBtllFvl1BvmFFvmFJvmFRxmFVymSxtxCltyC1wyyxwzDJxxjZzxzZ0
516      xjZ1yz56yzl5zj580EB+0GqJs2uJs2uLtmyLt22MuHCPuHKQunWTu0eBzkiAzEyCzE6DzEyDzk+F
517      zU+Fz0mD0U2H00yG1E+I1FGI1FGJ1FOL1VSL1FSL1VWM1VuN0FmO11mP11qP11yQ11+S2GaV1WuY
518      1GCT2GOV2WSW2WWW2WqZ2Wqa22yb222c23Ce3Hih13Wg2nSh3XWh3Xai3nih2Xih2n6l2Xmj3Xij
519      3nmk3nmk332n34ekzYqnzoem0Iin0Iin0Y6q0Yqv35Ov1ZWx1p643J+53YCp4Ias4Yiu4o2x446z
520      45a24Ze45p664J+74Zi55py75J6+55++56O94KO94aC84qK+46e/4KC+5qS/5KTA5afB5KjB4ajB
521      463F5qTB6afE6ajE6avG6qvG667H6a3H667I67HI57LJ6LXN7bfO7rjP7r/U78DU78fX7cLV8Mja
522      8cnb8svc8szc8tvn9uDq+OHr+OLr+Pf6/fj6/fr7/Pv8/v39/f7+/v7+/////wAAAAAAAAAAAAAA
523      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
524      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
525      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
526      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
527      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKMALAAAAAAQABAA
528      AAjyAEcJFKggwYIFCRQMXCgQQosyihaZcRGB4SgEGPy0odLkSZc3gTQgWFiBUBIfVBIN4rIEyqEM
529      AyHkIXJDUihRojxNKsIEkINRClakKdRIFCU5dSqJEqSDDIuCYoZcEpXpyRQtUxA56mFkjEE+JiBx
530      srSmiZMmStgwmfHnIJ8SPnDsEFIEiRpMoubA0IMwDA8Siejk4PEjiKZPkYB8Sagii4c1ohhV2fII
531      lJsjWFAolBDHRgdDm3B26vNBBpoHAy/secFBhJQrIzbEwDNh4QELcKzUABGCRpQzFAwwFNAgBZg7
532      drycYBDAosAABAoUGACAYUAAOw==
533    }
534  }
[5b6b63c]535}
536
537source [ file join $::TolPkgGUI::cwd tolpkg.tcl ]
538
[2d896ea]539proc ::TolPkgGUI::CmpVersion { v1 v2 } {
[5b6b63c]540  foreach { v11 v12 } { {} {} } break
541  foreach { n1 v11 v12 } [ split $v1 . ] break
542  foreach { v21 v22 } { {} {} } break
543  foreach { n2 v21 v22 } [ split $v2 . ] break
544  set cmp [ string compare $n1 $n2 ]
545  if { $cmp } {
546    return $cmp
547  } else {
[2d896ea]548    return [ expr { $v11 < $v21 ? -1 : ( $v11 > $v21 ? 1 : ( $v12 < $v22 ? -1 : ( $v12 > $v22 ? 1 : 0 ) ) ) } ]
[5b6b63c]549  }
550}
551
[567b369]552proc ::TolPkgGUI::lsearchi { i l it } {
553  set _i 0
554  foreach _it $l {
555    if { $it eq [ lindex $_it $i ] } {
556      return $_i
557    }
558  }
559  return -1
560}
561
[e83ccac]562proc ::TolPkgGUI::ReadPackSyncInfo { } {
563  variable packSyncInfo
564
565  array unset packSyncInfo
566  foreach p [ ::TolPkg::GetPkgSyncInfo ] {
567    array set packSyncInfo $p
568  }
569}
570
571proc ::TolPkgGUI::ReadVersSyncInfo { } {
572  variable versSyncInfo
573
574  array unset versSyncInfo
575  foreach p [ ::TolPkg::GetVersSyncInfo ] {
576    array set versSyncInfo $p
577  }
578}
579
580proc ::TolPkgGUI::ReadLocalVersionInfo { } {
581  variable localVersionInfo
582
583  array unset localVersionInfo
584  foreach pv [ ::TolPkg::GetLocalPackages ] {
585    array set localVersionInfo $pv
586  }
587}
588
[633537f]589proc ::TolPkgGUI::GetRepoId { url } {
590  variable urlmap
591
592  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
593                   $url : "${url}repository.php" } ]
594  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ] 
595
596  return $repo
597}
598
[e4c69c1]599proc ::TolPkgGUI::GetPkgNode { T url p } {
600  variable urlmap
[e83ccac]601  variable treeParents
602  variable nodesInfo
603  variable packSyncInfo
604
605  if { [ info exists treeParents($p) ] } {
606    return treeParents($p)
607  }
[e4c69c1]608  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
609                   $url : "${url}repository.php" } ]
[633537f]610  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ]
[e83ccac]611  if { [ info exists packSyncInfo($p) ] } {
612    array set packSync $packSyncInfo($p)
613    set lastlocal $packSync(lastlocal)
614    set lastremote $packSync(lastremote)
615    if { $lastlocal eq "" } {
616      set img "package_down_16"
617      set nodeStatus new
[2c0158d]618      set statusLabel [ mc "new (%s)" $lastremote ]
[e83ccac]619    } else {
620      set idx [ CmpVersion $lastremote $lastlocal ]
621      if { $idx <= 0 } {
622        # could be -1 (because of date error)
623        set img "cdr_tick_16"
624        set nodeStatus ok
[2c0158d]625        set statusLabel [ mc "ok" ]
[e83ccac]626      } else {
627        puts "$lastremote > $lastlocal"
[2c0158d]628        set img "system_software_update_16"
[e83ccac]629        set nodeStatus upgrade
[2c0158d]630        set statusLabel [ mc "upgrade (%s)" $lastremote ]
[e83ccac]631      }
632    }
633  } else {
634    set img ""
635    set nodeStatus unknown
[2c0158d]636    set statusLabel [ mc "unknown" ]
637  }
638  set nid [ $T insert [ list [ list $img $p ] [ list $statusLabel ] \
639                            [ list $repo ] ] -at end -relative root \
640                -button auto ]
641  set treeParents($p) $nid
642  set nodesInfo($nid,type) pkg
643  set nodesInfo($nid,status) $nodeStatus
644  foreach st {new ok update upgrade unknown} {
645    set nodesInfo($nid,children,$st) 0
646  }
[455a6d5]647  lappend nodesInfo($nodeStatus) $treeParents($p)
[e83ccac]648}
649
[5b6b63c]650proc ::TolPkgGUI::FillTreeInfo { T } {
[e83ccac]651  variable packSyncInfo
652  variable versSyncInfo
[5b6b63c]653  variable localVersionInfo
654  variable treeParents
[00c4270]655  variable nodesInfo
[e83ccac]656  variable localMostRecent
657
658  array unset treeParents
659  array unset nodesInfo
660  ReadPackSyncInfo
661  ReadVersSyncInfo
662  ReadLocalVersionInfo
[5b6b63c]663
664  $T configure -table no -filter yes -columns {
665    { {image text} -tags NAME -label "Name" }
[e83ccac]666    { {text} -tags STATUS -label "Status" }
[e4c69c1]667    { {text} -tags REPO -label "Repository" }
[5b6b63c]668  }
669
670  # insert package information
[e83ccac]671  foreach p [ lsort [ array names packSyncInfo ] ] {
672    array unset pkg
673    array set pkg $packSyncInfo($p)
674    set url $pkg(url)
675    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
676                         $url : "${url}repository.php" } ]
677    GetPkgNode $T $pkgRepo $p
678  }
679 
680  set localVersionNames [ lsort -decreasing -command ::TolPkgGUI::CmpVersion \
681                              [ array names localVersionInfo ] ]
682
683  array unset localMostRecent
684  # insert version information
685  foreach pv $localVersionNames {
686    array unset pkg
687    array set pkg $localVersionInfo($pv)
688    set pkgRoot [ lindex [ split $pv . ] 0 ]
689    set url $pkg(_.autodoc.url)
690    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
691                         $url : "${url}repository.php" } ]
692    GetPkgNode $T $pkgRepo $pkgRoot
693
694    if { ![ info exists localMostRecent($pkgRoot) ] } {
695      # will be used in contextual menu
696      set localMostRecent($pkgRoot) $pv
697    }
698    if { [ info exists versSyncInfo($pv) ] } {
699      array set versSync $versSyncInfo($pv)
700      set dateremote $versSync(dateremote)
701      set datelocal $versSync(datelocal)
702      if { $datelocal eq "TheBegin" } {
[5b6b63c]703        set img "package_down_16"
[00c4270]704        set nodeStatus new
[2c0158d]705        set statusLabel [ mc "new" ]
[5b6b63c]706      } else {
[e83ccac]707        set idx [ string compare $dateremote $datelocal ]
[00c4270]708        if { $idx <= 0 } {
709          # could be -1 (because of date error)
710          set img "cdr_tick_16"
711          set nodeStatus ok
[2c0158d]712          set statusLabel [ mc "ok" ]
[00c4270]713        } else {
[acc9f1a]714          puts "$pv OUTDATED : $dateremote > $datelocal"
[2c0158d]715          set img "view_refresh_16"
[e83ccac]716          set nodeStatus update
[2c0158d]717          set statusLabel [ mc "update" ]
[00c4270]718        }
[5b6b63c]719      }
720    } else {
[e83ccac]721      set img ""
722      set nodeStatus unknown
[2c0158d]723      set statusLabel [ mc "unknown" ]
[5b6b63c]724    }
[633537f]725    set repo [ GetRepoId $pkgRepo ]
[2c0158d]726    set parent $treeParents($pkgRoot)
[633537f]727    set nid [ $T insert [ list [ list $img $pv ] [ list $statusLabel ] [ list $repo ] ] \
[2c0158d]728                  -at end -relative $parent -button auto ]
[00c4270]729    set nodesInfo($nid,type) pkgver
730    set nodesInfo($nid,status) $nodeStatus
[2c0158d]731    incr nodesInfo($parent,children,$nodeStatus)
732    if { $nodeStatus eq "update" } {
733      if { $nodesInfo($parent,status) ne "update" } {
734        if { $nodesInfo($parent,status) eq "upgrade" } {
735          set nodesInfo($parent,status) "upgupd"
736          $T itemcolumn $parent NAME {image "software_update_urgent_16"}
737          set txtUpgrade [ lindex [ lindex [ $T itemcolumn $parent STATUS text ] 0 ] 1 ]
738          $T itemcolumn $parent STATUS \
739              [ list text [ mc "update/%s" $txtUpgrade ] ]
740        } elseif { $nodesInfo($parent,status) ne "upgupd"} {
[b83b8ed3]741          set nodesInfo($parent,status) "update"
[2c0158d]742          $T itemcolumn $parent NAME {image "view_refresh_16"}
743          $T itemcolumn $parent STATUS [list text [ mc "update" ] ]
744        }
745      }
746    }
[455a6d5]747    lappend nodesInfo($nodeStatus) $nid
[e83ccac]748    foreach {{} d} $pkg(_.autodoc.dependencies) {
749      set _nid [ $T insert [ list [ list back_to_ou_16 $d ] ] \
[00c4270]750                    -at end -relative $nid -button no ]
[e83ccac]751      set nodesInfo($_nid,type) pkgdep
[5b6b63c]752    }
753  }
754}
755
[e4c69c1]756proc ::TolPkgGUI::CreateTreeWidget { t } {
757  variable tree $t
[5b6b63c]758
[e4c69c1]759  wtree $t
760  grid $t -row 1 -column 0 -sticky "snew"
761  set f [ winfo parent $t ]
[5b6b63c]762  grid rowconfigure $f 1 -weight 1
763  grid columnconfigure $f 0 -weight 1
764}
765
[e4c69c1]766proc ::TolPkgGUI::CreateTree { t } {
[5b6b63c]767  variable widgets
768
[e4c69c1]769  CreateTreeWidget $t
[5b6b63c]770
[e4c69c1]771  menu $t.cmenu -tearoff 0 \
772      -postcommand [ list ::TolPkgGUI::PostContextMenu $t $t.cmenu ]
773  $t configure -contextmenu $t.cmenu
[00c4270]774}
775
[455a6d5]776proc ::TolPkgGUI::EntryState { listName } {
777  upvar $listName v
778
779  if { [ info exists v ] && [ llength $v ] } {
780    return "normal"
781  } else {
782    return "disabled"
783  }
784}
785
[00c4270]786proc ::TolPkgGUI::PostContextMenu { T w } {
787  variable nodesInfo
[e83ccac]788  variable packSyncInfo
789  variable versSyncInfo
[2d896ea]790  variable localVersionInfo
[e83ccac]791  variable localMostRecent
[00c4270]792
793  $w delete 0 end
794  array set selectionInfo {
795    repo   ""
796    pkg    ""
797    pkgver ""
798  }
799  foreach nid [ $T selection get ] {
800    lappend selectionInfo($nodesInfo($nid,type)) $nid
801  }
[2c0158d]802  $w add command  -label [ mc "Add New Repository" ]... \
[00c4270]803      -command ::TolPkgGUI::AddNewRepository
804  set lenRepo [ llength $selectionInfo(repo) ]
805  if { $lenRepo } {
[2c0158d]806    $w add cascade  -label [ mc "Check Repository" ] \
[00c4270]807        -menu $w.check
808    if { [ winfo exists $w.check ] } {
809      $w.check delete 0 end
810    } else {
811      menu $w.check -tearoff 0
812    }
813    if { $lenRepo > 1 } {
814      set labelCheck [ mc "Selected" ]
815    } else {
816      set labelCheck [ $T item text [ lindex $selectionInfo(repo) 0 ] 0 ]
817    }
818    $w.check add command -label $labelCheck \
819        -command "::TolPkgGUI::CheckRepository $labelCheck $lenRepo"
820    $w.check add command -label [ mc "All" ] \
821        -command "::TolPkgGUI::CheckRepository ALL -1"
822  }
823  $w add command -label [ mc "Sync with servers" ] \
824      -command "::TolPkgGUI::SyncServers"
[2d896ea]825  # preprocess selection of packages
[567b369]826  # list of new packages available
[2d896ea]827  set listNEW {}
[567b369]828  # list of package to remove including all installed versions
829  set listDEL {}
830  # list of individual package selected to remove
831  set listDEL0 {}
832  # list of packages selected needing update
[2d896ea]833  set listUPD {}
[567b369]834  # list of packages selected needing upgrade
[2d896ea]835  set listUPG {}
[567b369]836  # list of packages selected that can be exported 
[2d896ea]837  set listEXP {}
838 
839  # process first the list of pkg
840  foreach nid $selectionInfo(pkg) {
841    set pkg [ $T item text $nid 0 ]
[567b369]842    if { $nodesInfo($nid,status) ne "new" } {
843      lappend listDEL [ list $pkg $nid ]
844    }
[2d896ea]845    array unset pkgInfo
[e83ccac]846    if { [ info exists packSyncInfo($pkg) ] } {
847      array set pkgInfo $packSyncInfo($pkg)
848    } else {
849      set pkgInfo(lastremote) $localMostRecent($pkg)
850    }
[2d896ea]851    switch -exact $nodesInfo($nid,status) {
852      "new" {
[633537f]853        lappend listNEW [ list $pkgInfo(lastremote) $nid ]
[2d896ea]854      }
[2c0158d]855      "upgrade" -
856      "update" -
857      "upgupd" {
858        if { $nodesInfo($nid,status) eq "upgrade" ||
859             $nodesInfo($nid,status) eq "upgupd" } {
860          lappend listUPG [ list $pkg $nid ]
861        }
862        if { $nodesInfo($nid,status) eq "update" ||
863             $nodesInfo($nid,status) eq "upgupd" } {
864          foreach chId [ $T item children $nid ] {
865            if { $nodesInfo($chId,status) eq "update" } {
866              lappend listUPD [ list [ $T item text $chId 0 ] $chId ]
867            }
868          }
869        }
870      }
[2d896ea]871      "ok" {
872      }
[e83ccac]873      "unknown" {
874      }
[2d896ea]875      default {
[2c0158d]876        puts "unexpected status $nodesInfo($nid,status) for pkg $pkg"
[2d896ea]877      }
878    }
[567b369]879    foreach chId [ $T item children $nid ] {
880      lappend listDEL0 [ list [ $T item text $chId 0 ] $chId ]
881    }
[633537f]882    lappend listEXP [ list $pkgInfo(lastremote) $nodesInfo($nid,status) $nid ]
[2d896ea]883  }
884  # next process the list of pkgver
885  foreach nid $selectionInfo(pkgver) {
886    set pkg [ $T item text $nid 0 ]
887    switch -exact $nodesInfo($nid,status) {
888      "new" {
[567b369]889        puts "OJO: he encontrado un estado new en un pkgver $pkg"
890        if { [ lsearchi 0 $listNEW $pkg ] == -1 } {
[633537f]891          lappend listNEW [ list $pkg $nid ]
[00c4270]892        }
893      }
[2d896ea]894      "update" {
[567b369]895        if { [ lsearchi 0 $listUPD $pkg ] == -1 } {
896          lappend listUPD [ list $pkg $nid ]
897        }
[2d896ea]898      }
899      "ok" {
900      }
901      default {
[2c0158d]902        puts "unexpected status $nodesInfo($nid,status) for pkg $pkg"
[2d896ea]903      }
[00c4270]904    }
[567b369]905    if { [ lsearchi 0 $listDEL0 $pkg ] == -1 } {
906      lappend listDEL0 [ list $pkg $nid ]
907    }
908    if { [ lsearchi 0 $listEXP $pkg ] == -1 } {
[633537f]909      lappend listEXP [ list $pkg $nodesInfo($nid,status) $nid ]
[2d896ea]910    }
911  }
912  # install list
[567b369]913  $w add separator
[2d896ea]914  if { [ llength $listNEW ] == 1 } {
[633537f]915    $w add command -label [ mc "Install %s" [ lindex [ lindex $listNEW 0 ] 0 ] ] \
916        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
[2d896ea]917  } elseif { [ llength $listNEW ] > 1 } {
[e70625a]918    $w add command -label [ mc "Install selected" ]... \
[633537f]919        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
[00c4270]920  }
[e70625a]921  $w add command -label [ mc "Install ZIP" ]... \
[00c4270]922      -command "::TolPkgGUI::InstallZip"
[2d896ea]923  # update list
924  if { [ llength $listUPD ] == 1 } {
[633537f]925    $w add command \
926        -label [ mc "Update %s" [ lindex [ lindex $listUPD 0 ] 0 ] ] \
927        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
[2d896ea]928  } elseif { [ llength $listUPD ] > 1 } {
[e70625a]929    $w add command -label [ mc "Update selected" ]... \
[2d896ea]930        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
931  }
[e70625a]932  $w add command -label [ mc "Update all" ]... \
[455a6d5]933      -command "::TolPkgGUI::UpdatePackageVersion" \
934      -state [ EntryState nodesInfo(update) ]
[2d896ea]935  # upgrade list
[567b369]936  $w add separator
[2d896ea]937  if { [ llength $listUPG ] == 1 } {
[633537f]938    $w add command \
939        -label [ mc "Upgrade %s" [ lindex [ lindex $listUPG 0 ] 0 ] ] \
940        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
[2d896ea]941  } elseif { [ llength $listUPG ] > 1 } {
[e70625a]942    $w add command -label [ mc "Upgrade selected" ]... \
[633537f]943        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
[2d896ea]944  }
[e70625a]945  $w add command -label [ mc "Upgrade all" ]... \
[455a6d5]946      -command "::TolPkgGUI::UpgradePackages" \
947      -state [ EntryState nodesInfo(upgrade) ]
948
[00c4270]949  # export options
[2d896ea]950  $w add separator
951  if { [ llength $listEXP ] == 1 } {
[e4c69c1]952    $w add command -label [ mc "Export %s" [ lindex [ lindex $listEXP 0 ] 0 ] ]... \
[633537f]953        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
[2d896ea]954  } elseif { [ llength $listEXP ] > 1 } {
[e4c69c1]955    $w add command -label [ mc "Export selected" ]... \
[2d896ea]956        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
957  } 
[e4c69c1]958  $w add command -label [ mc "Export all" ]... \
[2d896ea]959      -command [ list ::TolPkgGUI::ExportPackageVersion ]
[567b369]960  # Remove options
961  $w add separator
962  if { [ llength $listDEL ] == 1 } {
963    set _tmppkg [ lindex [ lindex $listDEL 0 ] 0 ]
964    $w add command \
965        -label [ mc "Remove all %s" $_tmppkg ]... \
966        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 $_tmppkg ]
967  } elseif { [ llength $listDEL0 ] == 1 } {
968    set _tmppkg [ lindex [ lindex $listDEL0 0 ] 0 ]
969    $w add command \
970        -label [ mc "Remove %s" $_tmppkg ]... \
971        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 ]
972  } elseif { [ llength $listDEL0 ] > 1 } {
973    $w add command -label [ mc "Remove selected" ]... \
974        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 ]
975  } 
976  $w add command -label [ mc "Remove all" ]... \
977      -command [ list ::TolPkgGUI::RemovePackageVersion ]
978 
[e83ccac]979  # SyncInfo import/export
980  $w add separator
981  $w add command -label [ mc "Import SyncInfo" ]... \
982      -command [ list ::TolPkgGUI::ImportSyncInfo ]
983  $w add command -label [ mc "Export SyncInfo" ]... \
984      -command [ list ::TolPkgGUI::ExportSyncInfo ]
985 
[00c4270]986}
987
988proc ::TolPkgGUI::AddNewRepository { } {
[633537f]989  variable win
990  variable urlmap
[00c4270]991
[633537f]992  set w $win.dlgAdd
993  if { ![ winfo exist $w ] } {
994    Dialog $w -title [ mc "Add repository"] \
995        -parent $win -modal local
996    set f [ $w getframe ]
997    label $f.lb -text [ mc "Repository" ]:
998    ComboBox $f.cb -values BPTP
999    grid $f.lb -row 0 -column 0 -sticky ew
1000    grid $f.cb -row 0 -column 1 -sticky ew
1001    grid columnconfigure $f 1 -weight 1
1002    $w add -text Ok
1003    $w add -text Cancel
1004  }
1005  set ans [ $w draw ]
1006  if { $ans == 0 } {
1007    set repo [ string trim [ [$w getframe].cb get ] ]
1008    if { [ string range $repo 0 3 ] eq "http" } {
1009      set url $repo
1010    } else {
1011      if { [ info exists urlmap($repo) ] } {
1012        set url $urlmap($repo)
1013      } else {
1014       
1015      }
1016    }
1017    puts "::TolPkg::AddRepository $url"
1018    ::TolPkg::AddRepository $url
1019  }
[00c4270]1020}
1021
[23f300d]1022proc ::TolPkgGUI::RefreshTree { } {
1023  variable tree
1024
1025  $tree item delete all
1026  FillTreeInfo $tree
1027}
1028
[00c4270]1029proc ::TolPkgGUI::SyncServers { } {
[e4c69c1]1030  variable tree
1031  update
[e83ccac]1032  ::TolPkg::UpdateRepositoryInfo
[23f300d]1033  RefreshTree
[00c4270]1034}
1035
[633537f]1036proc ::TolPkgGUI::StartProgressBar { } {
1037  variable win
1038  variable Progress
1039
1040  set Progress(status) "working"
1041  set Progress(state) 0
1042  $win configure -cursor watch
1043  foreach wc [ winfo children $win.dlgInstall ] {
1044    catch { $wc configure -cursor watch }
1045  }
1046}
1047
1048proc ::TolPkgGUI::DoneProgress { } {
1049  variable win
1050  variable Progress
1051
1052  set Progress(status) "stopped"
1053  Dialog::enddialog $win.dlgInstall 1
1054  $win configure -cursor ""
1055  foreach wc [ winfo children $win.dlgInstall ] {
1056    catch { $wc configure -cursor "" }
1057  }
1058}
1059
1060proc ::TolPkgGUI::AdvanceProgress { x } {
1061  variable Progress
1062
1063  if { $Progress(status) eq "working" } {
1064    set Progress(state) $x
1065    update
1066  }
1067}
1068
1069proc ::TolPkgGUI::InstallBtn1 { remote } {
1070  variable win
1071  variable Progress
1072
1073  set w $win.dlgInstall
1074  $w itemconfigure 0 -state disabled
1075  $w itemconfigure 1 -command ::TolPkgGUI::DoneProgress
1076  set f [ $w getframe ]
1077  $f.lb1 configure -text [ mc "Installing" ]...
1078  InstallTask $remote
1079}
1080
1081proc ::TolPkgGUI::DlgProcessBtn1 { } {
1082  variable win
1083  variable DlgProcessData
1084
1085  set w [ DlgProcessGetWin ]
1086  # disable button Ok
1087  $w itemconfigure 0 -state disabled
1088  # set cancel to finish progress
1089  $w itemconfigure 1 -command ::TolPkgGUI::DlgProcessStop
1090  eval $DlgProcessData(-beforestart)
1091  DlgProcessTask
1092}
1093
1094proc ::TolPkgGUI::DlgProcess { pkgs args } {
1095  variable win
1096  variable DlgProcessData
1097
1098  array unset DlgProcessData
1099  array set DlgProcessData {
1100    -title "Process packages"
1101    -beforestart ""
1102    -cmditem ""
1103    -cmdlabelitem ""
1104    -customgui ""
[23f300d]1105    -refreshtree 0
[633537f]1106  }
1107  set DlgProcessData(-label) [ mc "You are about to process"]:
1108  array set DlgProcessData $args
1109  set DlgProcessData(items) $pkgs
1110  set DlgProcessData(status) "stopped"
1111  set DlgProcessData(state) ""
1112  set w [ DlgProcessGetWin ]
1113  if { ![ winfo exists $w ] } {
1114    Dialog $w -title $DlgProcessData(-title) \
1115        -parent $win -modal local -cancel 1 -separator 1
1116    set f [ $w getframe ]
1117    label $f.lb1
1118    listbox $f.list -selectmode single -background white \
1119        -relief flat -borderwidth 1 -highlightthickness 0 \
1120        -selectbackground #c3c3ff
[e70625a]1121    frame $f.cgui
[633537f]1122    ProgressBar $f.pbar
1123    $w add -text Ok
1124    $w add -text Cancel
1125    grid $f.lb1 -row 0 -column 0 -sticky w
1126    grid $f.list -row 1 -column 0 -sticky snew
1127    grid $f.pbar -row 2 -column 0 -sticky e
1128    grid columnconfigure $f 0 -weight 1
1129    grid rowconfigure $f 1 -weight 1
1130  } else {
[e70625a]1131    wm title $w $DlgProcessData(-title)
[633537f]1132    set f [ DlgProcessGetFrame ]
1133  }
[e70625a]1134  if { $DlgProcessData(-customgui) ne "" } {
1135    grid $f.cgui -row 3 -column 0 -sticky snew
1136    eval $DlgProcessData(-customgui) $f.cgui
1137  } else {
1138    grid remove $f.cgui
1139    grid rowconfigure $f 3 -weight 0
1140  }
[633537f]1141  $f.pbar configure -maximum 1 \
1142      -variable ::TolPkgGUI::DlgProcessData(state,0)
1143  $f.pbar configure -variable ::TolPkgGUI::DlgProcessData(state)
1144 
1145  $f.lb1 configure -text $DlgProcessData(-label)
1146  $w itemconfigure 0 -state normal \
1147      -command [ list ::TolPkgGUI::DlgProcessBtn1 ]
1148  $w itemconfigure 1 -command "Dialog::enddialog $w 1"
1149  set lb [ DlgProcessGetList ]
1150  $lb delete 0 end
1151  foreach it $DlgProcessData(items) {
1152    if { $DlgProcessData(-cmdlabelitem) ne "" } {
1153      set labelIt [ $DlgProcessData(-cmdlabelitems) $it ]
1154    } else {
1155      set labelIt $it
1156    }
1157    $f.list insert end $it
1158  }
1159  set DlgProcessData(state) ""
1160  $w draw
[e70625a]1161  foreach wc [ winfo children $f.cgui ] {
1162    destroy $wc
1163  }
[633537f]1164}
1165
1166proc ::TolPkgGUI::DlgProcessGetCurrentIndex { } {
1167  variable DlgProcessData
1168
1169  return $DlgProcessData(current)
1170}
1171
1172proc ::TolPkgGUI::DlgProcessStart { } {
1173  variable win
1174  variable DlgProcessData
1175
1176  set lb [ DlgProcessGetList ]
1177  set total [ llength $DlgProcessData(items) ]
1178  set DlgProcessData(current) 0
1179  $lb selection clear 0 end
1180  $lb selection set 0
1181  $lb see 0
1182  set DlgProcessData(status) "working"
1183  set DlgProcessData(state) 0
1184  $win configure -cursor watch
1185  set w [ DlgProcessGetWin ]
1186  foreach wc [ winfo children $w ] {
1187    catch { $wc configure -cursor watch }
1188  }
1189}
1190
1191proc ::TolPkgGUI::DlgProcessAdvance { } {
1192  variable DlgProcessData
1193
1194  set i [ incr DlgProcessData(current) ]
1195  set lb [ DlgProcessGetList ]
1196  set total [ llength $DlgProcessData(items) ]
1197  $lb selection set $i
1198  $lb selection anchor $i
1199  $lb see $i
1200  if { $DlgProcessData(status) eq "working" } {
1201    set DlgProcessData(state) [ expr { double($i) / $total } ]
1202    update
1203  }
1204}
1205
1206proc ::TolPkgGUI::DlgProcessItem { p } {
1207  variable DlgProcessData
1208
1209  if { $DlgProcessData(-cmditem) ne "" } {
1210    $DlgProcessData(-cmditem) $p
1211  }
1212}
1213
1214proc ::TolPkgGUI::DlgProcessStop { } {
1215  variable win
1216  variable DlgProcessData
1217 
1218  set w [ DlgProcessGetWin ]
1219  $win configure -cursor ""
1220  foreach wc [ winfo children $w ] {
1221    catch { $wc configure -cursor "" }
1222  }
1223  set DlgProcessData(status) "stopped"
1224  Dialog::enddialog $w 1
1225}
1226
1227proc ::TolPkgGUI::DlgProcessGetWin { } {
1228  variable win
1229
1230  return $win.dlgProcess
1231}
1232
1233proc ::TolPkgGUI::DlgProcessGetFrame { } {
1234  variable win
1235
1236  set w [ DlgProcessGetWin ]
1237  return [ $w getframe ]
1238}
1239
1240proc ::TolPkgGUI::DlgProcessGetList { } {
1241  variable win
1242
1243  set w [ DlgProcessGetFrame ]
1244  return $w.list
1245}
1246
1247proc ::TolPkgGUI::DlgProcessSetLabel { text } {
1248  variable win
1249 
1250  set f [ DlgProcessGetFrame ]
1251  $f.lb1 configure -text $text
1252}
1253
1254proc ::TolPkgGUI::InstallPackages { pkgs } {
1255  variable win
1256  variable installData
1257
1258  array unset installData
1259  foreach p $pkgs {
1260    array set installData $p
1261    lappend _pkgs [ lindex $p 0 ]
1262  }
1263  set InstallList [ TolPkg::CheckPackagesToInstall $_pkgs ]
1264  if { ![ llength $InstallList ] } {
1265    set ans [ MessageDlg $win.ask -title [ mc "Install packages" ] \
1266                  -icon error \
1267                  -parent $win \
1268                  -type ok -aspect 75 \
1269                  -message [ mc "Could not connect with remote repository" ] ]
1270    return
1271  }
1272  puts "InstallPackages: $InstallList"
[23f300d]1273  DlgProcess $InstallList -title [ mc "Install packages" ] \
1274      -label [ mc "You are about to install"]: \
[633537f]1275      -beforestart ::TolPkgGUI::Installing \
[23f300d]1276      -cmditem "InstallThisPackage" -refreshtree 1
[633537f]1277 
1278}
1279
1280proc ::TolPkgGUI::DlgProcessGetVariableName { name } {
1281  return ::TolPkgGUI::DlgProcessData($name)
1282}
1283
1284proc ::TolPkgGUI::DlgProcessGetVariable { name } {
1285  variable DlgProcessData
1286
1287  return $DlgProcessData($name)
1288}
1289
1290proc ::TolPkgGUI::DlgProcessTask { } {
1291  variable win
1292  variable Progress
1293  variable DlgProcessData
1294 
[23f300d]1295  DlgProcessStart
1296  set hasProcessed 0
[633537f]1297  foreach p $DlgProcessData(items) {
1298    if { $DlgProcessData(status) ne "working" } break
1299    DlgProcessItem $p
1300    DlgProcessAdvance
[23f300d]1301    set hasProcessed 1
1302  }
1303  DlgProcessStop
1304  if { $DlgProcessData(-refreshtree) && $hasProcessed } {
1305    after idle ::TolPkgGUI::RefreshTree
[633537f]1306  }
1307}
1308
1309proc ::TolPkgGUI::InstallTask { remote } {
1310  variable win
1311  variable Progress
1312  variable InstallList
1313 
1314  set w $win.dlgInstall
1315  set f [ $w getframe ]
1316  set total [ llength $InstallList ]
1317  set i 0
1318  $f.list selection clear 0 end
1319  $f.list selection set 0
1320  $f.list see 0
1321  StartProgressBar
1322  foreach p $InstallList {
1323    if { $Progress(status) ne "working" } break
1324    if { $remote } {
1325      TolPkg::RemoteInstall $p
1326    } else {
1327      TolPkg::ZipInstall $p
1328    }
1329    incr i
1330    $f.list selection set $i
1331    $f.list selection anchor $i
1332    $f.list see $i
1333    AdvanceProgress [ expr { double($i) / $total } ]
1334  }
1335  DoneProgress
1336 
[00c4270]1337}
1338
[2d896ea]1339proc ::TolPkgGUI::InstallZip { } {
[633537f]1340  variable win
1341  variable installZipData
1342
1343  set installZipData [ tk_getOpenFile -defaultextension .zip -multiple 1 \
[23f300d]1344                           -parent $win -title [ mc "Select zip packages" ] \
[633537f]1345                           -filetypes {{zip {.zip}}} ]
1346  if { $installZipData ne "" } {
1347    foreach f $installZipData {
1348      lappend zipList [ file tail $f ]
1349    }
1350    DlgProcess $zipList -title [ mc "Install Zip's" ] \
1351        -label [ mc "You are about to install zip"]: \
1352        -beforestart ::TolPkgGUI::InstallingZip \
[23f300d]1353        -cmditem InstallThisZip -refreshtree 1
[633537f]1354  }
[2d896ea]1355}
1356
[633537f]1357proc ::TolPkgGUI::CheckConnectionConfig { } {
1358  variable win
1359
1360  array set connConfig [ ::TolPkg::GetUpgradeConfig ]
1361  if { $connConfig(localPKG) } {
1362    MessageDlg $win.ask -title [ mc "Warning" ] \
1363        -icon warning \
1364        -type ok \
1365        -message [ mc "Can not continue. You have configured to use only local packages. Check the value of\nTolConfigManager::Config::Upgrading::TolPackage::LocalOnly." ]
1366    return 0
1367  }
1368  return 1
[00c4270]1369}
1370
[633537f]1371proc ::TolPkgGUI::UpgradePackages { { pkgs {} } } {
1372  variable installData
[455a6d5]1373  variable nodesInfo
1374  variable tree
[633537f]1375
1376  if { ![ CheckConnectionConfig ] } {
1377    return
1378  }
1379  array unset installData
1380  if { [ llength $pkgs ] } {
1381    foreach p $pkgs {
1382      array set installData $p
1383      lappend upgradeList [ lindex $p 0 ]
1384    }
1385  } else {
1386    # upgrade all, look for the list
[455a6d5]1387    if { [ info exists nodesInfo(upgrade) ] } {
1388      foreach nid $nodesInfo(upgrade) {
1389        set p [ $tree item text $nid 0 ]
1390        lappend upgradeList $p
1391        set installData($p) $nid
1392      }
1393    } else {
1394      return
1395    }
[633537f]1396  }
1397  DlgProcess $upgradeList -title [ mc "Upgrade packages" ] \
1398      -label [ mc "You are about to upgrade"]: \
1399      -beforestart ::TolPkgGUI::Upgrading \
[23f300d]1400      -cmditem "InstallThisPackage" -refreshtree 1
[633537f]1401}
1402
1403proc ::TolPkgGUI::UpdatePackageVersion { { pkgs {} } } {
1404  variable installData
[455a6d5]1405  variable nodesInfo
1406  variable tree
[633537f]1407
1408  puts "UpdatePackageVersion: $pkgs"
1409  if { ![ CheckConnectionConfig ] } {
1410    return
1411  }
1412 
1413  array unset installData
[455a6d5]1414  set updateList {}
[633537f]1415  if { [ llength $pkgs ] } {
1416    foreach p $pkgs {
1417      array set installData $p
1418      lappend updateList [ lindex $p 0 ]
1419    }
1420  } else {
[455a6d5]1421    # update all, look for the list
1422    if { [ info exists nodesInfo(update) ] } {
1423      foreach nid $nodesInfo(update) {
1424        set p [ $tree item text $nid 0 ]
1425        lappend updateList $p
1426        set installData($p) $nid
1427      }
1428    } else {
1429      return
1430    }
[633537f]1431  }
1432  DlgProcess $updateList -title [ mc "Update packages" ] \
1433      -label [ mc "You are about to update"]: \
1434      -beforestart ::TolPkgGUI::Updating \
[23f300d]1435      -cmditem "InstallThisPackage" -refreshtree 1
[00c4270]1436}
1437
[567b369]1438proc ::TolPkgGUI::RemovePackageVersion { { pkgs {} } { matchPkg {} } } {
1439  variable installData
1440  variable tree
1441
1442  set removeList {}
1443  if { [ llength $pkgs ] } {
1444    foreach p $pkgs {
1445      set _p [ lindex $p 0 ]
1446      if { $matchPkg eq "" || [ regexp "^${matchPkg}\\.(\\d+)\\.(\\d+)\$" \
1447                                    $_p ] } {
1448        lappend removeList $_p
1449      }
1450    }
1451  } else {
1452    Unimplemented "Remove all not implemented yet"
1453  }
1454  if { ![ llength $removeList ] } {
1455    return
1456  }
1457  array unset installData
1458  DlgProcess $removeList -title [ mc "Remove packages" ] \
1459      -label [ mc "You are about to remove"]: \
1460      -beforestart ::TolPkgGUI::Removing \
1461      -cmditem "RemoveThisPackage" -refreshtree 1
1462}
1463
[e83ccac]1464proc ::TolPkgGUI::ImportSyncInfo { } {
[acc9f1a]1465  Unimplemented "Import Sync Info"
1466}
1467
[23f300d]1468proc ::TolPkgGUI::ExportSyncInfo { } {
1469  Unimplemented "Export Sync Info"
1470}
1471
[acc9f1a]1472proc ::TolPkgGUI::Unimplemented { title } {
1473  variable win
1474
1475  MessageDlg $win.ask -parent $win -title [ mc $title ] \
1476      -icon warning \
1477      -type ok -message [ mc "Unimplemented option" ]
[e83ccac]1478}
1479
1480##
1481# Export packages --
1482#
1483# p == "" then the last installed version of every package is
1484# exported,
1485#
1486# [ llength $p ]>0 then all specified package is exported, if some
1487# packages is not installed then it is requested from the remote
1488# repository.
1489#
[633537f]1490
1491# Funciones que hacen falta:
1492#
1493#  1- Crear un zip de un paquete local
1494#  2- Descargar un zip de un paquete remoto
1495#
1496proc ::TolPkgGUI::ExportPackageVersion { {pkgs ""} } {
1497  variable win
1498
1499  if { ![ CheckConnectionConfig ] } {
1500    return
1501  }
[acc9f1a]1502  if { ![ llength $pkgs ] } {
1503    Unimplemented "Export all packages"
1504    return
1505  }
[633537f]1506  set remote {}
1507  set local {}
1508  foreach _p $pkgs {
1509    foreach { p s } $_p break
[567b369]1510    if {  $s eq "upgupd" || $s eq "upgrade" || $s eq "new" } {
[633537f]1511      lappend remote $p
1512    } else {
1513      lappend local $p
1514    }
1515  }
1516  if { [ llength $remote ] } {
1517    set ans [ MessageDlg $win.ask -title [ mc "Export packages" ] \
1518                  -icon warning \
1519                  -type okcancel -aspect 75 \
1520                  -message [ mc "The following package can not be exported because they are not installed:\n%s\n\nContinue?" $remote ] ]
1521    if { $ans == 1 } {
1522      return
1523    }
1524  }
1525  puts "ExportPackageVersion: $local"
1526  if { [ llength $local ] } {
1527    DlgProcess $local -title [ mc "Export packages" ] \
1528        -label [ mc "You are about to export"]: \
1529        -beforestart ::TolPkgGUI::Exporting \
1530        -customgui "CreateSelectDir" \
[23f300d]1531        -cmditem "ExportThisPackage" -refreshtree 0
[633537f]1532  }
1533}
1534
1535proc ::TolPkgGUI::Exporting { } {
1536  DlgProcessSetLabel [ mc "Exporting" ]...
1537}
1538
1539proc ::TolPkgGUI::Installing { } {
1540  DlgProcessSetLabel [ mc "Installing" ]...
1541}
1542
1543proc ::TolPkgGUI::Upgrading { } {
1544  DlgProcessSetLabel [ mc "Upgrading" ]...
1545}
1546
[567b369]1547proc ::TolPkgGUI::Removing { } {
1548  DlgProcessSetLabel [ mc "Removing" ]...
1549}
1550
[633537f]1551proc ::TolPkgGUI::Updating { } {
1552  DlgProcessSetLabel [ mc "Updating" ]...
1553}
1554
1555proc ::TolPkgGUI::InstallingZip { } {
1556  DlgProcessSetLabel [ mc "Installing Zip" ]...
1557}
1558
[e70625a]1559proc ::TolPkgGUI::CreateSelectDir { f } {
[633537f]1560  set varname [ DlgProcessGetVariableName "directory" ]
1561  upvar \#0 $varname var
1562
1563
1564  if { ![ info exists $varname ] } {
1565    trace add variable $varname write ::TolPkgGUI::OnChangeDirectory
1566  }
[e70625a]1567  label $f.lb -text [ mc "Output directory" ]:
1568  entry $f.ent -textvariable $varname
1569  button $f.btn -image folder_yellow_16 \
[633537f]1570      -command "::TolPkgGUI::ChooseDir $varname"
[e70625a]1571  grid $f.lb -row 0 -column 0 -sticky w
1572  grid $f.ent -row 0 -column 1 -sticky ew
1573  grid $f.btn -row 0 -column 2 -sticky ew
1574  grid columnconfigure $f 1 -weight 1
[633537f]1575  if { $var eq "" } {
1576    set var [ pwd ]
1577  } else {
1578    set var $var
1579  }
1580}
1581
1582proc ::TolPkgGUI::OnChangeDirectory { args } {
1583  set w [ DlgProcessGetWin ]
1584  set dir [ DlgProcessGetVariable directory ]
1585  if { [ file exists $dir ] && [ file writable $dir ] } {
1586    $w itemconfigure 0 -state normal
1587  } else {
1588    $w itemconfigure 0 -state disabled
1589  }
1590}
1591
1592proc ::TolPkgGUI::ChooseDir { varname } {
1593  variable win
[e83ccac]1594 
[633537f]1595  puts "upvar \#0 $varname var"
1596  upvar \#0 $varname var
1597
1598  set res [ tk_chooseDirectory -parent $win -initialdir $var \
1599                -mustexist 1 -title [ mc "Select output directory" ] ]
1600  if { $res ne "" } {
1601    set var $res
1602  }
1603}
1604
1605proc ::TolPkgGUI::ExportThisPackage { p } {
1606  set status [ TolPkg::ExportPackage $p [ DlgProcessGetVariable "directory" ] ]
1607  puts "::TolPkgGUI::ExportThisPackage $p ==> $status"
1608}
1609
1610proc ::TolPkgGUI::InstallThisPackage { p } {
1611  variable win
1612  variable urlmap
1613  variable installData
1614 
1615  if { [ info exists installData($p) ] } {
1616    set nid $installData($p)
1617    set REPO [ $win.tree item text $nid REPO ]
1618    set repo $urlmap($REPO)
1619  } else {
1620    # packages requested as a dependencie
1621    set repo ""
1622  }
1623  set result [ TolPkg::RemoteInstall $p $repo ]
1624  puts "TolPkg::RemoteInstall $p: $result"
[567b369]1625  return $result
1626}
1627
1628proc ::TolPkgGUI::RemoveThisPackage { p } {
1629  set result [ TolPkg::RemovePackage $p ]
1630  puts "TolPkg::RemovePackage $p: $result"
1631  return $result
[633537f]1632}
1633
1634proc ::TolPkgGUI::InstallThisZip { p } {
1635  variable win
1636  variable urlmap
1637  variable installZipData
1638 
1639  puts "::TolPkgGUI::InstallThisZip $p"
1640  set idx [ DlgProcessGetCurrentIndex ]
1641  set thisZip [ lindex $installZipData $idx ]
1642  set result [ TolPkg::ZipInstall $thisZip ]
1643  puts "::TolPkgGUI::InstallThisZip $p: $result"
[5b6b63c]1644}
1645
1646proc ::TolPkgGUI::Show { } {
[633537f]1647  variable win
1648
1649  set win .tolpkg
[5b6b63c]1650
[633537f]1651  if { [ winfo exists $win ] } {
1652    raise $win
[5b6b63c]1653  } else {
[633537f]1654    toplevel $win
1655    wm state $win withdrawn
1656    CreateTree $win.tree
1657    FillTreeInfo $win.tree
1658    wm state $win normal
[5b6b63c]1659  }
1660}
1661
1662proc ::TolPkgGUI::test { } {
[e4c69c1]1663  destroy .tolpkg
1664  ::TolPkgGUI::Show
[5b6b63c]1665}
1666
1667if { 0 } {
1668  ::TolPkg::UpdateRepositoryInfo
1669  ::TolPkgGUI::test
1670}
Note: See TracBrowser for help on using the repository browser.