source: tol/tolbase/lib/toltk/tolpkg_gui.tcl @ 35458ba

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

refs #1191, se implementa UpdateAll y UpgradeAll

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

  • Property mode set to 100644
File size: 65.6 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 ] product_update_32 ] == -1 } {
373    image create photo product_update_32 -data {
374      R0lGODlhIAAgAOf/AAAjAgEkAAQwBhM1DQM8AAA/AAs+Dhk7EwpCAxhAEQBKAQNOACVBHxRJCgBS
375      ABJNDipHJAVYABlQGABdAC5NLx9WHUVHRClTKABoAABvAAZtBjZbNRZyAEJgPEBiN0FjOCFxDhB4
376      ACtuJTFvM0RpQz1tOSt1JACGAACHACh5IDxxNhp/ERCDB2FjYE5sRyZ/HQCPAEF3PByJEWlraACZ
377      BAGcADSLKCCUElGBTA2fAEOKOCiUJ0CLPnd5dmOCW3V6fGGDYlCLR0uQN2CGXlWORBilGXx+e3uA
378      ghisACOoEBGtFEiYRH6DhYGDgFuWUi2oKQy1ECiuJDioMoiKh1ufWG+YYyK7BI2RlFmpU2yiYzu5
379      JmWqT0q1N12wUi3DJSvGGm+rZUy5Q2SvYHmoale5RG6wYnqrc1u4Uj7FMzDOJXiyeD7MJHi0bVHF
380      RZeplnS5cKKnqUHRNKaopU/MQ1/ISXDBaT7XMIu4hqesrpuyl17NXDreK62vrKuwsnrFdHPKape8
381      jLCyr4zBjWHUU1DdQE3dSUngOVXbUKG9m5fCiovIf5LFi33OdXDUZGHcUnbUa1zfTJjKkLLAtK3E
382      qbDDr3DebKvHpI3TiILZd2XmU4fYfl/qTX/dc1btT1rtR17rVlHxSnHma2DtWKjQpbjKt2zpZb7I
383      w7zKvnvmbJvZj8HMupTfjKrYpITodsDQtqDcn2H2V77VuqDhnbjXuqPhl6fgnWz4Y8DYvLHfq4P0
384      cZ3plbbfs8/U18bZxc/Wy4/wi73hvKzoq5L1iIH8d9Lb1sjgxL3mud3a39fc36bynrTtqs7izeLb
385      59rf4tfh3N7g3Nzh5L/uutPm0s3o0uLg5MPtwLfztcjtyN/k57L5rOni79Ts0Ofl6dDw0uPo6ubp
386      5eHr5uXq7e7n8+vp7ffp9+zu6+/t8env8ffs8+vx5vTt+dL8z+b058/+yezy9PPw9e/y7vL08fbz
387      +PD19+P83/3y+fvz//n3+/P5+/f59vX88Pf9//v9+v78//3//P///yH+EUNyZWF0ZWQgd2l0aCBH
388      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDBwP5W8iwocOHC6ckhEiRH798+PDlm+eP
389      ycR9FS1azIcxX7x57jpObLjPYr+XMO+R3BgPnrt9RyaKdNmPH7117dbRy3fvHkp4SPnlNKhwZz99
390      2XLZggWrU6ZKwdjdc/cO3jmcOvn18xcNkh07hjZ12kToC5Iwu+B9O3cOn5Gw/mRZgYIEjSNUrUId
391      QnMjgggcPsyFszsxn79dMFCwkLKqWzp46a49kqLiQQEElMzNu2uQj79+8UQsqKADV7979d6ps1cv
392      lZQuNzLcUTfvx8E+C90AYDDiVb93riKlWqRKXa1GmDApefJNXo+Dpv11ELChTD90iSD+2RqWbBAi
393      adY01fmD5I4936X9fRsAoQSrfpO8GKpU7doeLaao8802yvixiDzwFWSaLwl4EMQ09mxBQxSRvHNJ
394      EjWMMQ43HHIDzTkJEmRaOafEcks58AjhwAuW3MOGDRM4saEzzjxDzTnXxXdPP/XI8845RLiQBylm
395      9KIAAVWI00sWQ5AgyTshDoSHP8WMMosv6KgDCAcgrBDCLSZgMIk4o8RAQQBP5liQHP6w8gQPVAgS
396      yzNbnJADFFHcAAY14rzxwQEJEDNOlALh0Q84SbTBCBZLqEGNInQ4Qscix2hTDA8UAAAEN96oSZAc
397      +dQjBgpc/BEGLuRo8wwxzWijzTL+WFxgAAKn3EjoP3Lg8w4lC0Rggg5k4IKNq9o0s8sZKWiQARjc
398      NDPaQXDMEw42F0jQQAM7oFHJKrSswskcReTwlo3e7NPEQXK44804lJDyhgw0eFHIJ6KwtcYXaTTi
399      DKfnqGQQHO94g80443zDih5xGOKJJ6AsXEot1HATzjkpeTpQuthgAw001KgKjC6/CCNMMsY8ow03
400      3yAFjz8zQGuOxtA0I/MxzDBzzM01U+NNOe7YdBNCcpyz8czNIGO00TdHPM477jQ9TzkIwTGOzDIf
401      jfQxzWDjzTk2wYOPP/ksVRo+4YTjjTeccno21/jwAxI/8/ByBUICtdDEEXjnbQQS3kY0McXfUzQx
402      gwV0F2644QEBADs=
403    }
404  }
405  if { [ lsearch [ image names ] file_remove_32 ] == -1 } {
406    image create photo file_remove_32 -data {
407      R0lGODlhIAAgAOf/AMIABToqFMMWGMUaIFZBH1pFI11HJcYpKcYpL19JJ8gqKmBKKGFLKExOS2NM
408      JMIvLmVNJmZOJlFTUGlRKWxTJW5VJ3BXKcc9Os48PXhZLHBaPNE+P3ddL19hXntdNnpgMYFgLtFH
409      R4RjMHRnUWhqZ4hmM9FPT4VuT5JuNYtvQJNvNpRwN5VxOJZyOZdzOnZ4dZh0O5p1PIJ4bJt2PZx3
410      Pp14P555QJ96QKB7QYh+cs5qa4OAcqF8QqJ9Q8ttbKN+RKJ+SsxubaR/RZ2AUKN/S6aARqWATKeB
411      R6GDTaiCSKKETqmDSY6GgKWFSaOFT6qESqWGUKuFS5qIZ6yGTImLiK2HTaiJU66ITq2IVLCJT9l6
412      eLGKUJONjN95erKLUbGMV7OMUo+Rjq2OV7SNU7ONWbWOU6yPZLaPVLWPWt9/fZKUkbGRVKKTfLOS
413      VZmUkraRXOGBf7OTXLWUV7SUXbiTXeKDhrWVXrqUXraWX5ial7iXWreXYK2ZceGIibmZYaybfqib
414      irqaY+SLi7ycZL2dZZ+hnr6eZr+fZ8CgaOSSkMGhacChb8KiasOja+CWl8KjceaVmcSkbMalbcOl
415      eaeppcembsWmdKiqp+Sam8inb+Ccm8mocMiodsqpccmpd8uqcs2sc8yses+tdc2te7Cyruejoc2v
416      gsixgs+wfc6wg+mlo7K0sbO1su2opsa2n9G0s8y2ssi7qby+u+izsr2/vL7BvcHDv8LEwcPFwsTG
417      w8XHxMbIxdHFxeq+wcfJxu2/vMjKx9THx8nLyNTJvNXIyMrMye/CxenExcvOys3Py+3HyM7QzdvO
418      z+/JytHT0NLU0djT0tPV0t/S0tXX1OHU1NvW1NbY1enU19ja1t7Z2Nnb19rc2dze293f3N7g3d/h
419      3ubh3+Hk4Ojj4uPl4eTm4+Xn5Ozm5ebo5efp5ujq5+nr6Ors6fDr6evu6u3v6+7w7e/x7vXw7vDy
420      7/Hz8Pjy8fL08fP18vT38/b49Pf59vj69/n7+Pr8+fv9+v3//P///yH+EUNyZWF0ZWQgd2l0aCBH
421      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCAXWQkjFG7qEEHGhe1jQ1jhv7ihCLEgJ
422      XTp46brlEehN3blv796F2VjQWbp079y1a+fw3bpz4eDBY8WS4LN06tbNa5dxHLyM5+bNE9ZzYLSg
423      7ea5ewcv3Dx569Ldu4etqcBo64i+mwdPnrp59o7m0/fN679pRKfWk4d2Hr6r+/Spcwt3Krx69e7h
424      y7cPH75++OS5xeZ3XmDC/Pr587dP6WKqdO9BnjwZH9GejEaFGoXKlGlTqFKdNp3q1ClLnDwtSlhJ
425      lG3bnzbp3pQpUyVJwCU1YsSo0SPalX4DbzRckSJEhw4ZIkQo0KRhyc6p05bsIHTp1AP+iQ+0pzye
426      83RcYUMHz7E9e/N2ESy/5zweO3PmxEGD5kyZMmOAEYs26phDVz32xENPPV0JhIUVUESohBJIGGGh
427      hUBkyEd215SijFLxGKNMPPPIMlAVRRTxw4or8uDiizzcMg01iSQCyTHszKJKK7/M804HAolRRRVT
428      TBHFkU88scQSTSRhBi3dgKNJHX0IgomNmDTjIyUCtQHgGAF6scUWWWQxZBV/5MLNOOA40kUacFDZ
429      C13vICOQHnTkyR9/ZPRJxpiA4KJNOOFQY8IGGISgRTrrvNPONALJsd8ZXoY5pplVsHHJLs8QgwAA
430      oIIaRDfeYOOLQGW0YWmZQxqZpBTWheTCywOhDhCqDt5Mw9M/YmJKZBRKLpHEEUUMoYYtsAggKjQX
431      gHpANtFQIRCRrgo7bIoquijDKr68IoAP2GDD7AHMTHOqQEpem2KLPOBwww02pMCFLcUEM0242lQj
432      zTTJkDAQtj+86K4NNtRAwwwxxHCCG7cAk0w0907zDDLSDiQwvDUYjLALHLfAwgoe7ECKLsAIg0wx
433      skhQUAwF03BwDBy74PEKKqiAwgoulKDBCDkw8UIDBxVQggggfMBBBhZUQMEEEUDgwNMQMLBAAgYQ
434      EIBbWB8UEAA7
435    }
436  }
437  if { [ lsearch [ image names ] check_connection_32 ] == -1 } {
438    image create photo check_connection_32 -data {
439      R0lGODlhIAAgAOeWAGhoaGlpaQCUAGxsbACYAG5ubgCbAHFxcQCeAHNzcwChAACiAHR0dHV1dXZ2
440      dgClAHd3d3h4eACoAHl5eQumC3p6egCrAHt7ewCsAA6nDnx8fA+oD319fQCvAH5+foCAgACzAIGB
441      gQC1AIKCggC2AIODgwC4AEKeQoSEhAC5AIWFhYaGhoeHhwC9AImJiYqKioyMjI2NjY6Ojo+Pj5CQ
442      kJGRkZKSkpOTk5SUlJWVlZaWlpiYmJmZmVS3VJubm5ycnJ6enlS8VJ+fn6GhoaKioqOjo2y9bKen
443      p6ioqJSylKurq6ysrK6urq+vr7CwsLKysrOzs7S0tLW1tbe3t7i4uIfPh7y8vL29vb+/v8PDw8TE
444      xMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0rrcutPT09TU1NXV1dbW
445      1tfX19jY2NnZ2dra2tvb28jjyNzc3N3d3d7e3t/f3+Dg4OHh4eLi4uLj4uPj4+Tk5OXl5ebm5ufn
446      5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pr6+vn7
447      +fv7+/z8/P//////////////////////////////////////////////////////////////////
448      ////////////////////////////////////////////////////////////////////////////
449      ////////////////////////////////////////////////////////////////////////////
450      ////////////////////////////////////////////////////////////////////////////
451      ////////////////////////////////////////////////////////////////////////////
452      /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
453      SU1QACH5BAEKAP8ALAAAAAAgACAAAAj+AP8JHEiwoMGDCBMqXMiwoUOFLJCsMAjgocEYY9qooUGQ
454      RgCLBF+YWYPmjRwfXdZsqQFyoAs0cAqRKUMHzxEwcVoKZKGmDp0/isygsfPnyBudKtjkgYPmzqCg
455      SvX8aFnCTZ8/kNyoyVNI0Zk3fOSosDiiDSCihiC9YdMHkSI0cf6YsfiEUCM9awQhUvsG6KKhb4o0
456      rEDjRhtFlPi0IaQIEhw5ghopGqMFCEMOdCwJ4aGGUeI3hxhFimNHkJwtShhWaFMpUCMcO8o8Siwn
457      kaNIbtZoWcLwgplIlCrFYQRDxxhIlfrYYaSIThYmDCd8abToUSVJcAKNuOFFUvI6b7T+NNHAMEtj
458      OIIYVcJd50INLpQWmcnixMNAAQivHDr0SG2gRZU80gYaDchAhRv0cTAQAQwaNAUhd9xRyCOOmJVI
459      JYyo0cUBGtCwRAgDGSCiiATN8McgFZb2CCNr+GHIJHOEYcUEL9gnEAI44liQB1f0EdoadADyyFt7
460      BJFBGljwQJACCzS5wEElTJHHIYqoIYcfkCDSwwMPbJAECgNxKSZCDHzQxB2HJHJGHHxAUoUEcFJA
461      EJxwKjTCBEjAcYghZcCBxyFGYCCoBQIJKuhCb1SQABFoHELIGHKEIcUJHVRqaaUMxQFGBAX4IMYh
462      gHgRRQz/gGDqqSAwVMMWa3QBwQAtOWjRBRQzDCQCCbiSwFAAHA3kwAAqDGFDQSakkEJDFRXkgAMK
463      GtSCTtBG+1BAADs=
464    }
465  }
466  if { [ lsearch [ image names ] package_down_16 ] == -1 } {
467    image create photo package_down_16 -data {
468      R0lGODlhEAAQAPcAADJwKjZ6MUFqIkNsJ0ZvJkBvK096LVyAPUePQEuPQUqMRUuNRk2PSFeNQ1CS
469      S1WaTleZUVejTlikT2a2XGi4XWytZXysZ22+Yny/dnDCZXLFZnPGZ3THaH7AecODIsOEI8CFJcSF
470      JMWHJsaKKMeNK8iPLcmQLsmSL8iVMsuVMsyYNMiUO86dOd6fMtGkP+KqN+KpOOOrOua0Pea1P+y2
471      OOm1PcqQStCXU9KlQNOoQtSqRNWsRdWtR9awSdewSteyS9iyS9i0TNi0Tdm1Tdm1Ttm3T9WmUdqt
472      UNuxVuGnQOa1QuaxR+i+Q+m9ReSxTOi/SOi7T/W9QOWvVtuyYt25ada4cNy9d+a2a+W/b+SzdIDB
473      eoLCfYXDfuzFR/nESOHAcuDAfeDGfvXPf//Vd/XQePXQf/7WeIfFgZHKiZPLjJ3QlaDSl6nXoKvY
474      otvDidfTj97JlezFg+7Eg+3Gh+zKhOvMhOfMiO7KiPHPhvvchPfViffXi/DQjOXPku3SkurVnPHV
475      kPXXkPLWlf7flfjbnf/hm+3ZpfLdr+3evv/kpfnhqvrjqv/oq/fksvrksP/qs//ptv/rt/blv//q
476      uf/ruv/rvf/tvv/uwf/vwfvty//vyPnrzfrszv/wyf/yzvXr0vfu0f/z1P/z1f/01//12f/02v/2
477      2//23fz24v324v724/744f344vz45v775//+8P//9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
478      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
479      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
480      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
481      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAALEALAAAAAAQABAA
482      AAjnAGMJHBgLiA+CCAcK+fHHzg4dCQcG6dNK1aFGX1wkJBIGFKxXmY7sUSRoCguBRYYY+oQIjpsq
483      VAKJIbSIjpEUQlZt8lMHC5IVnEhNGjQmUZ4TP1iFcoSnDBknjiAVMhOlBqASPVKVElVJD4cNGS54
484      ofEECh8SPFCN8qSJkoY2bCh0aaJkyZ0ROlCF6mTp0YQ1aiQwmREjSRwROVydwhSJUYQ0aBDIgNHi
485      ipwQOKxIMnXpzYMzXAK8kDIniw0PAlmAsZCgwhYtDgAcuPEBoQoUDSB0wLCgAIjaEU0YYKBgQIiI
486      CAkIiBgQADs=
487    }
488  }
489  if { [ lsearch [ image names ] software_update_16 ] == -1 } {
490    image create photo software_update_16 -data {
491      R0lGODlhEAAQAPYAAM5cAM5dAM9dAM5dAc9dAc9eAc9eAs9fAs9eA89fBNBeAdBfAtBfA9FhBNFh
492      BdBhBtBiB9FjCNFjCtFkCtJkCtNlC9RlCNJmDdJnD9ptDdJoENNoENNpEt1xENhzHN96IN97IuF/
493      JfaDE/WEEvaFE/aGFfaFF/aKGfKIH/eNH/iQG/iRHfiSH9+FMeKAJu6FIO+FIfCHIvCHI/OKIPaL
494      I/KNK/iWIfWSL+OOPPGTNPSWN/iYMfmeMviaNPmhOfmhPfqmPvafRfahRvmiQfqnQPqoQfemTvSm
495      UveoUPWrV/u0V/u3XvayYvSzZvW0aPa3a/q0avq0a/u3bfa4bPm4aPu6cfu6cvm9cfrAdPvBdPzB
496      df7kv//qzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
497      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
498      BAEAAF0ALAAAAAAQABAAAAeYgF2Cg4SFhoIHCYeGBy04C4tdEhwGE1dYGgQYFwCFG1pTTUtKTk9Z
499      HoYBTEVEW1tEQFQIhQURRz42XFw2PEkVkIIEIEZDLCq6Kis/SC4GggYfQT1WurpVO0IhzoICEDkp
500      UrpSJzoUCoY1JSRRUCQjNwOGDjQyLyYiMDE0FoYMEAUMUMxwUOBBg06HBGTocC7SoAIEHEoUFAgA
501      Ow==
502    }
503  }
504  if { [ lsearch [ image names ] check_green_16 ] == -1 } {
505    image create photo check_green_16 -data {
506      R0lGODlhEAAQAPYAAACVAACWAACXAACYAACZAAKaAgOaAwecBwidCAmdCA6gDQ+gDhCgDxOgERWj
507      ExymGiSlISirJSqsJCqsJi+uKzCvLDKvLzayMTeyMjixNDy1Nz21OD61OT+1O0C2O0O1P0O4PUS4
508      PkW4P0m2REe5Qki7Q0q7REu7RlC+SlG6TFK6TF3CV17EWGjLWm3FZmnJYm7JZ3LMZnnNb3TQbHjU
509      a3vPcHrTcoDTdYDUeYXWeYbQfoXUfYfeeojeeovaf43VhY/VhY7WhonYgozdgI/dhJDXh5Peh5HV
510      iJHWiZLWiZLaiZPaiZbdjJTfjJnbkJ3elJHmhJTkh5rljpnikJ/ml57rkZ/qkqDgl6HgmKHimKbl
511      nKjmn6XsmajqnanvnanmoKnooKzroazoo6zuoK7qpbHtp7LsqLPtqbLuqbfzrLnzr7zzsr/1tQAA
512      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
513      BAEAAG0ALAAAAAAQABAAAAeZgG2Cg4SCBQgLhYptBSouKQ+LgwYfRzJIEpKCDD8xMUUTmgkwSy1P
514      KxSaFlc0TDsVmgtKRkNZHoIAECMNBJssWj1kLxeCATpAQRYHbRFiUWFNGIMCSTU3VyQOQl1WZSWE
515      AxlOOT5bOGdVazMahQUdWEQ8ZlxpVBuLCidfUlBeaiiaHmwAM4aNDRCa2kwwgWZKiISCMHAQISkQ
516      ADs=
517    }
518  }
519  if { [ lsearch [ image names ] cdr_tick_16 ] == -1 } {
520    image create photo cdr_tick_16 -data {
521      R0lGODlhEAAQAPZ2ADd7MTh8Mph/Mpl/Mpp/MjqUMECFOWuPPUijPFWcTVKtQ1ymUlyjVGuqXGC1
522      UGi3XmyyYnS5ZZmAMo2vZo6waY+ya5Czb821b861cM63cs+3cs+3c9C4ddC4dtC5dtC5d9G6edK8
523      fdO9f4HKdoPJeILLeIbJeYXLeYXIeoXJeofMe4bMfIfNfInNfYnOfovPf9S+gNS/gtW/g43PgZDS
524      hK/LlcDAhdbAhdnGjtnGj9nGkNrHkdvJldzKltzKl93Mmt7NnN7NneTWruTXsObZs+batebatufb
525      t+fbuOfduujduujdvOnevtPhvurgwOvhwuvixezixOzixezjx+3jyO3kyu7lzO7mzO/mze/mzu/n
526      z/Dp1PHq1fHr1/Lr1vLr1/Lr2PTv3vXv3/Xw4fXx4vby5Pfz5vj16vn27Pn27fn37fv48fz69Pz6
527      9fz69vz79v379/37+P78+v79+/7+/P///v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
528      BAEAAHcALAAAAAAQABAAAAfMgHeCg4SFhjxOXGRgPgSOhR9zYjg/WHN1cx+PdwQfa3ZwITJedm5v
529      dpqDXzdbdj0ZY3NncnRzjgQ+QSAdUFlDYWpncWxtjQRMMCAePSKOMW1lXVJMjlEcHyBFtwRXQDoU
530      DQcEURsYF0fbTzsTECgJBEsaFzlbMY4iRBYQMy8GuEZWzIRp8qAGkgoQWrAIQEDQnDRfpkQwscCG
531      gxUnGDbshEaLEgU0UkAgUSLABwmEPoyhIgSBCxUjTG4ixCNJlQIMGAowRGgAAQANCQUCADs=
532    }
533  }
534  if { [ lsearch [ image names ] database_1_16 ] == -1 } {
535    image create photo database_1_16 -data {
536      R0lGODlhEAAQAPeLAEdHR0dHSEtMTEtMTU1OTlNUVFRVVVZYWFdYWGFjY2JjY2JkZGNkZGVlZWRn
537      Z2VnZ2hoaGhpaWttbW5vb29xcXN1dXV3d3Z2eHh5eXl5eXh6enl6enp6en19f3x+fn6AgICCgoGD
538      g4mLi4qKjI6Ojo6OkJGRkZGRk5OUlJSUlZSUlpSVlpWWlpaXl5iXl5aXmJeYmJeYmZmYmJmampqb
539      m5ydnZycn5+fn6CgoKCgoqGioqCjo6Smpqeoqautraytrq2urq2vr66vr66wr62vsLCxsbCysrGy
540      s7Gzs7Kzs7GztLKztbK0tbO1trS1tbW1tbS1trW2trW2t7W3t7e3ura4uLe4uLe6uri4ubm7u7q7
541      u7u7vru8vr29vb6/wb6/wr/AwMLCwsPDxMXFxcXGxsXGx8bGxsXFyMbHycjIycjJysvKysvLy8rL
542      zcvLzcvNzcvMzs3Nz8/Ozs7Oz8/Pz8/Q0tHR0tLS1NfX19bX2Nvb29vc3Nzc3Nzd3d3e3t/f39/g
543      4Ofn5/Dx8fX19vj4+fn5+fz8+/v8/Pz9/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
544      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
545      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
546      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
547      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
548      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
549      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIwALAAAAAAQABAA
550      AAjOABkJHEiwYEEyRnYg0fPnzRWDc+7YiaOmjBUtZNjIWUOQyZYveQQFamFBBI8xWQhCoYJmkKE9
551      QT4kqFBkCsEmXNoQStTHx4cFGKI4IRjjgoo0fMzMmICAQQYZBInYGJGiBokGAgpMuHGEoJQtbggh
552      2gMkxIMNTqoQVLIFDiFFfoD8xPAkCcEXF06IwROGhYQDCji4ILgkRwkYOExAIGCAgg6bA3t4aVOI
553      pxCzGqz8ILjiTJ1DiwANAeHAAxgaBQN0wEKnC4oIAwQAMEjbYEAAOw==
554    }
555  }
556  if { [ lsearch [ image names ] back_to_ou_16 ] == -1 } {
557    image create photo back_to_ou_16 -data {
558      R0lGODlhEAAQAPYAALRmJ33VJtuPGd+aHeGhHt+bL+WwKuaxPOe4PYnVPu3UAO3VE+3QF+7VHPDb
559      KvDYL/HdN8+kU+m9Q82nYt62Ztq1aeewY+K1dY3cQJDXSpXdUZvdW4jCZZHJaJbObu7PR+zJS/Hd
560      QezHU/DYVPLgTPPiWfPjWfPfZmZ3mHiGq3aIsH+Pt6u816Kx3LPA4b/P4r3F9L3G9s7Pzs/Pz8/S
561      18/T19LX3dLY39jY2Nvb29zc3N3d3cHM48vZ68vb79LY4Nba4NPV8dPZ+ePj4+np6ert/PHx8QAA
562      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
563      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
564      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
565      BAEAAEcALAAAAAAQABAAAAd8gEeCg4SFhR8RLIoshoIDBw8MFT0+Pi+GCCQQDgoNF0VFPIUEJiUg
566      IQsUQUJCLoUSJwJHIxMwMbcthQYiggUqKykrKyiGFo3HRwDIy8xAPz80RzY3NzVHHhwcHYJERkY5
567      R0PeOkcbGBgagjtDQzNHOOwyRxkBAQnM+Pn5gQA7
568    }
569  }
[633537f]570
571  if { [ lsearch [ image names ] folder_yellow_16 ] == -1 } {
572    image create photo folder_yellow_16 -data {
573      R0lGODlhEAAQAPYAAK+KGLGMGLOOGbKNGrKMG7OMG7OOG7SOGbSPGbWPH7SQGaOFI8GLNMmJN8Se
574      MMSXOcSfO9eQOuOePN6xLcOhN8WgNMahNcehNcmjNMijN8mmNcukN8ulN8umNsumN8KgOMeiOMei
575      OcemPMekPselPsemPtGnN9uqNeG9K+K4LeO/LOS8LeW/LeytO/G5OeTALPTHN/XMNvTBOffQNcun
576      QtGtQtCuSd6+Q922Sum8S/TCTvjETvjITvjOTe/USO7USfrTTfzaS/veTPzgTPzkTfzmUfvpXd3A
577      ZurTg/rrhvLgl/nrqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
578      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
579      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
580      BAEAAEwALAAAAAAQABAAAAeSgEyCg4SFhoeGBwgICgGIggYTKSssAgqXlwiEAC4yMDEzKi8vKioo
581      A4MALScYGxwesLAdFRcgTAASJj9GSUu+v0tKFkwEERlCREW8wEtIIUwFDTVAQUPJy75HggUMODw9
582      1NbKvTbbDzk7O9/h1w7bEDrp6evVPhqCCTTy++s3gwsfSJQoQWIEiYIjRFB4xLAhoUAAOw==
583    }
584  }
[5b6b63c]585}
586
587source [ file join $::TolPkgGUI::cwd tolpkg.tcl ]
588
[2d896ea]589proc ::TolPkgGUI::CmpVersion { v1 v2 } {
[5b6b63c]590  foreach { v11 v12 } { {} {} } break
591  foreach { n1 v11 v12 } [ split $v1 . ] break
592  foreach { v21 v22 } { {} {} } break
593  foreach { n2 v21 v22 } [ split $v2 . ] break
594  set cmp [ string compare $n1 $n2 ]
595  if { $cmp } {
596    return $cmp
597  } else {
[2d896ea]598    return [ expr { $v11 < $v21 ? -1 : ( $v11 > $v21 ? 1 : ( $v12 < $v22 ? -1 : ( $v12 > $v22 ? 1 : 0 ) ) ) } ]
[5b6b63c]599  }
600}
601
[e83ccac]602proc ::TolPkgGUI::ReadPackSyncInfo { } {
603  variable packSyncInfo
604
605  array unset packSyncInfo
606  foreach p [ ::TolPkg::GetPkgSyncInfo ] {
607    array set packSyncInfo $p
608  }
609}
610
611proc ::TolPkgGUI::ReadVersSyncInfo { } {
612  variable versSyncInfo
613
614  array unset versSyncInfo
615  foreach p [ ::TolPkg::GetVersSyncInfo ] {
616    array set versSyncInfo $p
617  }
618}
619
620proc ::TolPkgGUI::ReadLocalVersionInfo { } {
621  variable localVersionInfo
622
623  array unset localVersionInfo
624  foreach pv [ ::TolPkg::GetLocalPackages ] {
625    array set localVersionInfo $pv
626  }
627}
628
[633537f]629proc ::TolPkgGUI::GetRepoId { url } {
630  variable urlmap
631
632  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
633                   $url : "${url}repository.php" } ]
634  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ] 
635
636  return $repo
637}
638
[e4c69c1]639proc ::TolPkgGUI::GetPkgNode { T url p } {
640  variable urlmap
[e83ccac]641  variable treeParents
642  variable nodesInfo
643  variable packSyncInfo
644
645  if { [ info exists treeParents($p) ] } {
646    return treeParents($p)
647  }
[e4c69c1]648  set url [ expr { [ string range $url end-13 end ] eq "repository.php" ?
649                   $url : "${url}repository.php" } ]
[633537f]650  set repo [ expr { [ info exists urlmap($url) ] ? $urlmap($url) : "unknown" } ]
[e83ccac]651  if { [ info exists packSyncInfo($p) ] } {
652    array set packSync $packSyncInfo($p)
653    set lastlocal $packSync(lastlocal)
654    set lastremote $packSync(lastremote)
655    if { $lastlocal eq "" } {
656      set img "package_down_16"
657      set nodeStatus new
658      set statusLabel "new ($lastremote)"
659    } else {
660      set idx [ CmpVersion $lastremote $lastlocal ]
661      if { $idx <= 0 } {
662        # could be -1 (because of date error)
663        set img "cdr_tick_16"
664        set nodeStatus ok
665        set statusLabel "ok"
666      } else {
667        puts "$lastremote > $lastlocal"
668        set img "software_update_16"
669        set nodeStatus upgrade
670        set statusLabel "upgrade ($lastremote)"
671      }
672    }
673  } else {
674    set img ""
675    set nodeStatus unknown
676    set statusLabel "unknown"
677 }
[e4c69c1]678  set treeParents($p) [ $T insert [ list [ list $img $p ] [ list $statusLabel ] \
679                                        [ list $repo ] ] -at end -relative root \
680                                        -button auto ]
[633537f]681  set nodesInfo($treeParents($p),type) pkg
[e83ccac]682  set nodesInfo($treeParents($p),status) $nodeStatus
[455a6d5]683  lappend nodesInfo($nodeStatus) $treeParents($p)
[e83ccac]684}
685
[5b6b63c]686proc ::TolPkgGUI::FillTreeInfo { T } {
[e83ccac]687  variable packSyncInfo
688  variable versSyncInfo
[5b6b63c]689  variable localVersionInfo
690  variable treeParents
[00c4270]691  variable nodesInfo
[e83ccac]692  variable localMostRecent
693
694  array unset treeParents
695  array unset nodesInfo
696  ReadPackSyncInfo
697  ReadVersSyncInfo
698  ReadLocalVersionInfo
[5b6b63c]699
700  $T configure -table no -filter yes -columns {
701    { {image text} -tags NAME -label "Name" }
[e83ccac]702    { {text} -tags STATUS -label "Status" }
[e4c69c1]703    { {text} -tags REPO -label "Repository" }
[5b6b63c]704  }
705
706  # insert package information
[e83ccac]707  foreach p [ lsort [ array names packSyncInfo ] ] {
708    array unset pkg
709    array set pkg $packSyncInfo($p)
710    set url $pkg(url)
711    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
712                         $url : "${url}repository.php" } ]
713    GetPkgNode $T $pkgRepo $p
714  }
715 
716  set localVersionNames [ lsort -decreasing -command ::TolPkgGUI::CmpVersion \
717                              [ array names localVersionInfo ] ]
718
719  array unset localMostRecent
720  # insert version information
721  foreach pv $localVersionNames {
722    array unset pkg
723    array set pkg $localVersionInfo($pv)
724    set pkgRoot [ lindex [ split $pv . ] 0 ]
725    set url $pkg(_.autodoc.url)
726    set pkgRepo [ expr { [ string range $url end-13 end ] eq "repository.php" ?
727                         $url : "${url}repository.php" } ]
728    GetPkgNode $T $pkgRepo $pkgRoot
729
730    if { ![ info exists localMostRecent($pkgRoot) ] } {
731      # will be used in contextual menu
732      set localMostRecent($pkgRoot) $pv
733    }
734    if { [ info exists versSyncInfo($pv) ] } {
735      array set versSync $versSyncInfo($pv)
736      set dateremote $versSync(dateremote)
737      set datelocal $versSync(datelocal)
738      if { $datelocal eq "TheBegin" } {
[5b6b63c]739        set img "package_down_16"
[00c4270]740        set nodeStatus new
[e83ccac]741        set statusLabel "new"
[5b6b63c]742      } else {
[e83ccac]743        set idx [ string compare $dateremote $datelocal ]
[00c4270]744        if { $idx <= 0 } {
745          # could be -1 (because of date error)
746          set img "cdr_tick_16"
747          set nodeStatus ok
[e83ccac]748          set statusLabel "ok"
[00c4270]749        } else {
[acc9f1a]750          puts "$pv OUTDATED : $dateremote > $datelocal"
[00c4270]751          set img "software_update_16"
[e83ccac]752          set nodeStatus update
753          set statusLabel "outdated"
[00c4270]754        }
[5b6b63c]755      }
756    } else {
[e83ccac]757      set img ""
758      set nodeStatus unknown
[5b6b63c]759    }
[633537f]760    set repo [ GetRepoId $pkgRepo ]
761    set nid [ $T insert [ list [ list $img $pv ] [ list $statusLabel ] [ list $repo ] ] \
[5b6b63c]762                  -at end -relative $treeParents($pkgRoot) -button auto ]
[00c4270]763    set nodesInfo($nid,type) pkgver
764    set nodesInfo($nid,status) $nodeStatus
[455a6d5]765    lappend nodesInfo($nodeStatus) $nid
[e83ccac]766    foreach {{} d} $pkg(_.autodoc.dependencies) {
767      set _nid [ $T insert [ list [ list back_to_ou_16 $d ] ] \
[00c4270]768                    -at end -relative $nid -button no ]
[e83ccac]769      set nodesInfo($_nid,type) pkgdep
[5b6b63c]770    }
771  }
772}
773
[e4c69c1]774proc ::TolPkgGUI::CreateTreeWidget { t } {
775  variable tree $t
[5b6b63c]776
[e4c69c1]777  wtree $t
778  grid $t -row 1 -column 0 -sticky "snew"
779  set f [ winfo parent $t ]
[5b6b63c]780  grid rowconfigure $f 1 -weight 1
781  grid columnconfigure $f 0 -weight 1
782}
783
[e4c69c1]784proc ::TolPkgGUI::CreateTree { t } {
[5b6b63c]785  variable widgets
786
[e4c69c1]787  CreateTreeWidget $t
[5b6b63c]788
[e4c69c1]789  menu $t.cmenu -tearoff 0 \
790      -postcommand [ list ::TolPkgGUI::PostContextMenu $t $t.cmenu ]
791  $t configure -contextmenu $t.cmenu
[00c4270]792}
793
[455a6d5]794proc ::TolPkgGUI::EntryState { listName } {
795  upvar $listName v
796
797  if { [ info exists v ] && [ llength $v ] } {
798    return "normal"
799  } else {
800    return "disabled"
801  }
802}
803
[00c4270]804proc ::TolPkgGUI::PostContextMenu { T w } {
805  variable nodesInfo
[e83ccac]806  variable packSyncInfo
807  variable versSyncInfo
[2d896ea]808  variable localVersionInfo
[e83ccac]809  variable localMostRecent
[00c4270]810
811  $w delete 0 end
812  array set selectionInfo {
813    repo   ""
814    pkg    ""
815    pkgver ""
816  }
817  foreach nid [ $T selection get ] {
818    lappend selectionInfo($nodesInfo($nid,type)) $nid
819  }
[e83ccac]820  $w add command  -label "[ mc {Add New Repository} ]..." \
[00c4270]821      -command ::TolPkgGUI::AddNewRepository
822  set lenRepo [ llength $selectionInfo(repo) ]
823  if { $lenRepo } {
824    $w add cascade  -label "[ mc {Check Repository} ]" \
825        -menu $w.check
826    if { [ winfo exists $w.check ] } {
827      $w.check delete 0 end
828    } else {
829      menu $w.check -tearoff 0
830    }
831    if { $lenRepo > 1 } {
832      set labelCheck [ mc "Selected" ]
833    } else {
834      set labelCheck [ $T item text [ lindex $selectionInfo(repo) 0 ] 0 ]
835    }
836    $w.check add command -label $labelCheck \
837        -command "::TolPkgGUI::CheckRepository $labelCheck $lenRepo"
838    $w.check add command -label [ mc "All" ] \
839        -command "::TolPkgGUI::CheckRepository ALL -1"
840  }
841  $w add command -label [ mc "Sync with servers" ] \
842      -command "::TolPkgGUI::SyncServers"
843  $w add separator
[2d896ea]844  # preprocess selection of packages
845  set listNEW {}
846  set listUPD {}
847  set listUPG {}
848  set listEXP {}
849 
850  # process first the list of pkg
851  foreach nid $selectionInfo(pkg) {
852    set pkg [ $T item text $nid 0 ]
853    array unset pkgInfo
[e83ccac]854    if { [ info exists packSyncInfo($pkg) ] } {
855      array set pkgInfo $packSyncInfo($pkg)
856    } else {
857      set pkgInfo(lastremote) $localMostRecent($pkg)
858    }
[2d896ea]859    switch -exact $nodesInfo($nid,status) {
860      "new" {
[633537f]861        lappend listNEW [ list $pkgInfo(lastremote) $nid ]
[2d896ea]862      }
863      "upgrade" {
[633537f]864        lappend listUPG [ list $pkg $nid ]
[2d896ea]865      }
866      "ok" {
867      }
[e83ccac]868      "unknown" {
869      }
[2d896ea]870      default {
871        puts "unexpected status $status for pkg $pkg"
872      }
873    }
[633537f]874    lappend listEXP [ list $pkgInfo(lastremote) $nodesInfo($nid,status) $nid ]
[2d896ea]875  }
876  # next process the list of pkgver
877  foreach nid $selectionInfo(pkgver) {
878    set pkg [ $T item text $nid 0 ]
879    switch -exact $nodesInfo($nid,status) {
880      "new" {
881        if { [ lsearch $listNEW $pkg ] == -1 } {
[633537f]882          lappend listNEW [ list $pkg $nid ]
[00c4270]883        }
884      }
[2d896ea]885      "update" {
[633537f]886        lappend listUPD [ list $pkg $nid ]
[2d896ea]887      }
888      "ok" {
889      }
890      default {
891        puts "unexpected status $status for pkg $pkg"
892      }
[00c4270]893    }
[be70fb2]894    if { [ lsearch $listEXP $pkg ] == -1 } {
[633537f]895      lappend listEXP [ list $pkg $nodesInfo($nid,status) $nid ]
[2d896ea]896    }
897  }
898  # install list
899  if { [ llength $listNEW ] == 1 } {
[633537f]900    $w add command -label [ mc "Install %s" [ lindex [ lindex $listNEW 0 ] 0 ] ] \
901        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
[2d896ea]902  } elseif { [ llength $listNEW ] > 1 } {
903    $w add command -label [ mc "Install selected" ] \
[633537f]904        -command [ list ::TolPkgGUI::InstallPackages $listNEW ]
[00c4270]905  }
906  $w add command -label "[ mc {Install ZIP} ]..." \
907      -command "::TolPkgGUI::InstallZip"
[2d896ea]908  # update list
909  if { [ llength $listUPD ] == 1 } {
[633537f]910    $w add command \
911        -label [ mc "Update %s" [ lindex [ lindex $listUPD 0 ] 0 ] ] \
912        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
[2d896ea]913  } elseif { [ llength $listUPD ] > 1 } {
914    $w add command -label [ mc "Update selected" ] \
915        -command [ list ::TolPkgGUI::UpdatePackageVersion $listUPD ]
916  }
917  $w add command -label [ mc "Update all" ] \
[455a6d5]918      -command "::TolPkgGUI::UpdatePackageVersion" \
919      -state [ EntryState nodesInfo(update) ]
[2d896ea]920  # upgrade list
921  if { [ llength $listUPG ] == 1 } {
[633537f]922    $w add command \
923        -label [ mc "Upgrade %s" [ lindex [ lindex $listUPG 0 ] 0 ] ] \
924        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
[2d896ea]925  } elseif { [ llength $listUPG ] > 1 } {
926    $w add command -label [ mc "Upgrade selected" ] \
[633537f]927        -command [ list ::TolPkgGUI::UpgradePackages $listUPG ]
[2d896ea]928  }
929  $w add command -label [ mc "Upgrade all" ] \
[455a6d5]930      -command "::TolPkgGUI::UpgradePackages" \
931      -state [ EntryState nodesInfo(upgrade) ]
932
[00c4270]933  # export options
[2d896ea]934  $w add separator
935  if { [ llength $listEXP ] == 1 } {
[e4c69c1]936    $w add command -label [ mc "Export %s" [ lindex [ lindex $listEXP 0 ] 0 ] ]... \
[633537f]937        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
[2d896ea]938  } elseif { [ llength $listEXP ] > 1 } {
[e4c69c1]939    $w add command -label [ mc "Export selected" ]... \
[2d896ea]940        -command [ list ::TolPkgGUI::ExportPackageVersion $listEXP ]
941  } 
[e4c69c1]942  $w add command -label [ mc "Export all" ]... \
[2d896ea]943      -command [ list ::TolPkgGUI::ExportPackageVersion ]
[e83ccac]944  # SyncInfo import/export
945  $w add separator
946  $w add command -label [ mc "Import SyncInfo" ]... \
947      -command [ list ::TolPkgGUI::ImportSyncInfo ]
948  $w add command -label [ mc "Export SyncInfo" ]... \
949      -command [ list ::TolPkgGUI::ExportSyncInfo ]
950 
[00c4270]951}
952
953proc ::TolPkgGUI::AddNewRepository { } {
[633537f]954  variable win
955  variable urlmap
[00c4270]956
[633537f]957  set w $win.dlgAdd
958  if { ![ winfo exist $w ] } {
959    Dialog $w -title [ mc "Add repository"] \
960        -parent $win -modal local
961    set f [ $w getframe ]
962    label $f.lb -text [ mc "Repository" ]:
963    ComboBox $f.cb -values BPTP
964    grid $f.lb -row 0 -column 0 -sticky ew
965    grid $f.cb -row 0 -column 1 -sticky ew
966    grid columnconfigure $f 1 -weight 1
967    $w add -text Ok
968    $w add -text Cancel
969  }
970  set ans [ $w draw ]
971  if { $ans == 0 } {
972    set repo [ string trim [ [$w getframe].cb get ] ]
973    if { [ string range $repo 0 3 ] eq "http" } {
974      set url $repo
975    } else {
976      if { [ info exists urlmap($repo) ] } {
977        set url $urlmap($repo)
978      } else {
979       
980      }
981    }
982    puts "::TolPkg::AddRepository $url"
983    ::TolPkg::AddRepository $url
984  }
[00c4270]985}
986
987proc ::TolPkgGUI::SyncServers { } {
[e4c69c1]988  variable tree
989  update
[e83ccac]990  ::TolPkg::UpdateRepositoryInfo
[e4c69c1]991  $tree item delete all
992  FillTreeInfo $tree
[00c4270]993}
994
[633537f]995proc ::TolPkgGUI::StartProgressBar { } {
996  variable win
997  variable Progress
998
999  set Progress(status) "working"
1000  set Progress(state) 0
1001  $win configure -cursor watch
1002  foreach wc [ winfo children $win.dlgInstall ] {
1003    catch { $wc configure -cursor watch }
1004  }
1005}
1006
1007proc ::TolPkgGUI::DoneProgress { } {
1008  variable win
1009  variable Progress
1010
1011  set Progress(status) "stopped"
1012  Dialog::enddialog $win.dlgInstall 1
1013  $win configure -cursor ""
1014  foreach wc [ winfo children $win.dlgInstall ] {
1015    catch { $wc configure -cursor "" }
1016  }
1017}
1018
1019proc ::TolPkgGUI::AdvanceProgress { x } {
1020  variable Progress
1021
1022  if { $Progress(status) eq "working" } {
1023    set Progress(state) $x
1024    update
1025  }
1026}
1027
1028proc ::TolPkgGUI::InstallBtn1 { remote } {
1029  variable win
1030  variable Progress
1031
1032  set w $win.dlgInstall
1033  $w itemconfigure 0 -state disabled
1034  $w itemconfigure 1 -command ::TolPkgGUI::DoneProgress
1035  set f [ $w getframe ]
1036  $f.lb1 configure -text [ mc "Installing" ]...
1037  InstallTask $remote
1038}
1039
1040proc ::TolPkgGUI::DlgProcessBtn1 { } {
1041  variable win
1042  variable DlgProcessData
1043
1044  set w [ DlgProcessGetWin ]
1045  # disable button Ok
1046  $w itemconfigure 0 -state disabled
1047  # set cancel to finish progress
1048  $w itemconfigure 1 -command ::TolPkgGUI::DlgProcessStop
1049  eval $DlgProcessData(-beforestart)
1050  DlgProcessTask
1051}
1052
1053proc ::TolPkgGUI::DlgProcess { pkgs args } {
1054  variable win
1055  variable DlgProcessData
1056
1057  array unset DlgProcessData
1058  array set DlgProcessData {
1059    -title "Process packages"
1060    -beforestart ""
1061    -cmditem ""
1062    -cmdlabelitem ""
1063    -customgui ""
1064  }
1065  set DlgProcessData(-label) [ mc "You are about to process"]:
1066  array set DlgProcessData $args
1067  set DlgProcessData(items) $pkgs
1068  set DlgProcessData(status) "stopped"
1069  set DlgProcessData(state) ""
1070  set w [ DlgProcessGetWin ]
1071  if { ![ winfo exists $w ] } {
1072    Dialog $w -title $DlgProcessData(-title) \
1073        -parent $win -modal local -cancel 1 -separator 1
1074    set f [ $w getframe ]
1075    label $f.lb1
1076    listbox $f.list -selectmode single -background white \
1077        -relief flat -borderwidth 1 -highlightthickness 0 \
1078        -selectbackground #c3c3ff
1079    ProgressBar $f.pbar
1080    $w add -text Ok
1081    $w add -text Cancel
1082    grid $f.lb1 -row 0 -column 0 -sticky w
1083    grid $f.list -row 1 -column 0 -sticky snew
1084    grid $f.pbar -row 2 -column 0 -sticky e
1085    grid columnconfigure $f 0 -weight 1
1086    grid rowconfigure $f 1 -weight 1
1087    if { $DlgProcessData(-customgui) ne "" } {
1088      eval $DlgProcessData(-customgui) $f 3
1089    }
1090  } else {
1091    set f [ DlgProcessGetFrame ]
1092  }
1093  $f.pbar configure -maximum 1 \
1094      -variable ::TolPkgGUI::DlgProcessData(state,0)
1095  $f.pbar configure -variable ::TolPkgGUI::DlgProcessData(state)
1096 
1097  $f.lb1 configure -text $DlgProcessData(-label)
1098  $w itemconfigure 0 -state normal \
1099      -command [ list ::TolPkgGUI::DlgProcessBtn1 ]
1100  $w itemconfigure 1 -command "Dialog::enddialog $w 1"
1101  set lb [ DlgProcessGetList ]
1102  $lb delete 0 end
1103  foreach it $DlgProcessData(items) {
1104    if { $DlgProcessData(-cmdlabelitem) ne "" } {
1105      set labelIt [ $DlgProcessData(-cmdlabelitems) $it ]
1106    } else {
1107      set labelIt $it
1108    }
1109    $f.list insert end $it
1110  }
1111  set DlgProcessData(state) ""
1112  $w draw
1113}
1114
1115proc ::TolPkgGUI::DlgProcessGetCurrentIndex { } {
1116  variable DlgProcessData
1117
1118  return $DlgProcessData(current)
1119}
1120
1121proc ::TolPkgGUI::DlgProcessStart { } {
1122  variable win
1123  variable DlgProcessData
1124
1125  set lb [ DlgProcessGetList ]
1126  set total [ llength $DlgProcessData(items) ]
1127  set DlgProcessData(current) 0
1128  $lb selection clear 0 end
1129  $lb selection set 0
1130  $lb see 0
1131  set DlgProcessData(status) "working"
1132  set DlgProcessData(state) 0
1133  $win configure -cursor watch
1134  set w [ DlgProcessGetWin ]
1135  foreach wc [ winfo children $w ] {
1136    catch { $wc configure -cursor watch }
1137  }
1138}
1139
1140proc ::TolPkgGUI::DlgProcessAdvance { } {
1141  variable DlgProcessData
1142
1143  set i [ incr DlgProcessData(current) ]
1144  set lb [ DlgProcessGetList ]
1145  set total [ llength $DlgProcessData(items) ]
1146  $lb selection set $i
1147  $lb selection anchor $i
1148  $lb see $i
1149  if { $DlgProcessData(status) eq "working" } {
1150    set DlgProcessData(state) [ expr { double($i) / $total } ]
1151    update
1152  }
1153}
1154
1155proc ::TolPkgGUI::DlgProcessItem { p } {
1156  variable DlgProcessData
1157
1158  if { $DlgProcessData(-cmditem) ne "" } {
1159    $DlgProcessData(-cmditem) $p
1160  }
1161}
1162
1163proc ::TolPkgGUI::DlgProcessStop { } {
1164  variable win
1165  variable DlgProcessData
1166 
1167  set w [ DlgProcessGetWin ]
1168  $win configure -cursor ""
1169  foreach wc [ winfo children $w ] {
1170    catch { $wc configure -cursor "" }
1171  }
1172  set DlgProcessData(status) "stopped"
1173  Dialog::enddialog $w 1
1174}
1175
1176proc ::TolPkgGUI::DlgProcessGetWin { } {
1177  variable win
1178
1179  return $win.dlgProcess
1180}
1181
1182proc ::TolPkgGUI::DlgProcessGetFrame { } {
1183  variable win
1184
1185  set w [ DlgProcessGetWin ]
1186  return [ $w getframe ]
1187}
1188
1189proc ::TolPkgGUI::DlgProcessGetList { } {
1190  variable win
1191
1192  set w [ DlgProcessGetFrame ]
1193  return $w.list
1194}
1195
1196proc ::TolPkgGUI::DlgProcessSetLabel { text } {
1197  variable win
1198 
1199  set f [ DlgProcessGetFrame ]
1200  $f.lb1 configure -text $text
1201}
1202
1203proc ::TolPkgGUI::InstallPackages { pkgs } {
1204  variable win
1205  variable installData
1206
1207  array unset installData
1208  foreach p $pkgs {
1209    array set installData $p
1210    lappend _pkgs [ lindex $p 0 ]
1211  }
1212  set InstallList [ TolPkg::CheckPackagesToInstall $_pkgs ]
1213  if { ![ llength $InstallList ] } {
1214    set ans [ MessageDlg $win.ask -title [ mc "Install packages" ] \
1215                  -icon error \
1216                  -parent $win \
1217                  -type ok -aspect 75 \
1218                  -message [ mc "Could not connect with remote repository" ] ]
1219    return
1220  }
1221  puts "InstallPackages: $InstallList"
1222  DlgProcess $InstallList -title [ mc "Export packages" ] \
1223      -label [ mc "You are about to export"]: \
1224      -beforestart ::TolPkgGUI::Installing \
1225      -cmditem "InstallThisPackage"
1226 
1227}
1228
1229proc ::TolPkgGUI::DlgProcessGetVariableName { name } {
1230  return ::TolPkgGUI::DlgProcessData($name)
1231}
1232
1233proc ::TolPkgGUI::DlgProcessGetVariable { name } {
1234  variable DlgProcessData
1235
1236  return $DlgProcessData($name)
1237}
1238
1239proc ::TolPkgGUI::DlgProcessTask { } {
1240  variable win
1241  variable Progress
1242  variable DlgProcessData
1243 
1244  DlgProcessStart
1245  foreach p $DlgProcessData(items) {
1246    if { $DlgProcessData(status) ne "working" } break
1247    DlgProcessItem $p
1248    DlgProcessAdvance
1249  }
1250  DlgProcessStop 
1251}
1252
1253proc ::TolPkgGUI::InstallTask { remote } {
1254  variable win
1255  variable Progress
1256  variable InstallList
1257 
1258  set w $win.dlgInstall
1259  set f [ $w getframe ]
1260  set total [ llength $InstallList ]
1261  set i 0
1262  $f.list selection clear 0 end
1263  $f.list selection set 0
1264  $f.list see 0
1265  StartProgressBar
1266  foreach p $InstallList {
1267    if { $Progress(status) ne "working" } break
1268    if { $remote } {
1269      TolPkg::RemoteInstall $p
1270    } else {
1271      TolPkg::ZipInstall $p
1272    }
1273    incr i
1274    $f.list selection set $i
1275    $f.list selection anchor $i
1276    $f.list see $i
1277    AdvanceProgress [ expr { double($i) / $total } ]
1278  }
1279  DoneProgress
1280 
[00c4270]1281}
1282
[2d896ea]1283proc ::TolPkgGUI::InstallZip { } {
[633537f]1284  variable win
1285  variable installZipData
1286
1287  set installZipData [ tk_getOpenFile -defaultextension .zip -multiple 1 \
1288                           -parent $win -title [ mc "Select zip" ] \
1289                           -filetypes {{zip {.zip}}} ]
1290  if { $installZipData ne "" } {
1291    foreach f $installZipData {
1292      lappend zipList [ file tail $f ]
1293    }
1294    DlgProcess $zipList -title [ mc "Install Zip's" ] \
1295        -label [ mc "You are about to install zip"]: \
1296        -beforestart ::TolPkgGUI::InstallingZip \
1297        -cmditem InstallThisZip
1298  }
[2d896ea]1299}
1300
[633537f]1301proc ::TolPkgGUI::CheckConnectionConfig { } {
1302  variable win
1303
1304  array set connConfig [ ::TolPkg::GetUpgradeConfig ]
1305  if { $connConfig(localPKG) } {
1306    MessageDlg $win.ask -title [ mc "Warning" ] \
1307        -icon warning \
1308        -type ok \
1309        -message [ mc "Can not continue. You have configured to use only local packages. Check the value of\nTolConfigManager::Config::Upgrading::TolPackage::LocalOnly." ]
1310    return 0
1311  }
1312  return 1
[00c4270]1313}
1314
[633537f]1315proc ::TolPkgGUI::UpgradePackages { { pkgs {} } } {
1316  variable installData
[455a6d5]1317  variable nodesInfo
1318  variable tree
[633537f]1319
1320  if { ![ CheckConnectionConfig ] } {
1321    return
1322  }
1323  array unset installData
1324  if { [ llength $pkgs ] } {
1325    foreach p $pkgs {
1326      array set installData $p
1327      lappend upgradeList [ lindex $p 0 ]
1328    }
1329  } else {
1330    # upgrade all, look for the list
[455a6d5]1331    if { [ info exists nodesInfo(upgrade) ] } {
1332      foreach nid $nodesInfo(upgrade) {
1333        set p [ $tree item text $nid 0 ]
1334        lappend upgradeList $p
1335        set installData($p) $nid
1336      }
1337    } else {
1338      return
1339    }
[633537f]1340  }
1341  DlgProcess $upgradeList -title [ mc "Upgrade packages" ] \
1342      -label [ mc "You are about to upgrade"]: \
1343      -beforestart ::TolPkgGUI::Upgrading \
1344      -cmditem "InstallThisPackage"
1345}
1346
1347proc ::TolPkgGUI::UpdatePackageVersion { { pkgs {} } } {
1348  variable installData
[455a6d5]1349  variable nodesInfo
1350  variable tree
[633537f]1351
1352  puts "UpdatePackageVersion: $pkgs"
1353  if { ![ CheckConnectionConfig ] } {
1354    return
1355  }
1356 
1357  array unset installData
[455a6d5]1358  set updateList {}
[633537f]1359  if { [ llength $pkgs ] } {
1360    foreach p $pkgs {
1361      array set installData $p
1362      lappend updateList [ lindex $p 0 ]
1363    }
1364  } else {
[455a6d5]1365    # update all, look for the list
1366    if { [ info exists nodesInfo(update) ] } {
1367      foreach nid $nodesInfo(update) {
1368        set p [ $tree item text $nid 0 ]
1369        lappend updateList $p
1370        set installData($p) $nid
1371      }
1372    } else {
1373      return
1374    }
[633537f]1375  }
1376  DlgProcess $updateList -title [ mc "Update packages" ] \
1377      -label [ mc "You are about to update"]: \
1378      -beforestart ::TolPkgGUI::Updating \
1379      -cmditem "InstallThisPackage"
[00c4270]1380}
1381
[e83ccac]1382proc ::TolPkgGUI::ImportSyncInfo { } {
[acc9f1a]1383  Unimplemented "Import Sync Info"
1384}
1385
1386proc ::TolPkgGUI::Unimplemented { title } {
1387  variable win
1388
1389  MessageDlg $win.ask -parent $win -title [ mc $title ] \
1390      -icon warning \
1391      -type ok -message [ mc "Unimplemented option" ]
[e83ccac]1392}
1393
1394proc ::TolPkgGUI::ExportSyncInfo { } {
[acc9f1a]1395  Unimplemented "Export Sync Info"
[e83ccac]1396}
1397
1398##
1399# Export packages --
1400#
1401# p == "" then the last installed version of every package is
1402# exported,
1403#
1404# [ llength $p ]>0 then all specified package is exported, if some
1405# packages is not installed then it is requested from the remote
1406# repository.
1407#
[633537f]1408
1409# Funciones que hacen falta:
1410#
1411#  1- Crear un zip de un paquete local
1412#  2- Descargar un zip de un paquete remoto
1413#
1414proc ::TolPkgGUI::ExportPackageVersion { {pkgs ""} } {
1415  variable win
1416
1417  if { ![ CheckConnectionConfig ] } {
1418    return
1419  }
[acc9f1a]1420  if { ![ llength $pkgs ] } {
1421    Unimplemented "Export all packages"
1422    return
1423  }
[633537f]1424  set remote {}
1425  set local {}
1426  foreach _p $pkgs {
1427    foreach { p s } $_p break
1428    if { $s eq "upgrade" || $s eq "new" } {
1429      lappend remote $p
1430    } else {
1431      lappend local $p
1432    }
1433  }
1434  if { [ llength $remote ] } {
1435    set ans [ MessageDlg $win.ask -title [ mc "Export packages" ] \
1436                  -icon warning \
1437                  -type okcancel -aspect 75 \
1438                  -message [ mc "The following package can not be exported because they are not installed:\n%s\n\nContinue?" $remote ] ]
1439    if { $ans == 1 } {
1440      return
1441    }
1442  }
1443  puts "ExportPackageVersion: $local"
1444  if { [ llength $local ] } {
1445    DlgProcess $local -title [ mc "Export packages" ] \
1446        -label [ mc "You are about to export"]: \
1447        -beforestart ::TolPkgGUI::Exporting \
1448        -customgui "CreateSelectDir" \
1449        -cmditem "ExportThisPackage"
1450  }
1451}
1452
1453proc ::TolPkgGUI::Exporting { } {
1454  DlgProcessSetLabel [ mc "Exporting" ]...
1455}
1456
1457proc ::TolPkgGUI::Installing { } {
1458  DlgProcessSetLabel [ mc "Installing" ]...
1459}
1460
1461proc ::TolPkgGUI::Upgrading { } {
1462  DlgProcessSetLabel [ mc "Upgrading" ]...
1463}
1464
1465proc ::TolPkgGUI::Updating { } {
1466  DlgProcessSetLabel [ mc "Updating" ]...
1467}
1468
1469proc ::TolPkgGUI::InstallingZip { } {
1470  DlgProcessSetLabel [ mc "Installing Zip" ]...
1471}
1472
1473proc ::TolPkgGUI::CreateSelectDir { f row } {
1474  set varname [ DlgProcessGetVariableName "directory" ]
1475  upvar \#0 $varname var
1476
1477
1478  if { ![ info exists $varname ] } {
1479    trace add variable $varname write ::TolPkgGUI::OnChangeDirectory
1480  }
1481  frame $f.fdir
1482  label $f.fdir.lb -text [ mc "Output directory" ]:
1483  entry $f.fdir.ent -textvariable $varname
1484  button $f.fdir.btn -image folder_yellow_16 \
1485      -command "::TolPkgGUI::ChooseDir $varname"
1486  grid $f.fdir.lb -row 0 -column 0 -sticky w
1487  grid $f.fdir.ent -row 0 -column 1 -sticky ew
1488  grid $f.fdir.btn -row 0 -column 2 -sticky ew
1489  grid columnconfigure $f.fdir 1 -weight 1
1490  grid $f.fdir -row $row -column 0 -sticky ew
1491  if { $var eq "" } {
1492    set var [ pwd ]
1493  } else {
1494    set var $var
1495  }
1496}
1497
1498proc ::TolPkgGUI::OnChangeDirectory { args } {
1499  set w [ DlgProcessGetWin ]
1500  set dir [ DlgProcessGetVariable directory ]
1501  if { [ file exists $dir ] && [ file writable $dir ] } {
1502    $w itemconfigure 0 -state normal
1503  } else {
1504    $w itemconfigure 0 -state disabled
1505  }
1506}
1507
1508proc ::TolPkgGUI::ChooseDir { varname } {
1509  variable win
[e83ccac]1510 
[633537f]1511  puts "upvar \#0 $varname var"
1512  upvar \#0 $varname var
1513
1514  set res [ tk_chooseDirectory -parent $win -initialdir $var \
1515                -mustexist 1 -title [ mc "Select output directory" ] ]
1516  if { $res ne "" } {
1517    set var $res
1518  }
1519}
1520
1521proc ::TolPkgGUI::ExportThisPackage { p } {
1522  set status [ TolPkg::ExportPackage $p [ DlgProcessGetVariable "directory" ] ]
1523  puts "::TolPkgGUI::ExportThisPackage $p ==> $status"
1524}
1525
1526proc ::TolPkgGUI::InstallThisPackage { p } {
1527  variable win
1528  variable urlmap
1529  variable installData
1530 
1531  if { [ info exists installData($p) ] } {
1532    set nid $installData($p)
1533    set REPO [ $win.tree item text $nid REPO ]
1534    set repo $urlmap($REPO)
1535  } else {
1536    # packages requested as a dependencie
1537    set repo ""
1538  }
1539  set result [ TolPkg::RemoteInstall $p $repo ]
1540  puts "TolPkg::RemoteInstall $p: $result"
1541}
1542
1543proc ::TolPkgGUI::InstallThisZip { p } {
1544  variable win
1545  variable urlmap
1546  variable installZipData
1547 
1548  puts "::TolPkgGUI::InstallThisZip $p"
1549  set idx [ DlgProcessGetCurrentIndex ]
1550  set thisZip [ lindex $installZipData $idx ]
1551  set result [ TolPkg::ZipInstall $thisZip ]
1552  puts "::TolPkgGUI::InstallThisZip $p: $result"
[5b6b63c]1553}
1554
1555proc ::TolPkgGUI::Show { } {
[633537f]1556  variable win
1557
1558  set win .tolpkg
[5b6b63c]1559
[633537f]1560  if { [ winfo exists $win ] } {
1561    raise $win
[5b6b63c]1562  } else {
[633537f]1563    toplevel $win
1564    wm state $win withdrawn
1565    CreateTree $win.tree
1566    FillTreeInfo $win.tree
1567    wm state $win normal
[5b6b63c]1568  }
1569}
1570
1571proc ::TolPkgGUI::test { } {
[e4c69c1]1572  destroy .tolpkg
1573  ::TolPkgGUI::Show
[5b6b63c]1574}
1575
1576if { 0 } {
1577  ::TolPkg::UpdateRepositoryInfo
1578  ::TolPkgGUI::test
1579}
Note: See TracBrowser for help on using the repository browser.