source: tol/tolbase/lib/toltk/tolpkg_gui.tcl @ 36c83cc

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

* empty log message *

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

  • Property mode set to 100644
File size: 68.4 KB
Line 
1package require wtree
2package require BWidget
3package require msgcat
4
5namespace eval ::TolPkgGUI {
6
7  namespace import ::msgcat::*
8
9  variable widgets
10
11  variable cwd [ file normalize [ file dir [ info script ] ] ]
12
13  variable urlmap
14
15  array set urlmap {
16    http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php OTAN
17    OTAN http://packages.tol-project.org/OfficialTolArchiveNetwork/repository.php
18    http://packages.localbayes.es/BayesPrivateTolPackages/repository.php BPTP
19    BPTP http://packages.localbayes.es/BayesPrivateTolPackages/repository.php
20  }
21 
22  variable win
23
24  variable packSyncInfo
25  variable versSyncInfo
26  variable localVersionInfo
27  variable localMostRecent
28
29  variable nodesInfo
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 ] clowd_down_16 ] == -1 } {
373    image create photo clowd_down_16 -data {
374      R0lGODlhEAAQAKU1AABVmABVmQBWmQBrqwBtrGpqamtrawCLxQCMxgCPyHd3d3h4eHx8fACu3gCw
375      35GRkQC14ZWVlZeXl5mZmQDN82S53aqqqqurq2q63aysrK6urq+vr7Ozs7S0tLa2tmDL7mHL7bi4
376      uLu7u8HBwWnW98TExMXFxcbGxszMzM3NzdXV1d3d3eLi4uPj4+jo6Onp6evr6+/v7/Hx8fPz8/T0
377      9P///////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5
378      BAEKAD8ALAAAAAAQABAAAAZ1wJ9wSCwaj8ik8ldg0RbIwqKgmLVasJBx8lrJZKvwylUoxlRogCCA
379      VkmIhVZqPiAM5qnHsLAq+UsHCQh/JShCIyKJIhgNEA4ViiZlKRyVHB0gFB8dlh4GPwwZF6MXGiQa
380      pBcnQxEbFq+wsCdlewa2t7dLurpBADs=
381    }
382  }
383
384  if { [ lsearch [ image names ] star_blue_16 ] == -1 } {
385    image create photo star_blue_16 -data {
386      R0lGODlhEAAQAPZLAA1piA5xkg52mA94mw97ng99ohB/pCuAnBCBpxKCpxWCphCCqBKDqBWDqBKE
387      qRCHrhKHrhiEqBqGqRuJrRyIrBOLsxGMtRePtx2LsByMsRGQuhGRuxKRuhSSuxSSvB+SuB+WvCyF
388      oiyLqiKPsyORtCqUtyKUuiuXuzCavDCcvzKcv2ehtCSZwC+fwy+fxDigwjuhwj6jxDqkxzylxz6l
389      xz2lyEGlxkCnyEKnyEKoyU2tzGivx2mxyGq61HrB2Ya0w5W9y4jG2pbI2bPQ2pfP4aXW5cPh68Pj
390      7tHj6eHs8OHx9v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
391      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
392      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
393      BAEAAEwALAAAAAAQABAAAAetgEyCgjM0NjEvKoOLTDU3LB4bGx0gKCeMOS2Sm5smJYM1mps6Opwf
394      JII3nBtHRg+cI0wyLJwuS0shnBcZOJE6PkRKt0lBPqUcFDaSPbfNzTuvEjGbPM63KwALGxEwHZtC
395      zkDZGxoKKSCbR85DBJIVDkwom8I/QEtIApIJgicmkkUHABQQMSTABggIBpX4IGmABUkWBEAwwIjE
396      iAscJGmokCAhI0EYJkiI0IABo0AAOw==
397    }
398  }
399
400  if { [ lsearch [ image names ] package_down_16 ] == -1 } {
401    image create photo package_down_16 -data {
402      R0lGODlhEAAQAPcAADJwKjZ6MUFqIkNsJ0ZvJkBvK096LVyAPUePQEuPQUqMRUuNRk2PSFeNQ1CS
403      S1WaTleZUVejTlikT2a2XGi4XWytZXysZ22+Yny/dnDCZXLFZnPGZ3THaH7AecODIsOEI8CFJcSF
404      JMWHJsaKKMeNK8iPLcmQLsmSL8iVMsuVMsyYNMiUO86dOd6fMtGkP+KqN+KpOOOrOua0Pea1P+y2
405      OOm1PcqQStCXU9KlQNOoQtSqRNWsRdWtR9awSdewSteyS9iyS9i0TNi0Tdm1Tdm1Ttm3T9WmUdqt
406      UNuxVuGnQOa1QuaxR+i+Q+m9ReSxTOi/SOi7T/W9QOWvVtuyYt25ada4cNy9d+a2a+W/b+SzdIDB
407      eoLCfYXDfuzFR/nESOHAcuDAfeDGfvXPf//Vd/XQePXQf/7WeIfFgZHKiZPLjJ3QlaDSl6nXoKvY
408      otvDidfTj97JlezFg+7Eg+3Gh+zKhOvMhOfMiO7KiPHPhvvchPfViffXi/DQjOXPku3SkurVnPHV
409      kPXXkPLWlf7flfjbnf/hm+3ZpfLdr+3evv/kpfnhqvrjqv/oq/fksvrksP/qs//ptv/rt/blv//q
410      uf/ruv/rvf/tvv/uwf/vwfvty//vyPnrzfrszv/wyf/yzvXr0vfu0f/z1P/z1f/01//12f/02v/2
411      2//23fz24v324v724/744f344vz45v775//+8P//9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
412      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
413      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
414      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
415      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAALEALAAAAAAQABAA
416      AAjnAGMJHBgLiA+CCAcK+fHHzg4dCQcG6dNK1aFGX1wkJBIGFKxXmY7sUSRoCguBRYYY+oQIjpsq
417      VAKJIbSIjpEUQlZt8lMHC5IVnEhNGjQmUZ4TP1iFcoSnDBknjiAVMhOlBqASPVKVElVJD4cNGS54
418      ofEECh8SPFCN8qSJkoY2bCh0aaJkyZ0ROlCF6mTp0YQ1aiQwmREjSRwROVydwhSJUYQ0aBDIgNHi
419      ipwQOKxIMnXpzYMzXAK8kDIniw0PAlmAsZCgwhYtDgAcuPEBoQoUDSB0wLCgAIjaEU0YYKBgQIiI
420      CAkIiBgQADs=
421    }
422  }
423  if { [ lsearch [ image names ] system_software_update_16 ] == -1 } {
424    image create photo system_software_update_16 -data {
425      R0lGODlhEAAQAPcAANpuFd5uFtVwFd1xFedyFedyFul7Fel8FuBxGOd2H+Z6G+l+G99yJ9x/IOBz
426      JeZ6Ieh7JOJ3LeJ4K+h/Leh7Meh7Muh8Mul+P+R/QOh/QcmBGM2GGd+AGt2LHdiRG9qTHN+YHd+a
427      HuWAH+CPHeOMH+iHJuyMJ+uOK+qdKOiCPOiFPuqOOuuOO+2WPeycPe2hLO+kP/CtPueGR+mCROmL
428      SuqMS+mMTOuOT+OZQeqRSOuSS+qQTuyZTueLU+mQVeqRVeybVeuTWO6qTvCwQvK3T/K4UuuQYeiS
429      YOuSY+uUYeqYZ+ued++oYOuheu6meeuhfO6kfvC1cvG3ffPCeu2mgO6ngO+uhe6ujfK9hfC1jO2s
430      kO+ukO2uku+xlO6xl+6ymPG6kPK+lfK/lvC4nvC5oPK+ovK/ovG9pfG9pvG9p/XJiPPAkPXJnPbO
431      nfXMoPTGq/LDrvTKr/TLsfjetfbWufbUuvbUvPbWvPbVvvfavfjevfnhu/bVxfbYwvjexPbXyPbW
432      yfbXyffZyPbZzffe0frmyfrny/jj1fji1vji1/nm1vjg2Pjh2fjl2vnk2/rp2frr2frs2/no4fvu
433      5Pz08AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
434      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
435      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
436      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
437      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
438      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJUALAAAAAAQABAA
439      AAjJACsJHEiwoMFKWrx84XJw4JItY9CkIdPlycEjVM4AWsRoEJwrTQpiUFLGUaM/fBJJCmSmB0EZ
440      VhAJqoLECBRClOT4GMjARpxDTmZcyJDkjZ0sNCIIdLCjD54bFihUSFEjyA8VEgQGeJBDx4QEBQgQ
441      gACmTg4EAgEoABJGDI8FBg6wuENnxYCBIqRMUsTkhIkWax5hKSFgYIMoeiL5ccMmD6Q2LjgUxCFk
442      ypxChvaogUHiYAcUMYgUGfJiRMNKGjyACPFhw+nXAgMCADs=
443    }
444  }
445  if { [ lsearch [ image names ] check_green_16 ] == -1 } {
446    image create photo check_green_16 -data {
447      R0lGODlhEAAQAPYAAACVAACWAACXAACYAACZAAKaAgOaAwecBwidCAmdCA6gDQ+gDhCgDxOgERWj
448      ExymGiSlISirJSqsJCqsJi+uKzCvLDKvLzayMTeyMjixNDy1Nz21OD61OT+1O0C2O0O1P0O4PUS4
449      PkW4P0m2REe5Qki7Q0q7REu7RlC+SlG6TFK6TF3CV17EWGjLWm3FZmnJYm7JZ3LMZnnNb3TQbHjU
450      a3vPcHrTcoDTdYDUeYXWeYbQfoXUfYfeeojeeovaf43VhY/VhY7WhonYgozdgI/dhJDXh5Peh5HV
451      iJHWiZLWiZLaiZPaiZbdjJTfjJnbkJ3elJHmhJTkh5rljpnikJ/ml57rkZ/qkqDgl6HgmKHimKbl
452      nKjmn6XsmajqnanvnanmoKnooKzroazoo6zuoK7qpbHtp7LsqLPtqbLuqbfzrLnzr7zzsr/1tQAA
453      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
454      BAEAAG0ALAAAAAAQABAAAAeZgG2Cg4SCBQgLhYptBSouKQ+LgwYfRzJIEpKCDD8xMUUTmgkwSy1P
455      KxSaFlc0TDsVmgtKRkNZHoIAECMNBJssWj1kLxeCATpAQRYHbRFiUWFNGIMCSTU3VyQOQl1WZSWE
456      AxlOOT5bOGdVazMahQUdWEQ8ZlxpVBuLCidfUlBeaiiaHmwAM4aNDRCa2kwwgWZKiISCMHAQISkQ
457      ADs=
458    }
459  }
460  if { [ lsearch [ image names ] cdr_tick_16 ] == -1 } {
461    image create photo cdr_tick_16 -data {
462      R0lGODlhEAAQAPZ2ADd7MTh8Mph/Mpl/Mpp/MjqUMECFOWuPPUijPFWcTVKtQ1ymUlyjVGuqXGC1
463      UGi3XmyyYnS5ZZmAMo2vZo6waY+ya5Czb821b861cM63cs+3cs+3c9C4ddC4dtC5dtC5d9G6edK8
464      fdO9f4HKdoPJeILLeIbJeYXLeYXIeoXJeofMe4bMfIfNfInNfYnOfovPf9S+gNS/gtW/g43PgZDS
465      hK/LlcDAhdbAhdnGjtnGj9nGkNrHkdvJldzKltzKl93Mmt7NnN7NneTWruTXsObZs+batebatufb
466      t+fbuOfduujduujdvOnevtPhvurgwOvhwuvixezixOzixezjx+3jyO3kyu7lzO7mzO/mze/mzu/n
467      z/Dp1PHq1fHr1/Lr1vLr1/Lr2PTv3vXv3/Xw4fXx4vby5Pfz5vj16vn27Pn27fn37fv48fz69Pz6
468      9fz69vz79v379/37+P78+v79+/7+/P///v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
469      BAEAAHcALAAAAAAQABAAAAfMgHeCg4SFhjxOXGRgPgSOhR9zYjg/WHN1cx+PdwQfa3ZwITJedm5v
470      dpqDXzdbdj0ZY3NncnRzjgQ+QSAdUFlDYWpncWxtjQRMMCAePSKOMW1lXVJMjlEcHyBFtwRXQDoU
471      DQcEURsYF0fbTzsTECgJBEsaFzlbMY4iRBYQMy8GuEZWzIRp8qAGkgoQWrAIQEDQnDRfpkQwscCG
472      gxUnGDbshEaLEgU0UkAgUSLABwmEPoyhIgSBCxUjTG4ixCNJlQIMGAowRGgAAQANCQUCADs=
473    }
474  }
475  if { [ lsearch [ image names ] database_1_16 ] == -1 } {
476    image create photo database_1_16 -data {
477      R0lGODlhEAAQAPeLAEdHR0dHSEtMTEtMTU1OTlNUVFRVVVZYWFdYWGFjY2JjY2JkZGNkZGVlZWRn
478      Z2VnZ2hoaGhpaWttbW5vb29xcXN1dXV3d3Z2eHh5eXl5eXh6enl6enp6en19f3x+fn6AgICCgoGD
479      g4mLi4qKjI6Ojo6OkJGRkZGRk5OUlJSUlZSUlpSVlpWWlpaXl5iXl5aXmJeYmJeYmZmYmJmampqb
480      m5ydnZycn5+fn6CgoKCgoqGioqCjo6Smpqeoqautraytrq2urq2vr66vr66wr62vsLCxsbCysrGy
481      s7Gzs7Kzs7GztLKztbK0tbO1trS1tbW1tbS1trW2trW2t7W3t7e3ura4uLe4uLe6uri4ubm7u7q7
482      u7u7vru8vr29vb6/wb6/wr/AwMLCwsPDxMXFxcXGxsXGx8bGxsXFyMbHycjIycjJysvKysvLy8rL
483      zcvLzcvNzcvMzs3Nz8/Ozs7Oz8/Pz8/Q0tHR0tLS1NfX19bX2Nvb29vc3Nzc3Nzd3d3e3t/f39/g
484      4Ofn5/Dx8fX19vj4+fn5+fz8+/v8/Pz9/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
485      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
486      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
487      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
488      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
489      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
490      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIwALAAAAAAQABAA
491      AAjOABkJHEiwYEEyRnYg0fPnzRWDc+7YiaOmjBUtZNjIWUOQyZYveQQFamFBBI8xWQhCoYJmkKE9
492      QT4kqFBkCsEmXNoQStTHx4cFGKI4IRjjgoo0fMzMmICAQQYZBInYGJGiBokGAgpMuHGEoJQtbggh
493      2gMkxIMNTqoQVLIFDiFFfoD8xPAkCcEXF06IwROGhYQDCji4ILgkRwkYOExAIGCAgg6bA3t4aVOI
494      pxCzGqz8ILjiTJ1DiwANAeHAAxgaBQN0wEKnC4oIAwQAMEjbYEAAOw==
495    }
496  }
497  if { [ lsearch [ image names ] back_to_ou_16 ] == -1 } {
498    image create photo back_to_ou_16 -data {
499      R0lGODlhEAAQAPYAALRmJ33VJtuPGd+aHeGhHt+bL+WwKuaxPOe4PYnVPu3UAO3VE+3QF+7VHPDb
500      KvDYL/HdN8+kU+m9Q82nYt62Ztq1aeewY+K1dY3cQJDXSpXdUZvdW4jCZZHJaJbObu7PR+zJS/Hd
501      QezHU/DYVPLgTPPiWfPjWfPfZmZ3mHiGq3aIsH+Pt6u816Kx3LPA4b/P4r3F9L3G9s7Pzs/Pz8/S
502      18/T19LX3dLY39jY2Nvb29zc3N3d3cHM48vZ68vb79LY4Nba4NPV8dPZ+ePj4+np6ert/PHx8QAA
503      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
504      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
505      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
506      BAEAAEcALAAAAAAQABAAAAd8gEeCg4SFhR8RLIoshoIDBw8MFT0+Pi+GCCQQDgoNF0VFPIUEJiUg
507      IQsUQUJCLoUSJwJHIxMwMbcthQYiggUqKykrKyiGFo3HRwDIy8xAPz80RzY3NzVHHhwcHYJERkY5
508      R0PeOkcbGBgagjtDQzNHOOwyRxkBAQnM+Pn5gQA7
509    }
510  }
511
512  if { [ lsearch [ image names ] folder_yellow_16 ] == -1 } {
513    image create photo folder_yellow_16 -data {
514      R0lGODlhEAAQAPYAAK+KGLGMGLOOGbKNGrKMG7OMG7OOG7SOGbSPGbWPH7SQGaOFI8GLNMmJN8Se
515      MMSXOcSfO9eQOuOePN6xLcOhN8WgNMahNcehNcmjNMijN8mmNcukN8ulN8umNsumN8KgOMeiOMei
516      OcemPMekPselPsemPtGnN9uqNeG9K+K4LeO/LOS8LeW/LeytO/G5OeTALPTHN/XMNvTBOffQNcun
517      QtGtQtCuSd6+Q922Sum8S/TCTvjETvjITvjOTe/USO7USfrTTfzaS/veTPzgTPzkTfzmUfvpXd3A
518      ZurTg/rrhvLgl/nrqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
519      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
520      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
521      BAEAAEwALAAAAAAQABAAAAeSgEyCg4SFhoeGBwgICgGIggYTKSssAgqXlwiEAC4yMDEzKi8vKioo
522      A4MALScYGxwesLAdFRcgTAASJj9GSUu+v0tKFkwEERlCREW8wEtIIUwFDTVAQUPJy75HggUMODw9
523      1NbKvTbbDzk7O9/h1w7bEDrp6evVPhqCCTTy++s3gwsfSJQoQWIEiYIjRFB4xLAhoUAAOw==
524    }
525  }
526  if { [ lsearch [ image names ] software_update_urgent_16 ] == -1 } {
527    image create photo software_update_urgent_16 -data {
528      R0lGODlhEAAQAPYAAHgXF6wiIqUtLa8vL7AjI+EXF+AZGeIaGuUdHdQoKNUpKdYrK9ctLdcvL8ox
529      Mco5OdgxMdg1Ndg2Ntk/P+giIu4nJ+gqKu4oKO4qKustLewxMe8wMO8zM+80NO44OO84OOk+PvA6
530      OvA7O/A8PPA+PsFCQshHR9hTU95YWOpHR+5FRe9FRetISOxKSvBCQvBDQ/BERPFGRvFMTOtSUuVe
531      Xu9YWPBQUPBTU/JWVvNbW/JcXPNcXPJeXvNeXulhYfR8fPV+fvR/f+mAgOqFhfWAgPjR0fjV1fzY
532      2Pje3vzf3/zn5/rq6vzu7v309P729v34+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
533      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
534      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
535      BAEAAFAALAAAAAAQABAAAAdzgFCCg4SFhoeIEIIFBoiDDRUHT08WUAmIkAhLTBoVCokXFEhKHRUL
536      iBIbGUZJHBgMhg8TKSEeRUcfHCARDoUzMC8uQUQkIyIshgE1MipCQysxNgSHAjwtTU43OAOOJT0/
537      QDomjoInOzko5IM0PuqEAO7qgQA7
538    }
539  }
540  if { [ lsearch [ image names ] view_refresh_16 ] == -1 } {
541    image create photo view_refresh_16 -data {
542      R0lGODlhEAAQAPeiAChAYClBYipDZSxIbixIby9LcS9Mcy9MdC9NdS9NdjBMcjBMczZSdzZSeDZS
543      eTZTeTdTeTdTejdUelBtlVBtllFvl1BvmFFvmFJvmFRxmFVymSxtxCltyC1wyyxwzDJxxjZzxzZ0
544      xjZ1yz56yzl5zj580EB+0GqJs2uJs2uLtmyLt22MuHCPuHKQunWTu0eBzkiAzEyCzE6DzEyDzk+F
545      zU+Fz0mD0U2H00yG1E+I1FGI1FGJ1FOL1VSL1FSL1VWM1VuN0FmO11mP11qP11yQ11+S2GaV1WuY
546      1GCT2GOV2WSW2WWW2WqZ2Wqa22yb222c23Ce3Hih13Wg2nSh3XWh3Xai3nih2Xih2n6l2Xmj3Xij
547      3nmk3nmk332n34ekzYqnzoem0Iin0Iin0Y6q0Yqv35Ov1ZWx1p643J+53YCp4Ias4Yiu4o2x446z
548      45a24Ze45p664J+74Zi55py75J6+55++56O94KO94aC84qK+46e/4KC+5qS/5KTA5afB5KjB4ajB
549      463F5qTB6afE6ajE6avG6qvG667H6a3H667I67HI57LJ6LXN7bfO7rjP7r/U78DU78fX7cLV8Mja
550      8cnb8svc8szc8tvn9uDq+OHr+OLr+Pf6/fj6/fr7/Pv8/v39/f7+/v7+/////wAAAAAAAAAAAAAA
551      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
552      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
553      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
554      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
555      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKMALAAAAAAQABAA
556      AAjyAEcJFKggwYIFCRQMXCgQQosyihaZcRGB4SgEGPy0odLkSZc3gTQgWFiBUBIfVBIN4rIEyqEM
557      AyHkIXJDUihRojxNKsIEkINRClakKdRIFCU5dSqJEqSDDIuCYoZcEpXpyRQtUxA56mFkjEE+JiBx
558      srSmiZMmStgwmfHnIJ8SPnDsEFIEiRpMoubA0IMwDA8Siejk4PEjiKZPkYB8Sagii4c1ohhV2fII
559      lJsjWFAolBDHRgdDm3B26vNBBpoHAy/secFBhJQrIzbEwDNh4QELcKzUABGCRpQzFAwwFNAgBZg7
560      drycYBDAosAABAoUGACAYUAAOw==
561    }
562  }
563}
564
565source [ file join $::TolPkgGUI::cwd tolpkg.tcl ]
566
567proc ::TolPkgGUI::CmpVersion { v1 v2 } {
568  foreach { v11 v12 } { {} {} } break
569  foreach { n1 v11 v12 } [ split $v1 . ] break
570  foreach { v21 v22 } { {} {} } break
571  foreach { n2 v21 v22 } [ split $v2 . ] break
572  set cmp [ string compare $n1 $n2 ]
573  if { $cmp } {
574    return $cmp
575  } else {
576    return [ expr { $v11 < $v21 ? -1 : ( $v11 > $v21 ? 1 : ( $v12 < $v22 ? -1 : ( $v12 > $v22 ? 1 : 0 ) ) ) } ]
577  }
578}
579
580proc ::TolPkgGUI::lsearchi { i l it } {
581  set _i 0
582  foreach _it $l {
583    if { $it eq [ lindex $_it $i ] } {
584      return $_i
585    }
586  }
587  return -1
588}
589
590proc ::TolPkgGUI::ReadPackSyncInfo { } {
591  variable packSyncInfo
592
593  array unset packSyncInfo
594  foreach p [ ::TolPkg::GetPkgSyncInfo ] {
595    array set packSyncInfo $p
596  }
597}
598
599proc ::TolPkgGUI::ReadVersSyncInfo { } {
600  variable versSyncInfo
601
602  array unset versSyncInfo
603  foreach p [ ::TolPkg::GetVersSyncInfo ] {
604    array set versSyncInfo $p
605  }
606}
607
608proc ::TolPkgGUI::ReadLocalVersionInfo { } {
609  variable localVersionInfo
610
611  array unset localVersionInfo
612  foreach pv [ ::TolPkg::GetLocalPackages ] {
613    array set localVersionInfo $pv
614  }
615}
616
617proc ::TolPkgGUI::GetRepoId { url } {
618  variable urlmap
619
620  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
621                   $url : "${url}repository.php" } ]
622  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ] 
623
624  return $repo
625}
626
627proc ::TolPkgGUI::GetPkgNode { T url p } {
628  variable urlmap
629  variable treeParents
630  variable nodesInfo
631  variable packSyncInfo
632
633  if { [ info exists treeParents($p) ] } {
634    return treeParents($p)
635  }
636  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
637                   $url : "${url}repository.php" } ]
638  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ]
639  if { [ info exists packSyncInfo($p) ] } {
640    array set packSync $packSyncInfo($p)
641    set lastlocal $packSync(lastlocal)
642    set lastremote $packSync(lastremote)
643    if { $lastlocal eq "" } {
644      set img "clowd_down_16"
645      set nodeStatus new
646      set statusLabel [ mc "new (%s)" $lastremote ]
647    } else {
648      set idx [ CmpVersion $lastremote $lastlocal ]
649      if { $idx <= 0 } {
650        # could be -1 (because of date error)
651        set img "cdr_tick_16"
652        set nodeStatus ok
653        set statusLabel [ mc "ok" ]
654      } else {
655        puts "$lastremote > $lastlocal"
656        set img "system_software_update_16"
657        set nodeStatus upgrade
658        set statusLabel [ mc "upgrade (%s)" $lastremote ]
659      }
660    }
661  } else {
662    set img ""
663    set nodeStatus unknown
664    set statusLabel [ mc "unknown" ]
665  }
666  set nid [ $T insert [ list [ list $img $p ] [ list $statusLabel ] \
667                            [ list $repo ] ] -at end -relative root \
668                -button auto ]
669  set treeParents($p) $nid
670  set nodesInfo($nid,type) pkg
671  set nodesInfo($nid,status) $nodeStatus
672  foreach st {new ok update upgrade unknown} {
673    set nodesInfo($nid,children,$st) 0
674  }
675  lappend nodesInfo($nodeStatus) $treeParents($p)
676}
677
678proc ::TolPkgGUI::FillTreeInfo { T } {
679  variable packSyncInfo
680  variable versSyncInfo
681  variable localVersionInfo
682  variable treeParents
683  variable nodesInfo
684  variable localMostRecent
685
686  array unset treeParents
687  array unset nodesInfo
688  ReadPackSyncInfo
689  ReadVersSyncInfo
690  ReadLocalVersionInfo
691
692  $T configure -table no -filter yes -columns {
693    { {image text} -tags NAME -label "Name" }
694    { {text} -tags STATUS -label "Status" }
695    { {text} -tags REPO -label "Repository" }
696  }
697
698  # insert package information
699  foreach p [ lsort [ array names packSyncInfo ] ] {
700    array unset pkg
701    array set pkg $packSyncInfo($p)
702    set url $pkg(url)
703    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
704                         $url : "${url}repository.php" } ]
705    GetPkgNode $T $pkgRepo $p
706  }
707 
708  set localVersionNames [ lsort -decreasing -command ::TolPkgGUI::CmpVersion \
709                              [ array names localVersionInfo ] ]
710
711  array unset localMostRecent
712  # insert version information
713  foreach pv $localVersionNames {
714    array unset pkg
715    array set pkg $localVersionInfo($pv)
716    set pkgRoot [ lindex [ split $pv . ] 0 ]
717    set url $pkg(_.autodoc.url)
718    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
719                         $url : "${url}repository.php" } ]
720    GetPkgNode $T $pkgRepo $pkgRoot
721
722    if { ![ info exists localMostRecent($pkgRoot) ] } {
723      # will be used in contextual menu
724      set localMostRecent($pkgRoot) $pv
725    }
726    if { [ info exists versSyncInfo($pv) ] } {
727      array set versSync $versSyncInfo($pv)
728      set dateremote $versSync(dateremote)
729      set datelocal $versSync(datelocal)
730      if { $datelocal eq "TheBegin" } {
731        set img "clowd_down_16"
732        set nodeStatus new
733        set statusLabel [ mc "new" ]
734      } else {
735        set idx [ string compare $dateremote $datelocal ]
736        if { $idx <= 0 } {
737          # could be -1 (because of date error)
738          set img "cdr_tick_16"
739          set nodeStatus ok
740          set statusLabel [ mc "ok" ]
741        } else {
742          puts "$pv OUTDATED : $dateremote > $datelocal"
743          set img "view_refresh_16"
744          set nodeStatus update
745          set statusLabel [ mc "update" ]
746        }
747      }
748    } else {
749      set img ""
750      set nodeStatus unknown
751      set statusLabel [ mc "unknown" ]
752    }
753    set repo [ GetRepoId $pkgRepo ]
754    set parent $treeParents($pkgRoot)
755    set nid [ $T insert [ list [ list $img $pv ] [ list $statusLabel ] [ list $repo ] ] \
756                  -at end -relative $parent -button auto ]
757    set nodesInfo($nid,type) pkgver
758    set nodesInfo($nid,status) $nodeStatus
759    incr nodesInfo($parent,children,$nodeStatus)
760    if { $nodeStatus eq "update" } {
761      if { $nodesInfo($parent,status) ne "update" } {
762        if { $nodesInfo($parent,status) eq "upgrade" } {
763          set nodesInfo($parent,status) "upgupd"
764          $T itemcolumn $parent NAME {image "software_update_urgent_16"}
765          set txtUpgrade [ lindex [ lindex [ $T itemcolumn $parent STATUS text ] 0 ] 1 ]
766          $T itemcolumn $parent STATUS \
767              [ list text [ mc "update/%s" $txtUpgrade ] ]
768        } elseif { $nodesInfo($parent,status) ne "upgupd"} {
769          set nodesInfo($parent,status) "update"
770          $T itemcolumn $parent NAME {image "view_refresh_16"}
771          $T itemcolumn $parent STATUS [list text [ mc "update" ] ]
772        }
773      }
774    }
775    lappend nodesInfo($nodeStatus) $nid
776    foreach {{} d} $pkg(_.autodoc.dependencies) {
777      set _nid [ $T insert [ list [ list back_to_ou_16 $d ] ] \
778                    -at end -relative $nid -button no ]
779      set nodesInfo($_nid,type) pkgdep
780    }
781  }
782}
783
784proc ::TolPkgGUI::CreateTreeWidget { t } {
785  variable tree $t
786
787  wtree $t -background white
788  grid $t -row 1 -column 0 -sticky "snew"
789  set f [ winfo parent $t ]
790  grid rowconfigure $f 1 -weight 1
791  grid columnconfigure $f 0 -weight 1
792}
793
794proc ::TolPkgGUI::CreateTree { t } {
795  variable widgets
796
797  CreateTreeWidget $t
798
799  menu $t.cmenu -tearoff 0 \
800      -postcommand [ list ::TolPkgGUI::PostContextMenu $t $t.cmenu ]
801  $t configure -contextmenu $t.cmenu
802}
803
804proc ::TolPkgGUI::EntryState { listName } {
805  upvar $listName v
806
807  if { [ info exists v ] && [ llength $v ] } {
808    return "normal"
809  } else {
810    return "disabled"
811  }
812}
813
814proc ::TolPkgGUI::PostContextMenu { T w } {
815  variable nodesInfo
816  variable packSyncInfo
817  variable versSyncInfo
818  variable localVersionInfo
819  variable localMostRecent
820
821  $w delete 0 end
822  array set selectionInfo {
823    repo   ""
824    pkg    ""
825    pkgver ""
826  }
827  foreach nid [ $T selection get ] {
828    lappend selectionInfo($nodesInfo($nid,type)) $nid
829  }
830  $w add command  -label [ mc "Add New Repository" ]... \
831      -command ::TolPkgGUI::AddNewRepository
832  set lenRepo [ llength $selectionInfo(repo) ]
833  if { $lenRepo } {
834    $w add cascade  -label [ mc "Check Repository" ] \
835        -menu $w.check
836    if { [ winfo exists $w.check ] } {
837      $w.check delete 0 end
838    } else {
839      menu $w.check -tearoff 0
840    }
841    if { $lenRepo > 1 } {
842      set labelCheck [ mc "Selected" ]
843    } else {
844      set labelCheck [ $T item text [ lindex $selectionInfo(repo) 0 ] 0 ]
845    }
846    $w.check add command -label $labelCheck \
847        -command "::TolPkgGUI::CheckRepository $labelCheck $lenRepo"
848    $w.check add command -label [ mc "All" ] \
849        -command "::TolPkgGUI::CheckRepository ALL -1"
850  }
851  $w add command -label [ mc "Sync with servers" ] \
852      -command "::TolPkgGUI::SyncServers"
853  # preprocess selection of packages
854  # list of new packages available
855  set listNEW {}
856  # list of package to remove including all installed versions
857  set listDEL {}
858  # list of individual package selected to remove
859  set listDEL0 {}
860  # list of packages selected needing update
861  set listUPD {}
862  # list of packages selected needing upgrade
863  set listUPG {}
864  # list of packages selected that can be exported 
865  set listEXP {}
866 
867  # process first the list of pkg
868  foreach nid $selectionInfo(pkg) {
869    set pkg [ $T item text $nid 0 ]
870    if { $nodesInfo($nid,status) ne "new" } {
871      lappend listDEL [ list $pkg $nid ]
872    }
873    array unset pkgInfo
874    if { [ info exists packSyncInfo($pkg) ] } {
875      array set pkgInfo $packSyncInfo($pkg)
876    } else {
877      set pkgInfo(lastremote) $localMostRecent($pkg)
878    }
879    switch -exact $nodesInfo($nid,status) {
880      "new" {
881        lappend listNEW [ list $pkgInfo(lastremote) $nid ]
882      }
883      "upgrade" -
884      "update" -
885      "upgupd" {
886        if { $nodesInfo($nid,status) eq "upgrade" ||
887             $nodesInfo($nid,status) eq "upgupd" } {
888          lappend listUPG [ list $pkg $nid ]
889        }
890        if { $nodesInfo($nid,status) eq "update" ||
891             $nodesInfo($nid,status) eq "upgupd" } {
892          foreach chId [ $T item children $nid ] {
893            if { $nodesInfo($chId,status) eq "update" } {
894              lappend listUPD [ list [ $T item text $chId 0 ] $chId ]
895            }
896          }
897        }
898      }
899      "ok" {
900      }
901      "unknown" {
902      }
903      default {
904        puts "unexpected status $nodesInfo($nid,status) for pkg $pkg"
905      }
906    }
907    foreach chId [ $T item children $nid ] {
908      lappend listDEL0 [ list [ $T item text $chId 0 ] $chId ]
909    }
910    lappend listEXP [ list $pkgInfo(lastremote) $nodesInfo($nid,status) $nid ]
911  }
912  # next process the list of pkgver
913  foreach nid $selectionInfo(pkgver) {
914    set pkg [ $T item text $nid 0 ]
915    switch -exact $nodesInfo($nid,status) {
916      "new" {
917        puts "OJO: he encontrado un estado new en un pkgver $pkg"
918        if { [ lsearchi 0 $listNEW $pkg ] == -1 } {
919          lappend listNEW [ list $pkg $nid ]
920        }
921      }
922      "update" {
923        if { [ lsearchi 0 $listUPD $pkg ] == -1 } {
924          lappend listUPD [ list $pkg $nid ]
925        }
926      }
927      "ok" {
928      }
929      default {
930        puts "unexpected status $nodesInfo($nid,status) for pkg $pkg"
931      }
932    }
933    if { [ lsearchi 0 $listDEL0 $pkg ] == -1 } {
934      lappend listDEL0 [ list $pkg $nid ]
935    }
936    if { [ lsearchi 0 $listEXP $pkg ] == -1 } {
937      lappend listEXP [ list $pkg $nodesInfo($nid,status) $nid ]
938    }
939  }
940  # install list
941  $w add separator
942  if { [ llength $listNEW ] == 1 } {
943    $w add command -label [ mc "Install %s" [ lindex [ lindex $listNEW 0 ] 0 ] ] \
944        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
945  } elseif { [ llength $listNEW ] > 1 } {
946    $w add command -label [ mc "Install selected" ]... \
947        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
948  }
949  $w add command -label [ mc "Install ZIP" ]... \
950      -command "::TolPkgGUI::InstallZip"
951  # update list
952  if { [ llength $listUPD ] == 1 } {
953    $w add command \
954        -label [ mc "Update %s" [ lindex [ lindex $listUPD 0 ] 0 ] ] \
955        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
956  } elseif { [ llength $listUPD ] > 1 } {
957    $w add command -label [ mc "Update selected" ]... \
958        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
959  }
960  $w add command -label [ mc "Update all" ]... \
961      -command "::TolPkgGUI::UpdatePackageVersion" \
962      -state [ EntryState nodesInfo(update) ]
963  # upgrade list
964  $w add separator
965  if { [ llength $listUPG ] == 1 } {
966    $w add command \
967        -label [ mc "Upgrade %s" [ lindex [ lindex $listUPG 0 ] 0 ] ] \
968        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
969  } elseif { [ llength $listUPG ] > 1 } {
970    $w add command -label [ mc "Upgrade selected" ]... \
971        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
972  }
973  $w add command -label [ mc "Upgrade all" ]... \
974      -command "::TolPkgGUI::UpgradePackages" \
975      -state [ EntryState nodesInfo(upgrade) ]
976
977  # export options
978  $w add separator
979  if { [ llength $listEXP ] == 1 } {
980    $w add command -label [ mc "Export %s" [ lindex [ lindex $listEXP 0 ] 0 ] ]... \
981        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
982  } elseif { [ llength $listEXP ] > 1 } {
983    $w add command -label [ mc "Export selected" ]... \
984        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
985  } 
986  $w add command -label [ mc "Export all" ]... \
987      -command [ list ::TolPkgGUI::ExportPackageVersion ]
988  # Remove options
989  $w add separator
990  if { [ llength $listDEL ] == 1 } {
991    set _tmppkg [ lindex [ lindex $listDEL 0 ] 0 ]
992    $w add command \
993        -label [ mc "Remove all %s" $_tmppkg ]... \
994        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 $_tmppkg ]
995  } elseif { [ llength $listDEL0 ] == 1 } {
996    set _tmppkg [ lindex [ lindex $listDEL0 0 ] 0 ]
997    $w add command \
998        -label [ mc "Remove %s" $_tmppkg ]... \
999        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 ]
1000  } elseif { [ llength $listDEL0 ] > 1 } {
1001    $w add command -label [ mc "Remove selected" ]... \
1002        -command [ list ::TolPkgGUI::RemovePackageVersion $listDEL0 ]
1003  } 
1004  $w add command -label [ mc "Remove all" ]... \
1005      -command [ list ::TolPkgGUI::RemovePackageVersion ]
1006 
1007  # SyncInfo import/export
1008  $w add separator
1009  $w add command -label [ mc "Import SyncInfo" ]... \
1010      -command [ list ::TolPkgGUI::ImportSyncInfo ]
1011  $w add command -label [ mc "Export SyncInfo" ]... \
1012      -command [ list ::TolPkgGUI::ExportSyncInfo ]
1013 
1014}
1015
1016proc ::TolPkgGUI::AddNewRepository { } {
1017  variable win
1018  variable urlmap
1019
1020  set w $win.dlgAdd
1021  if { ![ winfo exist $w ] } {
1022    Dialog $w -title [ mc "Add repository"] \
1023        -parent $win -modal local
1024    set f [ $w getframe ]
1025    label $f.lb -text [ mc "Repository" ]:
1026    ComboBox $f.cb -values BPTP
1027    grid $f.lb -row 0 -column 0 -sticky ew
1028    grid $f.cb -row 0 -column 1 -sticky ew
1029    grid columnconfigure $f 1 -weight 1
1030    $w add -text Ok
1031    $w add -text Cancel
1032  }
1033  set ans [ $w draw ]
1034  if { $ans == 0 } {
1035    set repo [ string trim [ [$w getframe].cb get ] ]
1036    if { [ string range $repo 0 3 ] eq "http" } {
1037      set url $repo
1038    } else {
1039      if { [ info exists urlmap($repo) ] } {
1040        set url $urlmap($repo)
1041      } else {
1042       
1043      }
1044    }
1045    puts "::TolPkg::AddRepository $url"
1046    ::TolPkg::AddRepository $url
1047  }
1048}
1049
1050proc ::TolPkgGUI::RefreshTree { } {
1051  variable tree
1052
1053  $tree item delete all
1054  FillTreeInfo $tree
1055}
1056
1057proc ::TolPkgGUI::SyncServers { } {
1058  variable tree
1059  update
1060  ::TolPkg::UpdateRepositoryInfo
1061  RefreshTree
1062}
1063
1064proc ::TolPkgGUI::StartProgressBar { } {
1065  variable win
1066  variable Progress
1067
1068  set Progress(status) "working"
1069  set Progress(state) 0
1070  $win configure -cursor watch
1071  foreach wc [ winfo children $win.dlgInstall ] {
1072    catch { $wc configure -cursor watch }
1073  }
1074}
1075
1076proc ::TolPkgGUI::DoneProgress { } {
1077  variable win
1078  variable Progress
1079
1080  set Progress(status) "stopped"
1081  Dialog::enddialog $win.dlgInstall 1
1082  $win configure -cursor ""
1083  foreach wc [ winfo children $win.dlgInstall ] {
1084    catch { $wc configure -cursor "" }
1085  }
1086}
1087
1088proc ::TolPkgGUI::AdvanceProgress { x } {
1089  variable Progress
1090
1091  if { $Progress(status) eq "working" } {
1092    set Progress(state) $x
1093    update
1094  }
1095}
1096
1097proc ::TolPkgGUI::InstallBtn1 { remote } {
1098  variable win
1099  variable Progress
1100
1101  set w $win.dlgInstall
1102  $w itemconfigure 0 -state disabled
1103  $w itemconfigure 1 -command ::TolPkgGUI::DoneProgress
1104  set f [ $w getframe ]
1105  $f.lb1 configure -text [ mc "Installing" ]...
1106  InstallTask $remote
1107}
1108
1109proc ::TolPkgGUI::DlgProcessBtn1 { } {
1110  variable win
1111  variable DlgProcessData
1112
1113  set w [ DlgProcessGetWin ]
1114  # disable button Ok
1115  $w itemconfigure 0 -state disabled
1116  # set cancel to finish progress
1117  $w itemconfigure 1 -command ::TolPkgGUI::DlgProcessStop
1118  eval $DlgProcessData(-beforestart)
1119  DlgProcessTask
1120}
1121
1122proc ::TolPkgGUI::DlgProcess { pkgs args } {
1123  variable win
1124  variable DlgProcessData
1125
1126  array unset DlgProcessData
1127  array set DlgProcessData {
1128    -title "Process packages"
1129    -beforestart ""
1130    -cmditem ""
1131    -cmdlabelitem ""
1132    -customgui ""
1133    -refreshtree 0
1134    -syncservers 0
1135  }
1136  set DlgProcessData(-label) [ mc "You are about to process"]:
1137  array set DlgProcessData $args
1138  set DlgProcessData(items) $pkgs
1139  set DlgProcessData(status) "stopped"
1140  set DlgProcessData(state) ""
1141  set w [ DlgProcessGetWin ]
1142  if { ![ winfo exists $w ] } {
1143    Dialog $w -title $DlgProcessData(-title) \
1144        -parent $win -modal local -cancel 1 -separator 1
1145    set f [ $w getframe ]
1146    label $f.lb1
1147    listbox $f.list -selectmode single -background white \
1148        -relief flat -borderwidth 1 -highlightthickness 0 \
1149        -selectbackground #c3c3ff
1150    frame $f.cgui
1151    ProgressBar $f.pbar
1152    $w add -text Ok
1153    $w add -text Cancel
1154    grid $f.lb1 -row 0 -column 0 -sticky w
1155    grid $f.list -row 1 -column 0 -sticky snew
1156    grid $f.pbar -row 2 -column 0 -sticky e
1157    grid columnconfigure $f 0 -weight 1
1158    grid rowconfigure $f 1 -weight 1
1159  } else {
1160    wm title $w $DlgProcessData(-title)
1161    set f [ DlgProcessGetFrame ]
1162  }
1163  if { $DlgProcessData(-customgui) ne "" } {
1164    grid $f.cgui -row 3 -column 0 -sticky snew
1165    eval $DlgProcessData(-customgui) $f.cgui
1166  } else {
1167    grid remove $f.cgui
1168    grid rowconfigure $f 3 -weight 0
1169  }
1170  $f.pbar configure -maximum 1 \
1171      -variable ::TolPkgGUI::DlgProcessData(state,0)
1172  $f.pbar configure -variable ::TolPkgGUI::DlgProcessData(state)
1173 
1174  $f.lb1 configure -text $DlgProcessData(-label)
1175  $w itemconfigure 0 -state normal \
1176      -command [ list ::TolPkgGUI::DlgProcessBtn1 ]
1177  $w itemconfigure 1 -command "Dialog::enddialog $w 1"
1178  set lb [ DlgProcessGetList ]
1179  $lb delete 0 end
1180  foreach it $DlgProcessData(items) {
1181    if { $DlgProcessData(-cmdlabelitem) ne "" } {
1182      set labelIt [ $DlgProcessData(-cmdlabelitems) $it ]
1183    } else {
1184      set labelIt $it
1185    }
1186    $f.list insert end $it
1187  }
1188  set DlgProcessData(state) ""
1189  $w draw
1190  foreach wc [ winfo children $f.cgui ] {
1191    destroy $wc
1192  }
1193}
1194
1195proc ::TolPkgGUI::DlgProcessGetCurrentIndex { } {
1196  variable DlgProcessData
1197
1198  return $DlgProcessData(current)
1199}
1200
1201proc ::TolPkgGUI::DlgProcessStart { } {
1202  variable win
1203  variable DlgProcessData
1204
1205  set lb [ DlgProcessGetList ]
1206  set total [ llength $DlgProcessData(items) ]
1207  set DlgProcessData(current) 0
1208  $lb selection clear 0 end
1209  $lb selection set 0
1210  $lb see 0
1211  set DlgProcessData(status) "working"
1212  set DlgProcessData(state) 0
1213  $win configure -cursor watch
1214  set w [ DlgProcessGetWin ]
1215  foreach wc [ winfo children $w ] {
1216    catch { $wc configure -cursor watch }
1217  }
1218}
1219
1220proc ::TolPkgGUI::DlgProcessAdvance { } {
1221  variable DlgProcessData
1222
1223  set i [ incr DlgProcessData(current) ]
1224  set lb [ DlgProcessGetList ]
1225  set total [ llength $DlgProcessData(items) ]
1226  $lb selection set $i
1227  $lb selection anchor $i
1228  $lb see $i
1229  if { $DlgProcessData(status) eq "working" } {
1230    set DlgProcessData(state) [ expr { double($i) / $total } ]
1231    update
1232  }
1233}
1234
1235proc ::TolPkgGUI::DlgProcessItem { p } {
1236  variable DlgProcessData
1237
1238  if { $DlgProcessData(-cmditem) ne "" } {
1239    $DlgProcessData(-cmditem) $p
1240  }
1241}
1242
1243proc ::TolPkgGUI::DlgProcessStop { } {
1244  variable win
1245  variable DlgProcessData
1246 
1247  set w [ DlgProcessGetWin ]
1248  $win configure -cursor ""
1249  foreach wc [ winfo children $w ] {
1250    catch { $wc configure -cursor "" }
1251  }
1252  set DlgProcessData(status) "stopped"
1253  Dialog::enddialog $w 1
1254}
1255
1256proc ::TolPkgGUI::DlgProcessGetWin { } {
1257  variable win
1258
1259  return $win.dlgProcess
1260}
1261
1262proc ::TolPkgGUI::DlgProcessGetFrame { } {
1263  variable win
1264
1265  set w [ DlgProcessGetWin ]
1266  return [ $w getframe ]
1267}
1268
1269proc ::TolPkgGUI::DlgProcessGetList { } {
1270  variable win
1271
1272  set w [ DlgProcessGetFrame ]
1273  return $w.list
1274}
1275
1276proc ::TolPkgGUI::DlgProcessSetLabel { text } {
1277  variable win
1278 
1279  set f [ DlgProcessGetFrame ]
1280  $f.lb1 configure -text $text
1281}
1282
1283proc ::TolPkgGUI::InstallPackages { pkgs } {
1284  variable win
1285  variable installData
1286
1287  array unset installData
1288  foreach p $pkgs {
1289    array set installData $p
1290    lappend _pkgs [ lindex $p 0 ]
1291  }
1292  set InstallList [ TolPkg::CheckPackagesToInstall $_pkgs ]
1293  if { ![ llength $InstallList ] } {
1294    set ans [ MessageDlg $win.ask -title [ mc "Install packages" ] \
1295                  -icon error \
1296                  -parent $win \
1297                  -type ok -aspect 75 \
1298                  -message [ mc "Could not connect with remote repository" ] ]
1299    return
1300  }
1301  puts "InstallPackages: $InstallList"
1302  DlgProcess $InstallList -title [ mc "Install packages" ] \
1303      -label [ mc "You are about to install"]: \
1304      -beforestart ::TolPkgGUI::Installing \
1305      -cmditem "InstallThisPackage" \
1306      -syncservers 1
1307}
1308
1309proc ::TolPkgGUI::DlgProcessGetVariableName { name } {
1310  return ::TolPkgGUI::DlgProcessData($name)
1311}
1312
1313proc ::TolPkgGUI::DlgProcessGetVariable { name } {
1314  variable DlgProcessData
1315
1316  return $DlgProcessData($name)
1317}
1318
1319proc ::TolPkgGUI::DlgProcessTask { } {
1320  variable win
1321  variable Progress
1322  variable DlgProcessData
1323 
1324  DlgProcessStart
1325  set hasProcessed 0
1326  foreach p $DlgProcessData(items) {
1327    if { $DlgProcessData(status) ne "working" } break
1328    DlgProcessItem $p
1329    DlgProcessAdvance
1330    set hasProcessed 1
1331  }
1332  DlgProcessStop
1333  if { $hasProcessed } {
1334    if { $DlgProcessData(-syncservers) } {
1335      ::TolPkg::UpdateRepositoryInfo
1336      set DlgProcessData(-refreshtree) 1
1337    }
1338    if { $DlgProcessData(-refreshtree) } {
1339      after idle ::TolPkgGUI::RefreshTree
1340    }
1341  }
1342}
1343
1344proc ::TolPkgGUI::InstallTask { remote } {
1345  variable win
1346  variable Progress
1347  variable InstallList
1348 
1349  set w $win.dlgInstall
1350  set f [ $w getframe ]
1351  set total [ llength $InstallList ]
1352  set i 0
1353  $f.list selection clear 0 end
1354  $f.list selection set 0
1355  $f.list see 0
1356  StartProgressBar
1357  foreach p $InstallList {
1358    if { $Progress(status) ne "working" } break
1359    if { $remote } {
1360      TolPkg::RemoteInstall $p
1361    } else {
1362      TolPkg::ZipInstall $p
1363    }
1364    incr i
1365    $f.list selection set $i
1366    $f.list selection anchor $i
1367    $f.list see $i
1368    AdvanceProgress [ expr { double($i) / $total } ]
1369  }
1370  DoneProgress
1371 
1372}
1373
1374proc ::TolPkgGUI::InstallZip { } {
1375  variable win
1376  variable installZipData
1377
1378  set installZipData [ tk_getOpenFile -defaultextension .zip -multiple 1 \
1379                           -parent $win -title [ mc "Select zip packages" ] \
1380                           -filetypes {{zip {.zip}}} ]
1381  if { $installZipData ne "" } {
1382    foreach f $installZipData {
1383      lappend zipList [ file tail $f ]
1384    }
1385    DlgProcess $zipList -title [ mc "Install Zip's" ] \
1386        -label [ mc "You are about to install zip"]: \
1387        -beforestart ::TolPkgGUI::InstallingZip \
1388        -cmditem InstallThisZip -syncservers 1
1389  }
1390}
1391
1392proc ::TolPkgGUI::CheckConnectionConfig { } {
1393  variable win
1394
1395  array set connConfig [ ::TolPkg::GetUpgradeConfig ]
1396  if { $connConfig(localPKG) } {
1397    MessageDlg $win.ask -title [ mc "Warning" ] \
1398        -icon warning \
1399        -type ok \
1400        -message [ mc "Can not continue. You have configured to use only local packages. Check the value of\nTolConfigManager::Config::Upgrading::TolPackage::LocalOnly." ]
1401    return 0
1402  }
1403  return 1
1404}
1405
1406proc ::TolPkgGUI::UpgradePackages { { pkgs {} } } {
1407  variable installData
1408  variable nodesInfo
1409  variable tree
1410
1411  if { ![ CheckConnectionConfig ] } {
1412    return
1413  }
1414  array unset installData
1415  if { [ llength $pkgs ] } {
1416    foreach p $pkgs {
1417      array set installData $p
1418      lappend upgradeList [ lindex $p 0 ]
1419    }
1420  } else {
1421    # upgrade all, look for the list
1422    if { [ info exists nodesInfo(upgrade) ] } {
1423      foreach nid $nodesInfo(upgrade) {
1424        set p [ $tree item text $nid 0 ]
1425        lappend upgradeList $p
1426        set installData($p) $nid
1427      }
1428    } else {
1429      return
1430    }
1431  }
1432  DlgProcess $upgradeList -title [ mc "Upgrade packages" ] \
1433      -label [ mc "You are about to upgrade"]: \
1434      -beforestart ::TolPkgGUI::Upgrading \
1435      -cmditem "InstallThisPackage" -syncservers 1
1436}
1437
1438proc ::TolPkgGUI::UpdatePackageVersion { { pkgs {} } } {
1439  variable installData
1440  variable nodesInfo
1441  variable tree
1442
1443  puts "UpdatePackageVersion: $pkgs"
1444  if { ![ CheckConnectionConfig ] } {
1445    return
1446  }
1447 
1448  array unset installData
1449  set updateList {}
1450  if { [ llength $pkgs ] } {
1451    foreach p $pkgs {
1452      array set installData $p
1453      lappend updateList [ lindex $p 0 ]
1454    }
1455  } else {
1456    # update all, look for the list
1457    if { [ info exists nodesInfo(update) ] } {
1458      foreach nid $nodesInfo(update) {
1459        set p [ $tree item text $nid 0 ]
1460        lappend updateList $p
1461        set installData($p) $nid
1462      }
1463    } else {
1464      return
1465    }
1466  }
1467  DlgProcess $updateList -title [ mc "Update packages" ] \
1468      -label [ mc "You are about to update"]: \
1469      -beforestart ::TolPkgGUI::Updating \
1470      -cmditem "InstallThisPackage" -syncservers 1
1471}
1472
1473proc ::TolPkgGUI::RemovePackageVersion { { pkgs {} } { matchPkg {} } } {
1474  variable installData
1475  variable tree
1476
1477  set removeList {}
1478  if { [ llength $pkgs ] } {
1479    foreach p $pkgs {
1480      set _p [ lindex $p 0 ]
1481      if { $matchPkg eq "" || [ regexp "^${matchPkg}\\.(\\d+)\\.(\\d+)\$" \
1482                                    $_p ] } {
1483        lappend removeList $_p
1484      }
1485    }
1486  } elseif { $matchPkg ne "" } {
1487    return
1488  } else {
1489    foreach nid [ $tree item id {depth 2} ] {
1490      lappend removeList [ $tree item text $nid 0 ]
1491    }
1492  }
1493  if { ![ llength $removeList ] } {
1494    return
1495  }
1496  array unset installData
1497  DlgProcess $removeList -title [ mc "Remove packages" ] \
1498      -label [ mc "You are about to remove"]: \
1499      -beforestart ::TolPkgGUI::Removing \
1500      -cmditem "RemoveThisPackage" -syncservers 1
1501}
1502
1503proc ::TolPkgGUI::ImportSyncInfo { } {
1504  Unimplemented "Import Sync Info"
1505}
1506
1507proc ::TolPkgGUI::ExportSyncInfo { } {
1508  Unimplemented "Export Sync Info"
1509}
1510
1511proc ::TolPkgGUI::Unimplemented { title } {
1512  variable win
1513
1514  MessageDlg $win.ask -parent $win -title [ mc $title ] \
1515      -icon warning \
1516      -type ok -message [ mc "Unimplemented option" ]
1517}
1518
1519##
1520# Export packages --
1521#
1522# p == "" then the last installed version of every package is
1523# exported,
1524#
1525# [ llength $p ]>0 then all specified package is exported, if some
1526# packages is not installed then it is requested from the remote
1527# repository.
1528#
1529
1530# Funciones que hacen falta:
1531#
1532#  1- Crear un zip de un paquete local
1533#  2- Descargar un zip de un paquete remoto
1534#
1535proc ::TolPkgGUI::ExportPackageVersion { {pkgs ""} } {
1536  variable win
1537
1538  if { ![ CheckConnectionConfig ] } {
1539    return
1540  }
1541  if { ![ llength $pkgs ] } {
1542    Unimplemented "Export all packages"
1543    return
1544  }
1545  set remote {}
1546  set local {}
1547  foreach _p $pkgs {
1548    foreach { p s } $_p break
1549    if {  $s eq "upgupd" || $s eq "upgrade" || $s eq "new" } {
1550      lappend remote $p
1551    } else {
1552      lappend local $p
1553    }
1554  }
1555  if { [ llength $remote ] } {
1556    set ans [ MessageDlg $win.ask -title [ mc "Export packages" ] \
1557                  -icon warning \
1558                  -type okcancel -aspect 75 \
1559                  -message [ mc "The following package can not be exported because they are not installed:\n%s\n\nContinue?" $remote ] ]
1560    if { $ans == 1 } {
1561      return
1562    }
1563  }
1564  puts "ExportPackageVersion: $local"
1565  if { [ llength $local ] } {
1566    DlgProcess $local -title [ mc "Export packages" ] \
1567        -label [ mc "You are about to export"]: \
1568        -beforestart ::TolPkgGUI::Exporting \
1569        -customgui "CreateSelectDir" \
1570        -cmditem "ExportThisPackage"
1571  }
1572}
1573
1574proc ::TolPkgGUI::Exporting { } {
1575  DlgProcessSetLabel [ mc "Exporting" ]...
1576}
1577
1578proc ::TolPkgGUI::Installing { } {
1579  DlgProcessSetLabel [ mc "Installing" ]...
1580}
1581
1582proc ::TolPkgGUI::Upgrading { } {
1583  DlgProcessSetLabel [ mc "Upgrading" ]...
1584}
1585
1586proc ::TolPkgGUI::Removing { } {
1587  DlgProcessSetLabel [ mc "Removing" ]...
1588}
1589
1590proc ::TolPkgGUI::Updating { } {
1591  DlgProcessSetLabel [ mc "Updating" ]...
1592}
1593
1594proc ::TolPkgGUI::InstallingZip { } {
1595  DlgProcessSetLabel [ mc "Installing Zip" ]...
1596}
1597
1598proc ::TolPkgGUI::CreateSelectDir { f } {
1599  set varname [ DlgProcessGetVariableName "directory" ]
1600  upvar \#0 $varname var
1601
1602
1603  if { ![ info exists $varname ] } {
1604    trace add variable $varname write ::TolPkgGUI::OnChangeDirectory
1605  }
1606  label $f.lb -text [ mc "Output directory" ]:
1607  entry $f.ent -textvariable $varname
1608  button $f.btn -image folder_yellow_16 \
1609      -command "::TolPkgGUI::ChooseDir $varname"
1610  grid $f.lb -row 0 -column 0 -sticky w
1611  grid $f.ent -row 0 -column 1 -sticky ew
1612  grid $f.btn -row 0 -column 2 -sticky ew
1613  grid columnconfigure $f 1 -weight 1
1614  if { $var eq "" } {
1615    set var [ pwd ]
1616  } else {
1617    set var $var
1618  }
1619}
1620
1621proc ::TolPkgGUI::OnChangeDirectory { args } {
1622  set w [ DlgProcessGetWin ]
1623  set dir [ DlgProcessGetVariable directory ]
1624  if { [ file exists $dir ] && [ file writable $dir ] } {
1625    $w itemconfigure 0 -state normal
1626  } else {
1627    $w itemconfigure 0 -state disabled
1628  }
1629}
1630
1631proc ::TolPkgGUI::ChooseDir { varname } {
1632  variable win
1633 
1634  puts "upvar \#0 $varname var"
1635  upvar \#0 $varname var
1636
1637  set res [ tk_chooseDirectory -parent $win -initialdir $var \
1638                -mustexist 1 -title [ mc "Select output directory" ] ]
1639  if { $res ne "" } {
1640    set var $res
1641  }
1642}
1643
1644proc ::TolPkgGUI::ExportThisPackage { p } {
1645  set status [ TolPkg::ExportPackage $p [ DlgProcessGetVariable "directory" ] ]
1646  puts "::TolPkgGUI::ExportThisPackage $p ==> $status"
1647}
1648
1649proc ::TolPkgGUI::InstallThisPackage { p } {
1650  variable win
1651  variable urlmap
1652  variable installData
1653 
1654  if { [ info exists installData($p) ] } {
1655    set nid $installData($p)
1656    set REPO [ $win.tree item text $nid REPO ]
1657    set repo $urlmap($REPO)
1658  } else {
1659    # packages requested as a dependencie
1660    set repo ""
1661  }
1662  set result [ TolPkg::RemoteInstall $p $repo ]
1663  puts "TolPkg::RemoteInstall $p: $result"
1664  return $result
1665}
1666
1667proc ::TolPkgGUI::RemoveThisPackage { p } {
1668  set result [ TolPkg::RemovePackage $p ]
1669  puts "TolPkg::RemovePackage $p: $result"
1670  return $result
1671}
1672
1673proc ::TolPkgGUI::InstallThisZip { p } {
1674  variable win
1675  variable urlmap
1676  variable installZipData
1677 
1678  puts "::TolPkgGUI::InstallThisZip $p"
1679  set idx [ DlgProcessGetCurrentIndex ]
1680  set thisZip [ lindex $installZipData $idx ]
1681  set result [ TolPkg::ZipInstall $thisZip ]
1682  puts "::TolPkgGUI::InstallThisZip $p: $result"
1683}
1684
1685proc ::TolPkgGUI::Show { } {
1686  variable win
1687
1688  set win .tolpkg
1689
1690  if { [ winfo exists $win ] } {
1691    raise $win
1692  } else {
1693    toplevel $win
1694    wm state $win withdrawn
1695    CreateTree $win.tree
1696    ::TolPkg::UpdateRepositoryInfo
1697    FillTreeInfo $win.tree
1698    wm state $win normal
1699  }
1700}
1701
1702proc ::TolPkgGUI::test { } {
1703  destroy .tolpkg
1704  ::TolPkgGUI::Show
1705}
1706
1707if { 0 } {
1708  ::TolPkg::UpdateRepositoryInfo
1709  ::TolPkgGUI::test
1710}
Note: See TracBrowser for help on using the repository browser.