├── .gitignore ├── LICENSE ├── .github └── workflows │ └── build.yml ├── package.json ├── fetchfw.go ├── kobofirmware.html ├── kfw.css ├── kfw.js └── kfw.db.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016-2023 Patrick G 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | push: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | contents: read 8 | pages: write 9 | id-token: write 10 | 11 | concurrency: 12 | group: pages 13 | cancel-in-progress: false 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | environment: 19 | name: github-pages 20 | url: '${{steps.deploy.outputs.page_url}}' 21 | steps: 22 | - name: Checkout 23 | uses: actions/checkout@v4 24 | - name: Setup Pages 25 | uses: actions/configure-pages@v5 26 | - name: Setup Node 27 | uses: actions/setup-node@v3 28 | with: 29 | node-version: 18 30 | cache: npm 31 | - name: Install dependencies 32 | run: npm install --include=dev 33 | - name: Build 34 | run: | 35 | set -e 36 | npm run browserify 37 | sed -i 's/kfw\.js/kfw.dist.js/g' kobofirmware.html 38 | mkdir _site 39 | mv kfw.css kfw.db.js kfw.dist.js kfw.dist.js.map kobofirmware.html _site 40 | - name: Upload 41 | uses: actions/upload-pages-artifact@v3 42 | - name: Deploy 43 | id: deploy 44 | uses: actions/deploy-pages@v4 45 | if: github.ref == 'refs/heads/gh-pages' 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kobostuff", 3 | "devDependencies": { 4 | "@babel/cli": "^7.21.0", 5 | "@babel/core": "^7.21.4", 6 | "@babel/preset-env": "^7.21.4", 7 | "babelify": "^10.0.0", 8 | "browserify": "^17.0.0", 9 | "core-js": "^2.6.12", 10 | "terser": "^5.17.1" 11 | }, 12 | "dependencies": { 13 | "@sentry/browser": "^7.49.0" 14 | }, 15 | "scripts": { 16 | "browserify": "browserify -d kfw.js -t babelify | terser -o kfw.dist.js --source-map=content=inline,url=kfw.dist.js.map" 17 | }, 18 | "babel": { 19 | "sourceMaps": "inline", 20 | "presets": [ 21 | [ 22 | "@babel/preset-env", 23 | { 24 | "useBuiltIns": "usage", 25 | "corejs": 2, 26 | "exclude": [ 27 | "es6.regexp.match", 28 | "es6.regexp.replace", 29 | "es6.regexp.split" 30 | ] 31 | } 32 | ] 33 | ] 34 | }, 35 | "browserslist": [ 36 | "ie 11", 37 | "edge >= 17", 38 | "firefox >= 24", 39 | "chrome >= 30", 40 | "safari >= 7", 41 | "opera >= 17", 42 | "ios >= 7.1", 43 | "android >= 4.4.4" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /fetchfw.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "crypto/md5" 8 | "encoding/hex" 9 | "errors" 10 | "fmt" 11 | "io" 12 | "io/fs" 13 | "maps" 14 | "net/http" 15 | "net/url" 16 | "os" 17 | "path/filepath" 18 | "slices" 19 | "strings" 20 | "time" 21 | ) 22 | 23 | func main() { 24 | if len(os.Args) <= 1 { 25 | os.Exit(2) 26 | } 27 | for _, u := range os.Args[1:] { 28 | if err := download(u); err != nil { 29 | if !errors.Is(err, os.ErrExist) { 30 | fmt.Fprintf(os.Stderr, "error: %s: %v\n", u, err) 31 | os.Exit(1) 32 | } 33 | fmt.Fprintf(os.Stderr, "warning: %s: %v\n", u, err) 34 | } 35 | } 36 | if _, err := times("firmwares"); err != nil { 37 | fmt.Fprintf(os.Stderr, "error: update times: %v\n", err) 38 | os.Exit(1) 39 | } 40 | } 41 | 42 | func download(u string) error { 43 | url, err := url.Parse(u) 44 | if err != nil { 45 | return err 46 | } 47 | if url.Scheme == "" || url.Host == "" || url.ForceQuery || url.RawQuery != "" || url.RawFragment != "" || url.Opaque != "" { 48 | return fmt.Errorf("bad url format") 49 | } 50 | 51 | var name string 52 | if i := strings.Index(url.Path, "/firmwares/"); i == -1 { 53 | return fmt.Errorf("extract path: does not contain /firmwares/") 54 | } else if x, err := filepath.Localize(url.Path[i+1:]); err != nil { 55 | return fmt.Errorf("localize path: %w", err) 56 | } else { 57 | name = x 58 | } 59 | dir := filepath.Dir(name) 60 | 61 | if _, err := os.Stat(name); err != nil && !errors.Is(err, fs.ErrNotExist) { 62 | return err 63 | } else if err == nil { 64 | return os.ErrExist 65 | } 66 | 67 | resp, err := http.Get(u) 68 | if err != nil { 69 | return err 70 | } 71 | defer resp.Body.Close() 72 | 73 | if resp.StatusCode != http.StatusOK { 74 | return fmt.Errorf("response status %d", resp.StatusCode) 75 | } 76 | 77 | var headers bytes.Buffer 78 | if _, err := fmt.Fprintf(&headers, "%s\r\n", u); err != nil { 79 | return err 80 | } 81 | if _, err := fmt.Fprintf(&headers, "HTTP/%d.%d %03d\r\n", resp.ProtoMajor, resp.ProtoMinor, resp.StatusCode); err != nil { 82 | return err 83 | } 84 | for _, key := range slices.Sorted(maps.Keys(resp.Header)) { 85 | for _, value := range resp.Header[key] { 86 | if _, err := fmt.Fprintf(&headers, "%s: %s\r\n", strings.ToLower(key), value); err != nil { 87 | return err 88 | } 89 | } 90 | } 91 | if _, err := fmt.Fprintf(&headers, "\r\n"); err != nil { 92 | return err 93 | } 94 | 95 | mod, err := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified")) 96 | if err != nil { 97 | return fmt.Errorf("parse modified time: %w", err) 98 | } 99 | 100 | if err := os.MkdirAll(dir, 0755); err != nil { 101 | return err 102 | } 103 | 104 | f, err := os.CreateTemp(dir, ".tmp") 105 | if err != nil { 106 | return err 107 | } 108 | defer func() { 109 | if f != nil { 110 | f.Close() 111 | if err := os.Remove(f.Name()); err != nil { 112 | fmt.Fprintf(os.Stderr, "warning: failed to remove %q: %v\n", f.Name(), err) 113 | } 114 | } 115 | }() 116 | 117 | sum := md5.New() 118 | if _, err := io.Copy(f, io.TeeReader(resp.Body, sum)); err != nil { 119 | return err 120 | } 121 | md5 := sum.Sum(nil) 122 | 123 | if err := f.Close(); err != nil { 124 | return err 125 | } 126 | if err := os.Chtimes(f.Name(), time.Time{}, mod); err != nil { 127 | return err 128 | } 129 | if err := os.Chmod(f.Name(), 0644); err != nil { 130 | return err 131 | } 132 | if err := os.Rename(f.Name(), name); err != nil { 133 | return err 134 | } 135 | f = nil 136 | 137 | if err := appendFile("headers.txt", headers.Bytes(), 0644); err != nil { 138 | return err 139 | } 140 | if err := appendFile("MD5SUMS", []byte(hex.EncodeToString(md5)+" ./"+name+"\n"), 0644); err != nil { 141 | return err 142 | } 143 | 144 | fmt.Printf("downloaded: %x %s\n", md5, name) 145 | return nil 146 | } 147 | 148 | func appendFile(name string, data []byte, perm os.FileMode) error { 149 | f, err := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, perm) 150 | if err != nil { 151 | return err 152 | } 153 | defer f.Close() 154 | 155 | if _, err := f.Write(data); err != nil { 156 | return err 157 | } 158 | return f.Close() 159 | } 160 | 161 | func times(name string) (time.Time, error) { 162 | fi, err := os.Stat(name) 163 | if err != nil { 164 | return time.Time{}, err 165 | } 166 | if !fi.IsDir() { 167 | return fi.ModTime(), nil 168 | } 169 | 170 | es, err := os.ReadDir(name) 171 | if err != nil { 172 | return time.Time{}, err 173 | } 174 | if len(es) == 0 { 175 | fmt.Printf("times: ignoring empty directory %q\n", name) 176 | return time.Time{}, nil 177 | } 178 | 179 | var newest time.Time 180 | for _, e := range es { 181 | t, err := times(filepath.Join(name, e.Name())) 182 | if err != nil { 183 | return time.Time{}, err 184 | } 185 | if t.After(newest) { 186 | newest = t 187 | } 188 | } 189 | if !newest.IsZero() && !fi.ModTime().Equal(newest) { 190 | fmt.Printf("times: changing %q from %s to %s\n", name, fi.ModTime(), newest) 191 | if err := os.Chtimes(name, time.Time{}, newest); err != nil { 192 | return newest, err 193 | } 194 | } 195 | return newest, nil 196 | } 197 | -------------------------------------------------------------------------------- /kobofirmware.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Kobo Firmware Downloads 11 | 12 | 13 | 34 | 35 | 36 | 37 | 38 | 39 | ^ 40 | 41 |
42 | 53 |
54 |
55 |

Kobo Firmware Downloads

56 |

57 | Kobo Firmware Downloads gets the latest official firmware 58 | download links from the Kobo API. It also provides links to 59 | older firmware versions and shows the latest version 60 | available to each affiliate. 61 |

62 |

63 | After you download the firmware for your device, extract the 64 | zip file into the .kobo folder on your Kobo 65 | eReader. 66 |

67 |

68 | Note for Aura H2O Edition 2 and Aura Edition 2: Kobo 69 | has 70 | actually released two versions of these devices. If the 71 | 7th digit of your serial number is a 2 you have the second 72 | version, otherwise you have the first version. 73 |

74 |

75 | Note for Clara BW: These links are currently only for 76 | devices with the model number N365. Do not use them with 77 | ones starting with P365. If you are unsure, do not use the 78 | links. 79 |

80 |

81 | Firmware release notifications: You can receive 82 | instant notifications for new firmware releases by joining 83 | the Telegram channel 84 | @KoboFirmware. 85 |

86 |
87 | 95 |
96 |
97 | 98 | 104 | 105 |
106 | 107 |
108 |

Latest Versions

109 |

The latest versions for each device.

110 |
111 | 112 | 113 | 114 |
115 |
116 |

117 | Missing firmware versions or devices? Have a feature request? 118 | Report an issue. 119 |

120 |
121 | 122 | 130 | 131 |
132 |

Version Matrix

133 |

Version availability by device.

134 |
135 | 136 | 137 | 138 |
139 |
140 |
141 | 142 |
143 |

Affiliates

144 |

The latest versions for individual affiliates.

145 |
146 | 147 | 148 | 149 |
150 |
151 |
152 | 153 |
154 |

Versions

155 |

All previous versions by hardware revision.

156 |

157 | 163 |
164 |
165 | 166 | 171 | 172 | 176 | 177 | 189 | 190 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | -------------------------------------------------------------------------------- /kfw.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | html, body { 5 | margin: 0; 6 | padding: 0; 7 | } 8 | html { 9 | font-size: 16px; 10 | } 11 | body { 12 | font-family: 'PT Serif', Georgia, serif; 13 | font-size: 1rem; 14 | line-height: 1.4; 15 | overflow-x: hidden; 16 | } 17 | header#main-header { 18 | background: #fafafa; 19 | border-bottom: 1px solid #ccc; 20 | } 21 | header#main-header > section { 22 | display: block; 23 | flex: 0 0 auto; 24 | padding: .75rem; 25 | } 26 | header#main-header > section p { 27 | margin: 1em 0; 28 | line-height: 1.5; 29 | } 30 | header#main-header .red { 31 | color: #d30000; 32 | } 33 | header#main-header > section h1 { 34 | font-size: 2em; 35 | margin: 0 0 .5rem 0; 36 | font-weight: normal; 37 | } 38 | header > section#main-header-1 { 39 | display: flex; 40 | flex-direction: row; 41 | align-items: flex-start; 42 | justify-content: flex-start; 43 | } 44 | header > section#main-header-1 > div { 45 | flex: 1; 46 | } 47 | header > section#main-header-1 > aside.ad { 48 | flex: 0 0 305px; 49 | width: 305px; 50 | max-height: 268px; 51 | height: 268px; 52 | } 53 | nav#main-nav { 54 | display: flex; 55 | flex-direction: row; 56 | align-items: center; 57 | justify-content: space-between; 58 | font-size: 14px; 59 | } 60 | nav#main-nav > div { 61 | flex: 0 0 auto; 62 | text-align: center; 63 | } 64 | nav#main-nav > div > a, 65 | nav#main-nav > div > span { 66 | display: inline-block; 67 | vertical-align: bottom; 68 | margin: .75rem; 69 | color: #333; 70 | text-decoration: none; 71 | border-bottom: 2px solid transparent; 72 | } 73 | nav#main-nav > div > a:link, 74 | nav#main-nav > div > a:visited { 75 | border-bottom-color: #aaa; 76 | outline: 0; 77 | } 78 | nav#main-nav > div > a:link:hover, 79 | nav#main-nav > div > a:visited:hover, 80 | nav#main-nav > div > a:link:active, 81 | nav#main-nav > div > a:link:focus, 82 | nav#main-nav > div > a:visited:active, 83 | nav#main-nav > div > a:visited:focus { 84 | color: #000; 85 | } 86 | nav#main-nav > div > a:link:hover, 87 | nav#main-nav > div > a:visited:hover { 88 | border-bottom-color: #000; 89 | } 90 | nav#jump { 91 | display: block; 92 | text-align: center; 93 | background: #eee; 94 | border-bottom: 1px solid #ccc; 95 | position: sticky; 96 | top: 0; 97 | z-index: 1000; 98 | } 99 | nav#jump a { 100 | display: inline-block; 101 | vertical-align: middle; 102 | padding: .25em 1em; 103 | } 104 | main#main-content { 105 | margin: 0 auto; 106 | max-width: 960px; 107 | } 108 | main#main-content > section { 109 | display: block; 110 | margin: .75rem; 111 | } 112 | main#main-content > section > h2 { 113 | font-weight: bold; 114 | font-size: 1.5rem; 115 | margin: 0; 116 | } 117 | main#main-content > section > h2 + p { 118 | margin: 0 0 1rem 0; 119 | } 120 | main#main-content > aside.ad { 121 | min-height: 90px; 122 | } 123 | footer#main-footer { 124 | display: block; 125 | border-top: 1px solid #ccc; 126 | background: #f4f4f4; 127 | color: #333; 128 | text-align: center; 129 | padding: .75rem; 130 | } 131 | a#jump-to-top { 132 | display: block; 133 | position: fixed; 134 | bottom: 0; 135 | left: 0; 136 | font-size: 1.5rem; 137 | font-weight: bold; 138 | width: 2rem; 139 | text-align: center; 140 | z-index: 999; 141 | } 142 | a#jump-to-top:hover { 143 | text-decoration: none; 144 | padding-bottom: .15em; 145 | } 146 | aside#error { 147 | display: block; 148 | position: fixed; 149 | bottom: 0; 150 | left: 0; 151 | right: 0; 152 | background: rgba(241, 191, 191, 0.95); 153 | border-top: 1px solid rgba(136, 32, 32, 0.4); 154 | z-index: 1001; 155 | font-size: .8rem; 156 | padding: .25rem; 157 | } 158 | aside#error.hidden { 159 | display: none; 160 | } 161 | 162 | aside.ad { 163 | display: block; 164 | background: #f5f5f5; 165 | margin: .75em; 166 | border: 1px solid #d6d6d6; 167 | } 168 | aside.ad::before { 169 | display: block; 170 | content: 'Advertisement'; 171 | line-height: 1; 172 | font-size: 9px; 173 | height: 9px; 174 | overflow: hidden; 175 | color: #666666; 176 | padding: 2px 2px; 177 | background: #ededed; 178 | } 179 | 180 | a:link, 181 | a:visited { 182 | color: #005bc4; 183 | text-decoration: none; 184 | } 185 | a:link:hover { 186 | text-decoration: underline; 187 | } 188 | 189 | .kfw { 190 | display: block; 191 | border: 1px solid #666; 192 | font-size: .85rem; 193 | background: #f4f4f4; 194 | } 195 | .kfw table { 196 | display: table; 197 | border-collapse: collapse; 198 | width: 100%; 199 | } 200 | .kfw table tr { 201 | display: table-row; 202 | background: #fff; 203 | } 204 | .kfw table th, 205 | .kfw table td { 206 | display: table-cell; 207 | padding: .5rem .75rem; 208 | } 209 | .kfw table th { 210 | text-align: left; 211 | background: #d3d3d3; 212 | font-weight: bold; 213 | white-space: nowrap; 214 | } 215 | .kfw table td { 216 | text-align: left; 217 | } 218 | .kfw table tbody tr:nth-child(odd) { 219 | background: #f4f4f4; 220 | } 221 | 222 | .kfw#kfw-latest { 223 | overflow-x: auto; 224 | } 225 | .kfw#kfw-latest table td.kfw-latest__version.cached::after { 226 | display: block; 227 | content: '(cached)'; 228 | font-size: 10px; 229 | float: right; 230 | } 231 | .kfw#kfw-latest table td.kfw-latest__links a, 232 | .kfw#kfw-latest table td.kfw-latest__links button { 233 | display: inline-block; 234 | vertical-align: baseline; 235 | margin: .2em; 236 | line-height: 1; 237 | background: #e9f3fa; 238 | border: 1px solid rgba(0, 0, 0, 0.1); 239 | color: #000; 240 | padding: .2em; 241 | text-decoration: none; 242 | outline: 0; 243 | white-space: nowrap; 244 | font-size: inherit; 245 | font-family: inherit; 246 | font-weight: inherit; 247 | cursor: pointer; 248 | user-select: none; 249 | } 250 | .kfw#kfw-latest table td.kfw-latest__links a:link:hover, 251 | .kfw#kfw-latest table td.kfw-latest__links a:visited:hover, 252 | .kfw#kfw-latest table td.kfw-latest__links button:hover { 253 | background: #cddee9; 254 | } 255 | .kfw#kfw-latest table td.kfw-latest__links a:link:focus, 256 | .kfw#kfw-latest table td.kfw-latest__links a:link:active, 257 | .kfw#kfw-latest table td.kfw-latest__links a:visited:focus, 258 | .kfw#kfw-latest table td.kfw-latest__links a:visited:active, 259 | .kfw#kfw-latest table td.kfw-latest__links button:active { 260 | border-color: rgba(0, 0, 0, 0.4); 261 | } 262 | .kfw#kfw-latest table td.kfw-latest__links a.primary, 263 | .kfw#kfw-latest table td.kfw-latest__links button.primary { 264 | background: #e9faf0; 265 | } 266 | .kfw#kfw-latest table td.kfw-latest__links a.primary:link:hover, 267 | .kfw#kfw-latest table td.kfw-latest__links a.primary:visited:hover, 268 | .kfw#kfw-latest table td.kfw-latest__links button.primary:link:hover, 269 | .kfw#kfw-latest table td.kfw-latest__links button.primary:visited:hover { 270 | background: #c9ebd7; 271 | } 272 | 273 | .kfw#kfw-matrix { 274 | overflow-x: auto; 275 | font-size: .75rem; 276 | } 277 | .kfw#kfw-matrix table th, 278 | .kfw#kfw-matrix table td { 279 | padding: .25rem; 280 | border: 1px solid #cccccc; 281 | } 282 | .kfw#kfw-matrix thead tr th { 283 | border-top: none; 284 | } 285 | .kfw#kfw-matrix tbody tr:last-child td { 286 | border-bottom: none; 287 | } 288 | .kfw#kfw-matrix th:first-child, 289 | .kfw#kfw-matrix td:first-child { 290 | border-left: none; 291 | } 292 | .kfw#kfw-matrix th:last-child, 293 | .kfw#kfw-matrix td:last-child { 294 | border-right: none; 295 | } 296 | .kfw#kfw-matrix table th.kfw-matrix__device, 297 | .kfw#kfw-matrix table td.kfw-matrix__device { 298 | min-width: 12rem; 299 | } 300 | .kfw#kfw-matrix table tr td.kfw-matrix__device { 301 | background: #f4f4f4; 302 | } 303 | .kfw#kfw-matrix table tr:nth-child(odd) td.kfw-matrix__device { 304 | background: #e9e9e9; 305 | } 306 | .kfw#kfw-matrix table th.kfw-matrix__version, 307 | .kfw#kfw-matrix table td.kfw-matrix__version { 308 | text-align: center; 309 | } 310 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--yes { 311 | background: rgba(185, 233, 185, 0.4); 312 | } 313 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--no { 314 | background: rgba(230, 187, 187, 0.4); 315 | } 316 | 317 | .kfw#kfw-affiliates { 318 | overflow-x: auto; 319 | font-size: .75rem; 320 | } 321 | .kfw#kfw-affiliates table th, 322 | .kfw#kfw-affiliates table td { 323 | border: 1px solid #a1a1a1; 324 | padding: .25rem; 325 | } 326 | .kfw#kfw-affiliates thead tr th { 327 | border-top: none; 328 | } 329 | .kfw#kfw-affiliates tbody tr:last-child td { 330 | border-bottom: none; 331 | } 332 | .kfw#kfw-affiliates th:first-child, 333 | .kfw#kfw-affiliates td:first-child { 334 | border-left: none; 335 | } 336 | .kfw#kfw-affiliates th:last-child, 337 | .kfw#kfw-affiliates td:last-child { 338 | border-right: none; 339 | } 340 | .kfw#kfw-affiliates th.kfw-affiliates__affiliate, 341 | .kfw#kfw-affiliates td.kfw-affiliates__affiliate { 342 | text-align: center; 343 | } 344 | .kfw#kfw-affiliates table tr td.kfw-affiliates__device { 345 | background: #f4f4f4; 346 | } 347 | .kfw#kfw-affiliates table tr:nth-child(odd) td.kfw-affiliates__device { 348 | background: #e9e9e9; 349 | } 350 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--latest { 351 | background: rgba(185, 233, 185, 0.4); 352 | } 353 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--outdated { 354 | background: rgba(230, 187, 187, 0.4); 355 | } 356 | 357 | .kfw#kfw-versions { 358 | overflow-x: auto; 359 | font-size: .875rem; 360 | } 361 | .kfw#kfw-versions table th, 362 | .kfw#kfw-versions table td { 363 | padding: .25rem; 364 | } 365 | .kfw#kfw-versions th.kfw-versions__date, 366 | .kfw#kfw-versions td.kfw-versions__date { 367 | text-align: center; 368 | min-width: 10rem; 369 | } 370 | .kfw#kfw-versions th.kfw-versions__version, 371 | .kfw#kfw-versions td.kfw-versions__version { 372 | text-align: center; 373 | } 374 | .kfw#kfw-versions th.kfw-versions__hardware, 375 | .kfw#kfw-versions td.kfw-versions__hardware { 376 | text-align: center; 377 | } 378 | .kfw#kfw-versions th.kfw-versions__notes, 379 | .kfw#kfw-versions td.kfw-versions__notes { 380 | min-width: 32rem; 381 | } 382 | .kfw#kfw-versions td.kfw-versions__hardware a:link, 383 | .kfw#kfw-versions td.kfw-versions__hardware a:visited { 384 | text-decoration: none; 385 | } 386 | 387 | .modal-wrapper { 388 | display: block; 389 | z-index: 1000000; 390 | background: rgba(0, 0, 0, 0.4); 391 | position: fixed; 392 | top: 0; 393 | left: 0; 394 | right: 0; 395 | bottom: 0; 396 | } 397 | .modal-wrapper .modal { 398 | display: block; 399 | text-align: left; 400 | background: #fff; 401 | color: #000; 402 | width: 500px; 403 | height: 60%; 404 | max-height: 60%; 405 | max-width: 100%; 406 | font-size: 0.85em; 407 | position: absolute; 408 | top: 0; 409 | left: 0; 410 | right: 0; 411 | bottom: 20%; 412 | margin: auto; 413 | box-shadow: 0 22px 70px 4px rgba(0, 0, 0, 0.26); 414 | border: 1px solid #333; 415 | } 416 | .modal-wrapper .modal.thin { 417 | height: 200px; 418 | } 419 | .modal-wrapper .modal .titlebar { 420 | display: block; 421 | padding: 6px 8px; 422 | border-bottom: 1px solid #333; 423 | background-color: #e8e6e8; 424 | width: 100%; 425 | } 426 | .modal-wrapper .modal .titlebar .title { 427 | color: #222; 428 | } 429 | .modal-wrapper .modal .titlebar .close { 430 | float: right; 431 | color: #005bc4; 432 | text-decoration: none; 433 | font: inherit; 434 | border: none; 435 | background: transparent; 436 | outline: 0; 437 | cursor: pointer; 438 | user-select: none; 439 | } 440 | .modal-wrapper .modal .titlebar .close:hover { 441 | text-decoration: underline; 442 | } 443 | .modal-wrapper .modal .body { 444 | display: block; 445 | overflow-y: auto; 446 | overflow-x: hidden; 447 | padding: 6px 8px; 448 | height: 100%; 449 | } 450 | .modal-wrapper .modal { 451 | display: flex; 452 | flex-direction: column; 453 | align-items: stretch; 454 | justify-content: flex-start; 455 | } 456 | .modal-wrapper .modal .titlebar { 457 | flex: 0 0 auto; 458 | } 459 | .modal-wrapper .modal .body { 460 | flex: 1; 461 | line-height: 1.5; 462 | } 463 | 464 | @media screen and (max-width: 540px) { 465 | .kfw#kfw-latest table .kfw-latest__hardware { 466 | display: none; 467 | } 468 | } 469 | @media screen and (max-width: 650px) { 470 | header#main-header > section h1 { 471 | text-align: center; 472 | } 473 | header > section#main-header-1 { 474 | flex-direction: column; 475 | align-items: center; 476 | justify-content: flex-start; 477 | } 478 | header > section#main-header-1 > aside.ad { 479 | flex: 0 0 150px; 480 | width: 100%; 481 | max-width: 100%; 482 | height: 163px; 483 | } 484 | nav#main-nav { 485 | flex-direction: column; 486 | justify-content: space-around; 487 | } 488 | } 489 | @media screen and (prefers-color-scheme: dark) { 490 | html, body { 491 | background: #0c0600; 492 | } 493 | header#main-header { 494 | background: #111; 495 | color: #fff; 496 | border-bottom-color: #333; 497 | } 498 | nav#main-nav > div > a, 499 | nav#main-nav > div > span { 500 | color: #ccc; 501 | } 502 | nav#main-nav > div > a:link, 503 | nav#main-nav > div > a:visited { 504 | border-bottom-color: #666; 505 | } 506 | nav#main-nav > div > a:link:hover, 507 | nav#main-nav > div > a:visited:hover, 508 | nav#main-nav > div > a:link:active, 509 | nav#main-nav > div > a:link:focus, 510 | nav#main-nav > div > a:visited:active, 511 | nav#main-nav > div > a:visited:focus { 512 | color: #fff; 513 | } 514 | nav#main-nav > div > a:link:hover, 515 | nav#main-nav > div > a:visited:hover { 516 | border-bottom-color: #fff; 517 | } 518 | nav#jump { 519 | background: #2a2a2a; 520 | border-bottom: 1px solid #444; 521 | } 522 | main#main-content { 523 | background: #0c0600; 524 | color: #e4ded9; 525 | } 526 | footer#main-footer { 527 | border-top-color: #333; 528 | background: #000; 529 | color: #ccc; 530 | } 531 | a:link, 532 | a:visited { 533 | color: #5fa2ee; 534 | } 535 | aside.ad { 536 | background: #222; 537 | border-color: #444; 538 | } 539 | aside.ad::before { 540 | color: #eee; 541 | background: #2c2c2c; 542 | } 543 | .kfw { 544 | border-color: #444; 545 | background: #222; 546 | } 547 | .kfw table tr { 548 | background: #0a0a0a; 549 | } 550 | .kfw table th { 551 | background: #212121; 552 | } 553 | .kfw table tbody tr:nth-child(odd) { 554 | background: #171717; 555 | } 556 | .kfw#kfw-latest table td.kfw-latest__links a, 557 | .kfw#kfw-latest table td.kfw-latest__links button { 558 | background: #244963; 559 | border: 1px solid rgba(0, 0, 0, 0.1); 560 | color: #eee; 561 | padding: .2em; 562 | text-decoration: none; 563 | outline: 0; 564 | white-space: nowrap; 565 | } 566 | .kfw#kfw-latest table td.kfw-latest__links a:link:hover, 567 | .kfw#kfw-latest table td.kfw-latest__links a:visited:hover, 568 | .kfw#kfw-latest table td.kfw-latest__links button:hover { 569 | background: #325c7a; 570 | } 571 | .kfw#kfw-latest table td.kfw-latest__links a:link:focus, 572 | .kfw#kfw-latest table td.kfw-latest__links a:link:active, 573 | .kfw#kfw-latest table td.kfw-latest__links a:visited:focus, 574 | .kfw#kfw-latest table td.kfw-latest__links a:visited:active, 575 | .kfw#kfw-latest table td.kfw-latest__links button:active { 576 | border-color: rgba(0, 0, 0, 0.4); 577 | } 578 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download { 579 | background: #285039; 580 | } 581 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download:link:hover, 582 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download:visited:hover { 583 | background: #3f6d53; 584 | } 585 | .kfw#kfw-matrix table th, 586 | .kfw#kfw-matrix table td { 587 | border-color: #444; 588 | } 589 | .kfw#kfw-matrix table tr td.kfw-matrix__device { 590 | background: #0c0c0c; 591 | } 592 | .kfw#kfw-matrix table tr:nth-child(odd) td.kfw-matrix__device { 593 | background: #131313; 594 | } 595 | .kfw#kfw-matrix table th.kfw-matrix__version, 596 | .kfw#kfw-matrix table td.kfw-matrix__version { 597 | text-align: center; 598 | } 599 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--yes { 600 | background: rgba(42, 71, 42, 0.4); 601 | } 602 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--no { 603 | background: rgba(49, 34, 34, 0.4); 604 | } 605 | .kfw#kfw-affiliates table th, 606 | .kfw#kfw-affiliates table td { 607 | border-color: #444; 608 | } 609 | .kfw#kfw-affiliates table tr td.kfw-affiliates__device { 610 | background: #0c0c0c; 611 | } 612 | .kfw#kfw-affiliates table tr:nth-child(odd) td.kfw-affiliates__device { 613 | background: #131313; 614 | } 615 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--latest { 616 | background: rgba(42, 71, 42, 0.4); 617 | } 618 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--outdated { 619 | background: rgba(49, 34, 34, 0.4); 620 | } 621 | } -------------------------------------------------------------------------------- /kfw.js: -------------------------------------------------------------------------------- 1 | import * as Sentry from "@sentry/browser" 2 | 3 | class KFWProxy { 4 | constructor(base = "https://kfw.api.pgaskin.net") { 5 | this.base = base 6 | } 7 | 8 | async latestVersion(id, affiliate = "kobo") { 9 | let version = "0.0" 10 | if (id == "00000000-0000-0000-0000-000000000381") 11 | version = "4.7.10364" // required to receive the next update 12 | if (id == "00000000-0000-0000-0000-000000000387") 13 | version = "4.28.17826" // required to receive the next update (17826 -> 17925) 14 | if (id == "00000000-0000-0000-0000-000000000388") 15 | version = "4.30.18838" // required to receive the next update (18838 -> 19086) 16 | if (id == "00000000-0000-0000-0000-000000000390") 17 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418) 18 | if (id == "00000000-0000-0000-0000-000000000391") 19 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418) 20 | if (id == "00000000-0000-0000-0000-000000000393") 21 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418) 22 | return await this.UpgradeCheck(id, affiliate, version) 23 | } 24 | 25 | async UpgradeCheck(id, affiliate = "kobo", version = "0.0", serial = "N0") { 26 | return await this.KoboAPI(`1.0/UpgradeCheck/Device/${id}/${affiliate}/${version}/${serial}`, true, KFWProxy.transformUpgrade) 27 | } 28 | 29 | static transformUpgrade(obj) { 30 | obj.UpgradeVersion = KFWProxy.#transformUpgradeVersion(obj.UpgradeURL) 31 | obj.UpgradeDate = KFWProxy.#transformUpgradeDate(obj.UpgradeURL, obj.UpgradeVersion) 32 | if (false) // debug 33 | if (Math.random() > .5) 34 | obj.UpgradeVersion = "1.2.3" 35 | return obj 36 | } 37 | 38 | static #transformUpgradeVersion(url) { 39 | // fallback 40 | if (!url) 41 | return "0.0" 42 | 43 | // overrides 44 | url = url.split("?")[0] 45 | if (url.endsWith("/kobo7/April2018/kobo-update-4.8.zip")) return "4.8.10956" 46 | if (url.endsWith("/kobo7/May2018/kobo-update-4.8.zip")) return "4.8.11090" 47 | if (url.endsWith("/kobo4/May2018/kobo-update-4.9.11311.zip")) return "4.9.11314" 48 | if (url.endsWith("/kobo5/May2018/kobo-update-4.9.11311.zip")) return "4.9.11314" 49 | if (url.endsWith("/kobo6/Aug2018/kobo-update-4.10.zip")) return "4.10.11591" 50 | if (url.endsWith("/kobo7/Aug2018/kobo-update-4.10.zip")) return "4.10.11591" 51 | 52 | // filename 53 | const m = url.match(/\/kobo-update-([0-9.]+(?:-s)?)(?:-TF[0-9]+|-TouchFW-[0-9]+)?\.zip/) 54 | if (!m || m.length != 2) 55 | throw new Error(`Failed to extract version from "${url}"`) 56 | return m[1] 57 | } 58 | 59 | static #transformUpgradeDate(url, version) { 60 | // fallback 61 | if (!url || !version || version == "0.0") 62 | return "Unknown" 63 | 64 | // overrides 65 | switch (version) { 66 | case "3.4.1": return "May 2014" 67 | case "4.6.9960": return "October 2017" 68 | case "4.6.10075": return "November 2017" 69 | case "4.9.11311": return "June 2018" 70 | case "4.9.11314": return "June 2018" 71 | case "4.28.17623": return "June 2021" // it was indeed built in May as it is in the URL, but we don't want to confuse people 72 | } 73 | 74 | // date folder 75 | const m = url.match(/\/firmwares\/kobo[0-9]+\/(.+?)\//) 76 | if (!m || m.length != 2) 77 | throw new Error(`Failed to extract date from "${url}" and "${version}"`) 78 | 79 | // month expansion 80 | let [month, year] = m[1].replace(/([0-9]+)/, " $1").split(" ") 81 | switch ((month = month.charAt(0).toUpperCase() + month.slice(1))) { 82 | case "Jan": month = "January"; break 83 | case "Feb": month = "February"; break 84 | case "Mar": month = "March"; break 85 | case "Apr": month = "April"; break 86 | case "Jun": month = "June"; break 87 | case "Jul": month = "July"; break 88 | case "Aug": month = "August"; break 89 | case "Sep": month = "September"; break 90 | case "Sept": month = "September"; break 91 | case "Oct": month = "October"; break 92 | case "Nov": month = "November"; break 93 | case "Dec": month = "December"; break 94 | case "Rakuten-": month = "Unknown"; break 95 | } 96 | return [month, year].join(" ").trim() 97 | } 98 | 99 | // -1[ab] 100 | static versionCompare(a, b) { 101 | // fallback 102 | if (!a) return -1; 103 | if (!b) return 1; 104 | 105 | // April 2019 -s version suffix. 106 | if (a.endsWith("-s") && b == a.substring(0, a.length - 2)) return 1 107 | if (b.endsWith("-s") && a == b.substring(0, b.length - 2)) return -1 108 | 109 | // version parts 110 | const as = a.split(".").map(x => parseInt(x, 10)) 111 | const bs = b.split(".").map(x => parseInt(x, 10)) 112 | 113 | // if 4.38/4.39+ branching, sort by only the build number 114 | if (as.length == 3 && bs.length == 3 && as[0] == 4 && bs[0] == 4 && as[1] >= 38 && bs[1] >= 38) { 115 | if (as[2] < bs[2]) return -1 116 | if (as[2] > bs[2]) return 1 117 | if (as[2] == bs[2] && as[1] == bs[1]) return 1 118 | // fall back to normal compare if not entirely equal 119 | } 120 | 121 | // normal version compare 122 | for (let i = 0; i < Math.max(as.length, bs.length); i++) { 123 | if (as[i] == null) return bs[i] == 0 ? 0 : -1 124 | if (bs[i] == null) return as[i] == 0 ? 0 : 1 125 | if (as[i] < bs[i]) return -1 126 | if (as[i] > bs[i]) return 1 127 | } 128 | return 0 129 | } 130 | 131 | async ReleaseNotes(n = 1) { 132 | if (typeof n === "string") { 133 | const m = n.match(/\/1\.0\/ReleaseNotes\/([0-9]+)/) 134 | if (!m || m.length != 2) 135 | throw new Error(`Failed to extract release note number from "${n}"`) 136 | n = m[1] 137 | } 138 | return await this.KoboAPI(`1.0/ReleaseNotes/${n}`, false, KFWProxy.transformNotes) 139 | } 140 | 141 | static transformNotes(html) { 142 | const css = `p{margin:0}` 143 | try { 144 | const doc = new DOMParser().parseFromString(html, "text/html") 145 | doc.head.appendChild(doc.createElement("style")).textContent = css 146 | return doc.documentElement.innerHTML 147 | } catch (ex) { 148 | // this happens on the Kobo Web Browser for some reason 149 | console.warn(`tranform notes failed ${ex}, falling back to innerHTML method`) 150 | const doc = document.createElement("div") 151 | doc.innerHTML = html 152 | return `${doc.innerHTML}` 153 | } 154 | } 155 | 156 | async KoboAPI(path, json = false, transform = null) { 157 | return await this.#request(`${this.base}/api.kobobooks.com/${path}`, json, transform) 158 | } 159 | 160 | // request batching 161 | 162 | #pending = null 163 | #PendingRequest = class { 164 | constructor(url, json = false, transform = null) { 165 | this.url = url 166 | this.transform = transform 167 | this.json = json 168 | this.promise = new Promise((a, b) => { 169 | this.resolve = a 170 | this.reject = b 171 | }) 172 | } 173 | } 174 | 175 | batch() { 176 | if (!this.#pending) 177 | this.#pending = [] 178 | } 179 | 180 | endBatch() { 181 | if (this.#pending) { 182 | this.#doBatch(...this.#pending) 183 | this.#pending = null 184 | } 185 | } 186 | 187 | async #request(url, json = false, transform = null) { 188 | const req = new this.#PendingRequest(url, json, transform) 189 | if (this.#pending && url.startsWith(`${this.base}/api.kobobooks.com/`)) { 190 | this.#pending.push(req) 191 | } else { 192 | this.#do(req) 193 | } 194 | return req.promise 195 | } 196 | 197 | async #do(req) { 198 | const xhr = new XMLHttpRequest() 199 | xhr.addEventListener("load", ev => this.#doResponse(req, xhr.responseText, xhr.status, xhr.statusText, xhr.getResponseHeader("X-KFWProxy-Request-Id"))) 200 | xhr.addEventListener("error", ev => req.reject(new Error(`Request to "${req.url}" failed`))) 201 | xhr.addEventListener("abort", ev => req.reject(new Error(`Request to "${req.url}" aborted`))) 202 | xhr.open("GET", req.url) 203 | xhr.send() 204 | return await req.promise 205 | } 206 | 207 | async #doBatch(...req) { 208 | if (req.length == 0) { 209 | return 210 | } 211 | const xhr = new XMLHttpRequest() 212 | xhr.addEventListener("load", ev => { 213 | const requestID = xhr.getResponseHeader("X-KFWProxy-Request-Id") 214 | try { 215 | if (xhr.status != 200) 216 | throw `${xhr.status} ${xhr.statusText}` 217 | const rsp = JSON.parse(xhr.responseText) 218 | if (!Array.isArray(rsp)) 219 | throw `response not an array` 220 | if (rsp.length != req.length) 221 | throw `found ${rsp.length} responses, but expected ${req.length}` 222 | for (let i = 0; i < req.length; i++) 223 | this.#doResponse(req[i], rsp[i].body, rsp[i].status, "", requestID) 224 | } catch (ex) { 225 | for (const r of req) 226 | r.reject(new Error(`Batch request including "${r.url}" failed: ${ex}`)) 227 | Sentry.captureException(new Error(`Batch request failed: ${ex}`), { 228 | extra: {requestID}, 229 | }) 230 | return 231 | } 232 | }) 233 | xhr.addEventListener("error", ev => req.forEach(r => r.reject(new Error(`Batch request including "${r.url}" failed`)))) 234 | xhr.addEventListener("abort", ev => req.forEach(r => r.reject(new Error(`Batch request including "${r.url}" aborted`)))) 235 | xhr.open("GET", `${this.base}/api.kobobooks.com?h=1&x=${req.map(r => encodeURIComponent(r.url.replace(`${this.base}/api.kobobooks.com/`, ""))).join("&x=")}`) 236 | xhr.send() 237 | return await Promise.all(req.map(r => r.promise)) 238 | } 239 | 240 | #doResponse(req, body, status, statusText = "", requestID = null) { 241 | if (status != 200) { 242 | req.reject(new Error(`Request to "${req.url}" failed: ${status} ${statusText}`)) 243 | Sentry.captureException(new Error(`Request to "${req.url}" failed: ${status} ${statusText}`), { 244 | extra: {requestID}, 245 | }) 246 | return 247 | } 248 | let obj = body 249 | if (req.json) { 250 | try { 251 | obj = JSON.parse(obj) 252 | } catch (ex) { 253 | req.reject(new Error(`Request to "${req.url}" failed: ${ex}`)) 254 | return 255 | } 256 | } 257 | if (req.transform) { 258 | try { 259 | obj = req.transform(obj) 260 | } catch (ex) { 261 | req.reject(new Error(`Request to "${req.url}" failed: transform error: ${ex}`)) 262 | return 263 | } 264 | } 265 | req.resolve(obj) 266 | } 267 | } 268 | 269 | class KFWArchive { 270 | #md5sums 271 | constructor(base = "https://kfw.storage.pgaskin.net") { 272 | this.base = base 273 | } 274 | async files() { 275 | return this.#md5sums ||= await new Promise((resolve, reject) => { 276 | const url = this.base + "/MD5SUMS" 277 | const xhr = new XMLHttpRequest() 278 | xhr.addEventListener("load", ev => { 279 | if (xhr.status != 200) reject(new Error(`Request to "${url} failed: response status ${xhr.status}"`)) 280 | else resolve(xhr.responseText) 281 | }) 282 | xhr.addEventListener("error", ev => reject(new Error(`Request to "${url}" failed`))) 283 | xhr.addEventListener("abort", ev => reject(new Error(`Request to "${url}" aborted`))) 284 | xhr.open("GET", url) 285 | xhr.send() 286 | }).then(txt => txt 287 | .trim() 288 | .split("\n") 289 | .map(x => x.split(/\s+/, 2)) 290 | .map(([md5, fn]) => [ 291 | md5.toLowerCase(), 292 | fn.replace(/^.\//, "").replace(/^\/?firmwares\//, ""), 293 | ]) 294 | .map(([md5, fn]) => ({ 295 | md5, fn, url: this.base + "/firmwares/" + fn, 296 | })) 297 | ).catch(ex => { 298 | try { Sentry.captureException(new Error(`Failed to load kfw archive md5sums: ${ex}`)) } catch (ex) {} 299 | throw ex 300 | }) 301 | } 302 | async lookup(url) { 303 | const part = url.split("/firmwares/", 2).pop() 304 | const files = await this.files() 305 | return files.filter(x => x.fn == part).pop() || null 306 | } 307 | mirrorLink(url) { 308 | const part = url.split("/firmwares/", 2)[1] 309 | if (part) return base + "/firmwares/" + part 310 | return null 311 | } 312 | } 313 | 314 | // so we can load it deferred directly from the webpage 315 | const KoboFirmwareOldVersionsData = window.KoboFirmwareOldVersionsData = (() => { 316 | let resolve, reject 317 | let promise = new Promise((a, b) => { 318 | resolve = a 319 | reject = b 320 | }) 321 | let timeout = window.setTimeout(() => { 322 | if ("KoboFirmwareOldVersionsDataRaw" in window) { 323 | resolve(KoboFirmwareOldVersionsDataRaw) 324 | console.warn("async old versions load failed, but still found the data afterwards...") 325 | return 326 | } 327 | reject(new Error("Failed to load old versions data: Timed out")) 328 | console.error("old versions load failed") 329 | Sentry.captureException(new Error("Failed to load old versions data: Timed out")) 330 | }, 10000) 331 | promise.resolve = data => { 332 | window.clearTimeout(timeout) 333 | resolve(data) 334 | } 335 | return promise 336 | })() 337 | 338 | class KoboFirmwareDB { 339 | #db 340 | constructor(db = KoboFirmwareOldVersionsData) { 341 | this.#db = db // hardware, id, version, date, download 342 | } 343 | #__db 344 | async #_db() { 345 | if (this.#__db) 346 | return this.#__db 347 | this.#__db = (await this.#db) 348 | .sort(([,aid,aversion,,,], [,bid,bversion,,,]) => { 349 | const a = KFWProxy.versionCompare(aversion, bversion) 350 | return a == 0 ? aid.localeCompare(bid) : a 351 | }) 352 | return this.#__db 353 | } 354 | async versionsForDevice(id) { 355 | return (await this.#_db()) 356 | .filter(([,did,,,,]) => did == id) 357 | .reverse() // #_db sorts it asc, we want it desc 358 | .map(([hardware,,version,date,download]) => ({hardware, version, date, download})) 359 | } 360 | async versionsByDevice() { 361 | let tmp = (await this.#_db()) 362 | .reduce((acc, [,id,version,date,,]) => { 363 | (acc[id] = acc[id] || {})[version] = date 364 | return acc 365 | }, {}) 366 | for (const id in tmp) { 367 | let earliest 368 | for (const version in tmp[id]) 369 | if (!earliest || KFWProxy.versionCompare(earliest, version) == 1) 370 | earliest = version 371 | tmp[id].earliest = earliest 372 | } 373 | return tmp 374 | } 375 | async versions() { 376 | return Object.keys((await this.#_db()) 377 | .reduce((acc, [,,version,,,]) => { 378 | acc[version] = null 379 | return acc 380 | }, {})) 381 | .reverse() // #_db sorts it asc, we want it desc 382 | } 383 | async downloadsByVersion() { 384 | let tmp = [] 385 | let cur, curv 386 | let devs = {}, devsh = {} 387 | for (const [hardware,id,version,date,download,md5sum] of await this.#_db()) { 388 | if (curv != version) { 389 | if (cur) 390 | tmp.push(cur) 391 | cur = {version, date, for: {}, download: {[hardware]: download}} 392 | curv = version 393 | } 394 | if (hardware in cur.download) { 395 | if (cur.download[hardware] != download) 396 | cur.download[hardware] = "varies" // maybe make this add all by device id if needed later? 397 | } else { 398 | cur.download[hardware] = download 399 | } 400 | cur.for[id] = true 401 | if (!(id in devs)) { 402 | {devs[id] = hardware} 403 | (devsh[hardware] = devsh[hardware] || {})[id] = null 404 | } 405 | } 406 | tmp.push(cur) 407 | for (let i = 0; i < tmp.length; i++) { 408 | tmp[i].notfor = [] 409 | for (const hardware in tmp[i].download) 410 | for (const id in devsh[hardware]) 411 | if (!(id in tmp[i].for)) 412 | tmp[i].notfor.push(id) 413 | tmp[i].for = Object.keys(tmp[i].for) 414 | } 415 | return tmp 416 | } 417 | } 418 | 419 | class KoboFirmware { 420 | #kfw 421 | #db 422 | #affiliates 423 | #tolinoAffiliates 424 | #devices 425 | #archive 426 | 427 | get debug() { 428 | return { 429 | KFWProxy, KoboFirmwareDB, KoboFirmwareOldVersionsData, KoboFirmware, 430 | kfw: this.#kfw, 431 | db: this.#db, 432 | affiliates: this.#affiliates, 433 | tolinoAffiliates: this.#tolinoAffiliates, 434 | devices: this.#devices, 435 | req: this.#req, 436 | archive: this.#archive, 437 | } 438 | } 439 | 440 | constructor( 441 | kfw = new KFWProxy(), 442 | db = new KoboFirmwareDB(), 443 | archive = new KFWArchive(), 444 | affiliates = [ 445 | "kobo", 446 | "bestbuyca", 447 | "fnac", 448 | "beta", 449 | "rakutenbooks", 450 | "walmartca", 451 | ], 452 | tolinoAffiliates = [ 453 | // TODO 454 | ], 455 | devices = [ 456 | ["kobo3", "00000000-0000-0000-0000-000000000310", "Kobo Touch A/B"], 457 | ["kobo4", "00000000-0000-0000-0000-000000000320", "Kobo Touch C"], 458 | ["kobo4", "00000000-0000-0000-0000-000000000340", "Kobo Mini"], 459 | ["kobo4", "00000000-0000-0000-0000-000000000330", "Kobo Glo"], 460 | ["kobo6", "00000000-0000-0000-0000-000000000371", "Kobo Glo HD"], 461 | ["kobo6", "00000000-0000-0000-0000-000000000372", "Kobo Touch 2.0"], 462 | ["kobo5", "00000000-0000-0000-0000-000000000360", "Kobo Aura"], 463 | ["kobo4", "00000000-0000-0000-0000-000000000350", "Kobo Aura HD"], 464 | ["kobo5", "00000000-0000-0000-0000-000000000370", "Kobo Aura H2O"], 465 | ["kobo6", "00000000-0000-0000-0000-000000000374", "Kobo Aura H2O Edition 2 v1"], 466 | ["kobo7", "00000000-0000-0000-0000-000000000378", "Kobo Aura H2O Edition 2 v2"], 467 | ["kobo6", "00000000-0000-0000-0000-000000000373", "Kobo Aura ONE"], 468 | ["kobo6", "00000000-0000-0000-0000-000000000381", "Kobo Aura ONE Limited Edition"], 469 | ["kobo6", "00000000-0000-0000-0000-000000000375", "Kobo Aura Edition 2 v1"], 470 | ["kobo7", "00000000-0000-0000-0000-000000000379", "Kobo Aura Edition 2 v2"], 471 | ["kobo7", "00000000-0000-0000-0000-000000000382", "Kobo Nia"], 472 | ["kobo7", "00000000-0000-0000-0000-000000000376", "Kobo Clara HD"], 473 | ["kobo7", "00000000-0000-0000-0000-000000000380", "Kobo Forma"], 474 | ["kobo7", "00000000-0000-0000-0000-000000000384", "Kobo Libra H2O"], 475 | ["kobo8", "00000000-0000-0000-0000-000000000387", "Kobo Elipsa"], 476 | ["kobo8", "00000000-0000-0000-0000-000000000383", "Kobo Sage"], 477 | ["kobo9", "00000000-0000-0000-0000-000000000388", "Kobo Libra 2"], 478 | ["kobo10", "00000000-0000-0000-0000-000000000386", "Kobo Clara 2E"], 479 | ["kobo11", "00000000-0000-0000-0000-000000000389", "Kobo Elipsa 2E"], 480 | ["kobo13", "00000000-0000-0000-0000-000000000390", "Kobo Libra Colour"], // kobo11 for 4.39.22861 and below 481 | ["kobo12", "00000000-0000-0000-0000-000000000391", "Kobo Clara BW (N365)"], 482 | ["kobo12", "00000000-0000-0000-0000-000000000393", "Kobo Clara Colour"], 483 | // ["kobo11", "00000000-0000-0000-0000-000000000690", "tolino vision colour"], 484 | // ["kobo12", "00000000-0000-0000-0000-000000000691", "tolino shine"], 485 | // ["kobo12", "00000000-0000-0000-0000-000000000693", "tolino shine color"], 486 | ], 487 | ) { 488 | this.#kfw = kfw 489 | this.#db = db 490 | this.#archive = archive 491 | this.#affiliates = affiliates 492 | this.#tolinoAffiliates = tolinoAffiliates 493 | this.#devices = [] 494 | for (const device of devices) { 495 | if (!Array.isArray(device) || device.length != 3) 496 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: incorrect length`) 497 | 498 | const [hardware, id, name] = device 499 | if (!hardware || typeof hardware !== "string" || !hardware.startsWith("kobo")) 500 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad hardware`) 501 | if (!id || typeof id !== "string" || id.length != 36) { 502 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad id`) } 503 | if (!name || typeof name !== "string" || name.length == 0) 504 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad device`) 505 | this.#devices.push({hardware, id, name}) 506 | } 507 | this.#load() 508 | } 509 | 510 | #req // [device][affiliate]Promise 511 | #load() { 512 | this.#req = {} 513 | for (const device of this.#devices) { 514 | this.#kfw.batch() 515 | this.#req[device.id] = {} 516 | for (const affiliate of (device.id.startsWith("00000000-0000-0000-0000-0000000006") ? this.#tolinoAffiliates : this.#affiliates)) 517 | this.#req[device.id][affiliate] = this.#kfw.latestVersion(device.id, affiliate) // note that a Promise's result/rejection can be used multiple times 518 | this.#kfw.endBatch() 519 | } 520 | this.#archive.files() 521 | } 522 | 523 | #ctr(link, ...x) { 524 | if (window.goatcounter) { 525 | const fn = () => { 526 | for (const [evt, name] of x) { 527 | const ct = window.goatcounter.url({ 528 | event: true, 529 | path: `kfw-${evt}`, 530 | title: `${name}`, 531 | }) 532 | if (!ct) 533 | continue 534 | navigator.sendBeacon(ct) 535 | } 536 | } 537 | link.addEventListener("click", fn, false) 538 | link.addEventListener("auxclick", fn, false) 539 | } 540 | } 541 | 542 | async renderLatest(table) { 543 | const ths = document.createDocumentFragment() 544 | KoboFirmware.#el(ths, "th", "Model", ["kfw-latest__model"]) 545 | KoboFirmware.#el(ths, "th", "Hardware", ["kfw-latest__hardware"]) 546 | KoboFirmware.#el(ths, "th", "Version", ["kfw-latest__version"]) 547 | KoboFirmware.#el(ths, "th", "Date", ["kfw-latest__date"]) 548 | KoboFirmware.#el(ths, "th", "Links", ["kfw-latest__links"]) 549 | table.querySelector("thead tr").appendChild(ths) 550 | 551 | // load the initial data 552 | const trm = {} 553 | const trs = document.createDocumentFragment() 554 | for (const device of this.#devices) { 555 | const tr = KoboFirmware.#el(trs, "tr") 556 | trm[device.id] = { 557 | model: KoboFirmware.#el(tr, "td", device.name, ["kfw-latest__model"], {title: `ID: ${device.id}`}), 558 | hardware: KoboFirmware.#el(tr, "td", device.hardware, ["kfw-latest__hardware"]), 559 | version: KoboFirmware.#el(tr, "td", "Loading", ["kfw-latest__version"]), 560 | date: KoboFirmware.#el(tr, "td", null, ["kfw-latest__date"]), 561 | linksw: KoboFirmware.#el(tr, "td", null, ["kfw-latest__links"]), 562 | } 563 | const linksw1 = KoboFirmware.#el(trm[device.id].linksw, "span", null, [], {style: "display: inline-block; vertical-align: top;"}) // to control wrapping 564 | const linksw2 = KoboFirmware.#el(trm[device.id].linksw, "span", null, [], {style: "display: inline-block; vertical-align: top;"}) // to control wrapping 565 | trm[device.id].links = { 566 | download: KoboFirmware.#el(linksw1, "a", "Download", ["kfw-latest__links__download"], {style: "display: none;", rel: "noopener"}), 567 | notes: KoboFirmware.#el(linksw1, "a", "Notes", ["kfw-latest__links__notes"], {style: "display: none;", rel: "noopener", target: "_blank"}), 568 | affiliates: KoboFirmware.#el(linksw2, "button", "Other Affiliates", ["kfw-latest__links__affiliates"], {style: "display: none;"}), 569 | versions: KoboFirmware.#el(linksw2, "button", "Other Versions", ["kfw-latest__links__versions"], {}), 570 | } 571 | trm[device.id].links.versions.addEventListener("click", ev => { 572 | KoboFirmware.#modal(`Other versions for ${device.name}`, async () => { 573 | const frag = document.createDocumentFragment() 574 | for (const version of await this.#db.versionsForDevice(device.id)) { 575 | const isHardwareException = device.id === "00000000-0000-0000-0000-000000000390" && version.hardware === "kobo11" && ["4.39.22801", "4.39.22861"].includes(version.version); 576 | 577 | if (version.hardware !== device.hardware || !version.download.includes(device.hardware)) 578 | if (!isHardwareException) 579 | console.warn("possible hardware mismatch", device, version) 580 | const el = KoboFirmware.#el(frag, "div", `${version.version} - ${version.date} - Download - ${version.hardware}${isHardwareException ? " (yes, this is correct)" : ""}`, [], {}, true) 581 | 582 | // stats 583 | this.#ctr(el.querySelector("a"), 584 | [`dl`, "Firmware"], 585 | [`dl-version-${version.version}`, `Firmware ${version.version}`], 586 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`], 587 | ) 588 | 589 | // archive 590 | this.#archive.lookup(version.download).then(dl => { 591 | if (dl) { 592 | const mirror = el.querySelector("span.mirror") 593 | KoboFirmware.#el(mirror, "span", " (") 594 | KoboFirmware.#el(mirror, "a", "mirror", [], {href: dl.url}) 595 | KoboFirmware.#el(mirror, "span", ")") 596 | 597 | // stats 598 | this.#ctr(mirror.querySelector("a"), 599 | [`dl`, "Firmware"], 600 | [`dl-archive`, "Firmware"], 601 | [`dl-version-${version.version}`, `Firmware ${version.version}`], 602 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`], 603 | ) 604 | } 605 | }).catch(ex => {}) 606 | } 607 | return frag 608 | }) 609 | ev.preventDefault() 610 | }) 611 | } 612 | table.querySelector("tbody").appendChild(trs) 613 | 614 | // load each row async as data becomes available 615 | await Promise.all(this.#devices.map(device => (async device => { 616 | try { 617 | // load the latest update info and the affiliates which have it 618 | let latest, latests = [], anyAvailable = false 619 | for (const affiliate of (device.id.startsWith("00000000-0000-0000-0000-0000000006") ? this.#tolinoAffiliates : this.#affiliates)) { 620 | let info 621 | try { 622 | info = await this.#req[device.id][affiliate] 623 | } catch (ex) { 624 | // retry once more 625 | this.#req[device.id][affiliate] = this.#kfw.latestVersion(device.id, affiliate) 626 | info = await this.#req[device.id][affiliate] 627 | } 628 | switch (KFWProxy.versionCompare(latest?.UpgradeVersion, info.UpgradeVersion)) { 629 | case -1: // !latest || latest < info 630 | latest = info 631 | latests = [affiliate] 632 | break 633 | case 0: // latest == info 634 | latests.push(affiliate) 635 | break 636 | } 637 | anyAvailable ||= !!info?.UpgradeURL 638 | } 639 | 640 | if (!anyAvailable) { 641 | trm[device.id].version.textContent = "?" 642 | trm[device.id].date.textContent = "-" 643 | trm[device.id].links.versions.classList.add("primary") 644 | try { Sentry.captureException(new Error(`No update available for "${device.name}"`)) } catch (ex) {} 645 | 646 | ;(async () => { 647 | const data = await this.#db.versionsForDevice(device.id) 648 | if (data[0]) { 649 | trm[device.id].version.textContent = data[0].version 650 | trm[device.id].date.textContent = data[0].date 651 | trm[device.id].links.download.href = data[0].download 652 | trm[device.id].version.classList.add("cached") 653 | trm[device.id].links.download.classList.add("primary") 654 | trm[device.id].links.download.style.removeProperty("display") 655 | trm[device.id].links.versions.classList.remove("primary") 656 | } 657 | })() 658 | } else { 659 | // table cells 660 | trm[device.id].version.textContent = latest.UpgradeVersion 661 | trm[device.id].date.textContent = latest.UpgradeDate 662 | trm[device.id].version.setAttribute("title", `Affiliates with version: ${latests.join(", ")}`) 663 | 664 | // download 665 | if (latest.UpgradeURL) { 666 | trm[device.id].links.download.href = latest.UpgradeURL 667 | trm[device.id].links.download.classList.add("primary") 668 | trm[device.id].links.download.style.removeProperty("display") 669 | } 670 | 671 | // release notes 672 | trm[device.id].links.notes.href = latest.ReleaseNoteURL || "javascript:void(0);" 673 | trm[device.id].links.notes.addEventListener("click", ev => { 674 | if (navigator.userAgent.includes("MSIE") || navigator.userAgent.includes("Trident/")) { 675 | return // doesn't support srcdoc 676 | } 677 | KoboFirmware.#modal(`Release notes for ${latest.UpgradeVersion}`, async () => { 678 | const content = latest.ReleaseNoteURL ? await this.#kfw.ReleaseNotes(latest.ReleaseNoteURL) : "No release notes available." 679 | const frame = document.createElement("iframe") 680 | frame.srcdoc = content 681 | frame.setAttribute("sandbox", "") 682 | return frame 683 | }) 684 | ev.preventDefault() 685 | }); 686 | trm[device.id].links.notes.style.removeProperty("display") 687 | 688 | // affiliates 689 | trm[device.id].links.affiliates.addEventListener("click", ev => { 690 | KoboFirmware.#modal(`Versions of other affiliates for ${device.name}`, async () => { 691 | const frag = document.createDocumentFragment() 692 | for (const affiliate in this.#req[device.id]) { 693 | const info = await this.#req[device.id][affiliate] 694 | const a = KoboFirmware.#el(frag, "div", `${affiliate} - ${info.UpgradeVersion}${info.UpgradeURL ? ` - Download` : ``}`, [], {}, true) 695 | 696 | // stats 697 | this.#ctr(a, 698 | [`dl`, "Firmware"], 699 | [`dl-version-${info.UpgradeVersion}`, `Firmware ${info.UpgradeVersion}`], 700 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`], 701 | ) 702 | } 703 | return frag 704 | }, ["thin"]) 705 | ev.preventDefault() 706 | }); 707 | trm[device.id].links.affiliates.style.removeProperty("display") 708 | } 709 | 710 | // stats 711 | if (latest) { 712 | this.#ctr(trm[device.id].links.download, 713 | [`dl`, "Firmware"], 714 | [`dl-version-${latest.UpgradeVersion}`, `Firmware ${latest.UpgradeVersion}`], 715 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`], 716 | ) 717 | } 718 | } catch (ex) { 719 | trm[device.id].version.textContent = "Error" 720 | trm[device.id].version.setAttribute("title", `Error: ${ex}`) 721 | Sentry.captureException(new Error(`Table row load failed for "${device.name}" in latest versions table: ${ex}`)) 722 | } 723 | })(device))) 724 | } 725 | 726 | async renderMatrix(table) { 727 | // this one is built horizontally 728 | let rows = {} 729 | const tb = table.querySelector("tbody") 730 | rows.header = table.querySelector("thead tr") 731 | 732 | // add a column for the device names 733 | KoboFirmware.#el(rows.header, "th", "Device", ["kfw-matrix__device"]) 734 | for (const device of this.#devices) { 735 | rows[device.id] = KoboFirmware.#el(tb, "tr") 736 | KoboFirmware.#el(rows[device.id], "td", device.name, ["kfw-matrix__device"]) 737 | } 738 | 739 | // add the version columns all at once (since there are a lot of them) 740 | let cols = {} 741 | const availability = await this.#db.versionsByDevice() 742 | for (const version of await this.#db.versions()) { 743 | KoboFirmware.#el((cols.header = cols.header || document.createDocumentFragment()), "th", version, ["kfw-matrix__version"]) 744 | for (const device of this.#devices) { 745 | const date = availability[device.id]?.[version] 746 | let t, c, a 747 | if (date) { 748 | t = "✓" 749 | c = "kfw-matrix__version--yes" 750 | a = {title: date} 751 | } else if (!availability[device.id] || KFWProxy.versionCompare(availability[device.id].earliest, version) == 1) { 752 | // TODO: make this check more efficient by doing it separately going through the versions backwards 753 | t = "-" 754 | c = "kfw-matrix__version--none" 755 | a = {} 756 | } else { 757 | t = "✗" 758 | c = "kfw-matrix__version--no" 759 | a = {} 760 | } 761 | KoboFirmware.#el((cols[device.id] = cols[device.id] || document.createDocumentFragment()), "td", t, ["kfw-matrix__version", c], a) 762 | } 763 | } 764 | for (const row in cols) 765 | rows[row].appendChild(cols[row]) 766 | 767 | // add a column for the device names 768 | KoboFirmware.#el(rows.header, "th", "Device", ["kfw-matrix__device"]) 769 | for (const device of this.#devices) 770 | KoboFirmware.#el(rows[device.id], "td", device.name, ["kfw-matrix__device"]) 771 | } 772 | 773 | async renderAffiliates(table) { 774 | const ths = document.createDocumentFragment() 775 | KoboFirmware.#el(ths, "th", "Device", ["kfw-affiliates__device"]) 776 | for (const affiliate of this.#affiliates) 777 | KoboFirmware.#el(ths, "th", affiliate, ["kfw-affiliates__affiliate"]) 778 | table.querySelector("thead tr").appendChild(ths) 779 | 780 | // load the initial data 781 | const trm = {} 782 | const trs = document.createDocumentFragment() 783 | for (const device of this.#devices) { 784 | if (device.id.startsWith("00000000-0000-0000-0000-0000000006")) continue; // skip tolino for now 785 | const tr = KoboFirmware.#el(trs, "tr") 786 | trm[device.id] = {} 787 | KoboFirmware.#el(tr, "td", device.name, ["kfw-affiliates__device"]) 788 | for (const affiliate of this.#affiliates) 789 | trm[device.id][affiliate] = KoboFirmware.#el(tr, "td", "Loading", ["kfw-affiliates__affiliate"]) 790 | } 791 | table.querySelector("tbody").appendChild(trs) 792 | 793 | // load each cell async as data becomes available (we use traditional 794 | // promise chaining here to improve performance by reducing the number 795 | // of pending async functions at once) 796 | return Promise.all(this.#devices.map(device => 797 | device.id.startsWith("00000000-0000-0000-0000-0000000006") ? Promise.resolve() : // skip tolino for now 798 | Promise.all(this.#affiliates.map(affiliate => 799 | this.#req[device.id][affiliate] 800 | .then(obj => { 801 | trm[device.id][affiliate].textContent = obj.UpgradeVersion == "0.0" 802 | ? "-" 803 | : obj.UpgradeVersion 804 | return Promise.resolve([affiliate, obj]) 805 | }).catch(ex => { 806 | trm[device.id][affiliate].textContent = "Error" 807 | trm[device.id][affiliate].title = `Error: ${ex}` 808 | return Promise.reject(ex) 809 | }) 810 | )).then(affiliates => { 811 | let latest 812 | for (const [, info] of affiliates) 813 | if (KFWProxy.versionCompare(latest?.UpgradeVersion, info.UpgradeVersion) == -1) 814 | latest = info 815 | for (const [affiliate, info] of affiliates) 816 | trm[device.id][affiliate].classList.add( 817 | latest.UpgradeVersion == info.UpgradeVersion 818 | ? "kfw-affiliates__affiliate--latest" 819 | : info.UpgradeVersion == "0.0" 820 | ? "kfw-affiliates__affiliate--none" 821 | : "kfw-affiliates__affiliate--outdated") 822 | }) 823 | )) 824 | } 825 | 826 | async renderVersions(table) { 827 | let hardware = {} 828 | let name = {} 829 | let idhardware = {} 830 | for (const device of this.#devices) { 831 | hardware[device.hardware] = null 832 | name[device.id] = device.name 833 | idhardware[device.id] = device.hardware 834 | } 835 | hardware = Object.keys(hardware).sort((a, b) => a.localeCompare(b, "en", {numeric: true})) 836 | 837 | const ths = document.createDocumentFragment() 838 | KoboFirmware.#el(ths, "th", "Date", ["kfw-versions__date"]) 839 | KoboFirmware.#el(ths, "th", "Version", ["kfw-versions__version"]) 840 | for (const hw of hardware) 841 | KoboFirmware.#el(ths, "th", hw, ["kfw-versions__hardware"]) 842 | KoboFirmware.#el(ths, "th", "Notes", ["kfw-versions__notes"]) 843 | table.querySelector("thead tr").appendChild(ths) 844 | 845 | const rows = document.createDocumentFragment() 846 | for (const version of await this.#db.downloadsByVersion()) { 847 | const row = KoboFirmware.#el(rows, "tr") 848 | KoboFirmware.#el(row, "td", version.date, ["kfw-versions__date"]) 849 | KoboFirmware.#el(row, "td", version.version, ["kfw-versions__version"]) 850 | for (const hw of hardware) { 851 | const td = KoboFirmware.#el(row, "td", version.download[hw] ? "" : "-", ["kfw-versions__hardware"]) 852 | if (version.download[hw]) { 853 | const a = KoboFirmware.#el(td, "a", "Get", [], {rel: "noopener", href: version.download[hw], title: KoboFirmware.#listify(version.for.filter(id => idhardware[id] == hw).map(id => name[id].replace(/Kobo /, "")))}) 854 | 855 | // stats 856 | this.#ctr(a, 857 | [`dl`, "Firmware"], 858 | [`dl-version-${version.version}`, `Firmware ${version.version}`], 859 | ) 860 | } 861 | } 862 | const x = version.notfor.length 863 | ? version.for.length > version.notfor.length 864 | ? `Not for ${KoboFirmware.#listify(version.notfor.map(id => name[id].replace(/Kobo /, "")))}.` 865 | : `Only for ${KoboFirmware.#listify(version.for.map(id => name[id].replace(/Kobo /, "")))}.` 866 | : "" 867 | KoboFirmware.#el(row, "td", x, ["kfw-versions__notes"]) 868 | } 869 | table.querySelector("tbody").appendChild(rows) 870 | } 871 | 872 | static #listify(arr) { 873 | if (!arr || arr.length == 0) 874 | return "" 875 | if (arr.length == 1) 876 | return arr[0].toString() 877 | if (arr.length == 2) 878 | return arr.join(" and ") 879 | return `${arr.slice(0, arr.length-1).join(", ")}, and ${arr[arr.length-1]}` 880 | } 881 | 882 | static #modal(title, fn, classes = []) { 883 | const modal = KoboFirmware.#el(null, "aside", null, ["modal-wrapper"]) 884 | const inner = KoboFirmware.#el(modal, "div", null, ["modal", ...classes]) 885 | const bar = KoboFirmware.#el(inner, "div", null, ["titlebar"]) 886 | const close = KoboFirmware.#el(bar, "button", "Close", ["close"]) 887 | const text = KoboFirmware.#el(bar, "div", title, ["title"]) 888 | const body = KoboFirmware.#el(inner, "div", "Loading", ["body"]) 889 | 890 | const cfn = ev => { 891 | if (ev) { 892 | if (ev.target != close && ev.target != modal && ev.keyCode != 27) { 893 | return // !close && !back && !esc 894 | } 895 | ev.preventDefault() 896 | } 897 | document.body.removeChild(modal) 898 | document.body.removeEventListener("keydown", cfn, true) 899 | } 900 | modal.addEventListener("click", cfn, true) 901 | document.body.addEventListener("keydown", cfn, true) 902 | document.body.appendChild(modal) 903 | 904 | {(async () => { 905 | try { 906 | let res = fn() 907 | if (res instanceof Promise) 908 | res = await res 909 | if (typeof res === "string") { 910 | body.innerHTML = res 911 | } else if (res instanceof HTMLIFrameElement) { 912 | res.classList.add("body") 913 | res.style.border = "none" 914 | res.style.width = "100%" 915 | res.style.height = "100%" 916 | res.style.padding = 0 917 | inner.removeChild(body) 918 | inner.appendChild(res) 919 | } else { 920 | body.innerHTML = "" 921 | body.appendChild(res) 922 | } 923 | } catch (ex) { 924 | body.innerHTML = `Error: Load failed: ${ex}` 925 | console.error("modal load failed", ex) 926 | Sentry.captureException(new Error(`Modal load failed for "${title}": ${ex}`)) 927 | } 928 | })()} 929 | 930 | return {title: text, body, close: () => cfn(null)} 931 | } 932 | 933 | static #el(parent, tag, inner = null, classes = [], attrs = {}, raw = false) { 934 | const el = document.createElement(tag) 935 | for (const c of classes) 936 | el.classList.add(c) 937 | for (const a in attrs) 938 | el.setAttribute(a, attrs[a]) 939 | if (inner) 940 | el[raw ? "innerHTML" : "textContent"] = inner.toString() 941 | if (parent) 942 | parent.appendChild(el) 943 | return el 944 | } 945 | } 946 | 947 | Sentry.init({ 948 | dsn: "https://696a706ba440443eb3e19094ebd72f74@o143001.ingest.sentry.io/1104793", 949 | maxBreadcrumbs: 100, 950 | attachStacktrace: true, 951 | }) 952 | 953 | const app = window.app = new KoboFirmware() 954 | app.renderLatest(document.getElementById("kfw-latest")) 955 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-latest`))) 956 | app.renderMatrix(document.getElementById("kfw-matrix")) 957 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-matrix`))) 958 | app.renderAffiliates(document.getElementById("kfw-affiliates")) 959 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-affiliates`))) 960 | app.renderVersions(document.getElementById("kfw-versions")) 961 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-versions`))) 962 | document.getElementById("error").className = "error hidden"; 963 | -------------------------------------------------------------------------------- /kfw.db.js: -------------------------------------------------------------------------------- 1 | KoboFirmwareOldVersionsData.resolve(window.KoboFirmwareOldVersionsDataRaw = function() { 2 | var dh = "kobo"; 3 | var dd = "00000000-0000-0000-0000-000000000"; 4 | var dk = "http://download.kobobooks.com/firmwares/"+dh; 5 | var da = "https://cdn.kobo.com/downloads/firmwares/"+dh; 6 | var dn = "https://ereaderfiles.kobo.com/firmwares/"+dh; 7 | dk = da = dn; 8 | return [ 9 | [dh+"3",dd+"310","1.9.12","October 2011",dk+"3/kobo3-upgrade-1.9.12.zip","8232d83c2e6ed77b9c26c7ec46d9c454"], 10 | [dh+"3",dd+"310","1.9.16","December 2011",dk+"3/bowfin/kobo3-update-1.9.16.zip","cd3cbb5ab53d9708b7eb11e071084373"], 11 | [dh+"3",dd+"310","1.9.17","March 2012",dk+"3/cod/kobo3-update-1.9.17.zip","2676e6cf3da25c58e17a95ab1c3b4bd3"], 12 | [dh+"3",dd+"310","2.0.0","July 2012",dk+"3/Devario/kobo3-update-2.0.0.zip","b412e390c62ca6b059f0e391a145e748"], 13 | [dh+"3",dd+"310","2.0.2","July 2012",dk+"3/Eel/kobo3-update-2.0.2.zip","0da32123598bca010a091434665e42c4"], 14 | [dh+"3",dd+"310","2.1.1","August 2012",dk+"3/rgreen/kobo3-update-2.1.1.zip","cef7aaf8a0309da8e38573479f058516"], 15 | [dh+"3",dd+"310","2.1.5","October 2012",dk+"3/brodeur/kobo-update-2.1.5.zip","9a826451c1114e88fca23cf55a75b0ef"], 16 | [dh+"4",dd+"320","2.1.5","October 2012",dk+"4/brodeur/kobo-update-2.1.5.zip","66e28ab31af8361e7223bfe48f926001"], 17 | [dh+"4",dd+"340","2.1.5","October 2012",dk+"4/brodeur/kobo-update-2.1.5.zip","66e28ab31af8361e7223bfe48f926001"], 18 | [dh+"3",dd+"310","2.2.0","October 2012",dk+"3/coffey/kobo-update-2.2.0.zip","1213a10058adaa564b4ca433a0ed45ae"], 19 | [dh+"4",dd+"320","2.2.0","October 2012",dk+"4/coffey/kobo-update-2.2.0.zip","69b35487aeffa216cbc3271da9af69b0"], 20 | [dh+"4",dd+"340","2.2.0","October 2012",dk+"4/coffey/kobo-update-2.2.0.zip","69b35487aeffa216cbc3271da9af69b0"], 21 | [dh+"4",dd+"320","2.2.1","November 2012",dk+"4/jordan/kobo-update-2.2.1.zip","8191f04229f3b062d67a9966d3fac23e"], 22 | [dh+"4",dd+"340","2.2.1","November 2012",dk+"4/jordan/kobo-update-2.2.1.zip","8191f04229f3b062d67a9966d3fac23e"], 23 | [dh+"3",dd+"310","2.5.0","April 2013",dk+"3/goleafsgo/kobo-update-2.5.0.zip","e8d8642d5e80ea00d8ab872f26f62e0a"], 24 | [dh+"4",dd+"320","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"], 25 | [dh+"4",dd+"330","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"], 26 | [dh+"4",dd+"340","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"], 27 | [dh+"4",dd+"350","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"], 28 | [dh+"3",dd+"310","2.5.1","April 2013",dk+"3/leafs2013/kobo-update-2.5.1.zip","d8e84161eee20fa5763074915b7a0519"], 29 | [dh+"4",dd+"320","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"], 30 | [dh+"4",dd+"330","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"], 31 | [dh+"4",dd+"340","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"], 32 | [dh+"4",dd+"350","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"], 33 | [dh+"3",dd+"310","2.5.2","May 2013",dk+"3/bleedblue/kobo-update-2.5.2.zip","f0f3399765cb5fff85abf05037b483f7"], 34 | [dh+"4",dd+"320","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"], 35 | [dh+"4",dd+"330","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"], 36 | [dh+"4",dd+"340","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"], 37 | [dh+"4",dd+"350","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"], 38 | [dh+"3",dd+"310","2.6.0","June 2013",dk+"3/rakutenrocks/kobo-update-2.6.0.zip","40fb35acf76394ee2333e196e13d9f54"], 39 | [dh+"4",dd+"320","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"], 40 | [dh+"4",dd+"330","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"], 41 | [dh+"4",dd+"340","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"], 42 | [dh+"4",dd+"350","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"], 43 | [dh+"3",dd+"310","2.6.1","June 2013",dk+"3/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"], 44 | [dh+"4",dd+"320","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"], 45 | [dh+"4",dd+"330","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"], 46 | [dh+"4",dd+"340","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"], 47 | [dh+"4",dd+"350","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"], 48 | [dh+"4",dd+"320","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"], 49 | [dh+"4",dd+"330","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"], 50 | [dh+"4",dd+"340","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"], 51 | [dh+"4",dd+"350","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"], 52 | [dh+"4",dd+"320","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"], 53 | [dh+"4",dd+"330","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"], 54 | [dh+"4",dd+"340","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"], 55 | [dh+"4",dd+"350","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"], 56 | [dh+"4",dd+"320","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"], 57 | [dh+"4",dd+"330","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"], 58 | [dh+"4",dd+"340","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"], 59 | [dh+"4",dd+"350","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"], 60 | [dh+"5",dd+"360","2.10.0","October 2013",dk+"5/libertyvillage/kobo-update-2.10.0.zip","fb7b94c2f18c543da6129547601d0e80"], 61 | [dh+"3",dd+"310","3.0.0","November 2013",dk+"3/babak/kobo-update-3.0.0.zip","e05d86db020963d879fab73e34fb2943"], 62 | [dh+"4",dd+"320","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"], 63 | [dh+"4",dd+"330","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"], 64 | [dh+"4",dd+"340","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"], 65 | [dh+"4",dd+"350","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"], 66 | [dh+"4",dd+"320","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"], 67 | [dh+"4",dd+"330","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"], 68 | [dh+"4",dd+"340","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"], 69 | [dh+"4",dd+"350","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"], 70 | [dh+"5",dd+"360","3.1.0","December 2013",dk+"5/blackfriday2013/kobo-update-3.1.0.zip","c6e140c5e4f6b08b958c79d306c9ef2c"], 71 | [dh+"4",dd+"320","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"], 72 | [dh+"4",dd+"330","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"], 73 | [dh+"4",dd+"340","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"], 74 | [dh+"4",dd+"350","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"], 75 | [dh+"5",dd+"360","3.1.1","December 2013",dk+"5/indigoblitz2013/kobo-update-3.1.1.zip","87020fcceccd621d583654ea28b63280"], 76 | [dh+"3",dd+"310","3.2.0","February 2014",dk+"3/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"], 77 | [dh+"4",dd+"320","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"], 78 | [dh+"4",dd+"330","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"], 79 | [dh+"4",dd+"340","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"], 80 | [dh+"4",dd+"350","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"], 81 | [dh+"3",dd+"310","3.3.0","April 2014",dk+"3/easter2014/kobo-update-3.3.0.zip","f3db9b61a1a482c78a9f7cb2ed46d638"], 82 | [dh+"4",dd+"320","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"], 83 | [dh+"4",dd+"330","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"], 84 | [dh+"4",dd+"350","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"], 85 | [dh+"5",dd+"360","3.3.0","April 2014",dk+"5/easter2014/kobo-update-3.3.0.zip","04d160d4ff0440d6d4f24f6f5d13c6e8"], 86 | [dh+"3",dd+"310","3.3.1","May 2014",dk+"3/pt-br-331/kobo-update-3.3.1.zip","0a195f5c47acd1e7dae9f2b3f6bb56f4"], 87 | [dh+"4",dd+"320","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"], 88 | [dh+"4",dd+"330","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"], 89 | [dh+"4",dd+"350","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"], 90 | [dh+"5",dd+"360","3.3.1","May 2014",dk+"5/pt-br-331/kobo-update-3.3.1.zip","7da43191575b53e8c8416d2a230caedd"], 91 | [dh+"4",dd+"340","3.4.1","May 2014",dk+"4/miniforkids/kobo-update-3.4.1.zip","cd9e37301939c4b9c920674021ae3ca2"], 92 | [dh+"4",dd+"330","3.5.0","July 2014",dk+"4/fifa2014/kobo-update-3.5.0.zip","8baaa137ba89ae94de6a72de3f0ae138"], 93 | [dh+"4",dd+"350","3.5.0","July 2014",dk+"4/fifa2014/kobo-update-3.5.0.zip","8baaa137ba89ae94de6a72de3f0ae138"], 94 | [dh+"5",dd+"360","3.5.0","July 2014",dk+"5/fifa2014/kobo-update-3.5.0.zip","7776f80cb1fa440a070f0998082c6aca"], 95 | [dh+"5",dd+"370","3.7.0","August 2014",dk+"5/dahlialaunch/kobo-update-3.7.0.zip","dd8736a4345690673133fd2a0438684d"], 96 | [dh+"3",dd+"310","3.8.0","August 2014",dk+"3/intimeforlabourday2014/kobo-update-3.8.0.zip","cb02c7cc0a7962b802c4445970f9a28d"], 97 | [dh+"4",dd+"320","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"], 98 | [dh+"4",dd+"330","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"], 99 | [dh+"4",dd+"350","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"], 100 | [dh+"5",dd+"360","3.8.0","August 2014",dk+"5/intimeforlabourday2014/kobo-update-3.8.0.zip","5c18d0df087412268203ddc6c9391aa2"], 101 | [dh+"5",dd+"370","3.8.0","August 2013",dk+"5/intimeforlabourday2014/kobo-update-3.8.0.zip","5c18d0df087412268203ddc6c9391aa2"], 102 | [dh+"3",dd+"310","3.11.0","October 2014",dk+"3/mapleleafs2014/kobo-update-3.11.0.zip","826164a33a5d8a59ecf2d1b148d1acd0"], 103 | [dh+"4",dd+"320","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"], 104 | [dh+"4",dd+"330","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"], 105 | [dh+"4",dd+"350","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"], 106 | [dh+"5",dd+"360","3.11.0","October 2014",dk+"5/mapleleafs2014/kobo-update-3.11.0.zip","aa15ca97076c2f3e785272d4a091c485"], 107 | [dh+"5",dd+"370","3.11.0","October 2014",dk+"5/mapleleafs2014/kobo-update-3.11.0.zip","aa15ca97076c2f3e785272d4a091c485"], 108 | [dh+"4",dd+"320","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"], 109 | [dh+"4",dd+"330","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"], 110 | [dh+"4",dd+"350","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"], 111 | [dh+"5",dd+"360","3.12.0","December 2014",dk+"5/wethenorth2014/kobo-update-3.12.0.zip","49324da871bad3e3f8f5683f4751ce86"], 112 | [dh+"5",dd+"370","3.12.0","December 2014",dk+"5/wethenorth2014/kobo-update-3.12.0.zip","49324da871bad3e3f8f5683f4751ce86"], 113 | [dh+"4",dd+"320","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"], 114 | [dh+"4",dd+"330","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"], 115 | [dh+"4",dd+"350","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"], 116 | [dh+"5",dd+"360","3.12.1","January 2014",dk+"5/icecold2015/kobo-update-3.12.1.zip","6d3fecfc6a0a266d165c041b03171dab"], 117 | [dh+"5",dd+"370","3.12.1","January 2014",dk+"5/icecold2015/kobo-update-3.12.1.zip","6d3fecfc6a0a266d165c041b03171dab"], 118 | [dh+"6",dd+"371","3.14.0","April 2015",dk+"6/glohd-3140/kobo-update-3.14.0.zip","25e8abb3f2b63c9f23a08e5cff30bc5f"], 119 | [dh+"4",dd+"320","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"], 120 | [dh+"4",dd+"330","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"], 121 | [dh+"4",dd+"350","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"], 122 | [dh+"5",dd+"360","3.15.0","April 2015",dk+"5/april2015/kobo-update-3.15.0.zip","4b09078f0afe73639bfa213991805591"], 123 | [dh+"5",dd+"370","3.15.0","April 2015",dk+"5/april2015/kobo-update-3.15.0.zip","4b09078f0afe73639bfa213991805591"], 124 | [dh+"6",dd+"371","3.15.0","April 2015",dk+"6/april2015/kobo-update-3.15.0.zip","9dfd87065cff6eaa57d11d84cca4af67"], 125 | [dh+"3",dd+"310","3.16.0","June 2015",dk+"3/hello_MR/kobo-update-3.16.0.zip","54f38d0fc8b73eb96e1e0c40ff77a6b9"], 126 | [dh+"4",dd+"320","3.16.0","June 2015",dk+"4/hello_MR/kobo-update-3.16.0.zip","f0fc854051a1b90df94f12ed97f9ca9c"], 127 | [dh+"6",dd+"371","3.16.0","June 2015",dk+"6/hello_MR/kobo-update-3.16.0.zip","db4c0ccf2746a298f66a13f833d863b6"], 128 | [dh+"3",dd+"310","3.17.0","August 2015",dk+"3/august2015/kobo-update-3.17.0.zip","b9eeebe548f3d5f1b50a2afcffa63918"], 129 | [dh+"4",dd+"320","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"], 130 | [dh+"4",dd+"330","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"], 131 | [dh+"4",dd+"340","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"], 132 | [dh+"4",dd+"350","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"], 133 | [dh+"5",dd+"360","3.17.0","August 2015",dk+"5/august2015/kobo-update-3.17.0.zip","4cb8baf9d02bb691a3446eebc6fbe134"], 134 | [dh+"5",dd+"370","3.17.0","August 2015",dk+"5/august2015/kobo-update-3.17.0.zip","4cb8baf9d02bb691a3446eebc6fbe134"], 135 | [dh+"6",dd+"371","3.17.0","August 2015",dk+"6/august2015/kobo-update-3.17.0.zip","9de1b69291ac6718465b6af0064332b6"], 136 | [dh+"3",dd+"310","3.17.3","August 2015",dk+"3/3173/kobo-update-3.17.3.zip","4c7ef9437513e54b6c67a5e7ab707e5c"], 137 | [dh+"4",dd+"320","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"], 138 | [dh+"4",dd+"330","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"], 139 | [dh+"4",dd+"340","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"], 140 | [dh+"4",dd+"350","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"], 141 | [dh+"5",dd+"360","3.17.3","August 2015",dk+"5/3173/kobo-update-3.17.3.zip","798a7f7a1217c6e72706844c2a04e9c7"], 142 | [dh+"5",dd+"370","3.17.3","August 2015",dk+"5/3173/kobo-update-3.17.3.zip","798a7f7a1217c6e72706844c2a04e9c7"], 143 | [dh+"6",dd+"371","3.17.3","August 2015",dk+"6/3173/kobo-update-3.17.3.zip","eba9f7d3c5680b1adc46b6623b3d2317"], 144 | [dh+"3",dd+"310","3.18.0","September 2015",dk+"3/september2015/kobo-update-3.18.0.zip","ffde776605df710a152d3abbde8b6387"], 145 | [dh+"4",dd+"320","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"], 146 | [dh+"4",dd+"330","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"], 147 | [dh+"4",dd+"340","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"], 148 | [dh+"4",dd+"350","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"], 149 | [dh+"5",dd+"360","3.18.0","September 2015",dk+"5/september2015/kobo-update-3.18.0.zip","bf24a8b5e5bd2447c850c97b12452133"], 150 | [dh+"5",dd+"370","3.18.0","September 2015",dk+"5/september2015/kobo-update-3.18.0.zip","bf24a8b5e5bd2447c850c97b12452133"], 151 | [dh+"6",dd+"371","3.18.0","September 2015",dk+"6/september2015/kobo-update-3.18.0.zip","932eb56cab9ffd4c21ff77fb7eb1ca4a"], 152 | [dh+"6",dd+"372","3.18.0","September 2015",dk+"6/september2015/kobo-update-3.18.0.zip","932eb56cab9ffd4c21ff77fb7eb1ca4a"], 153 | [dh+"3",dd+"310","3.19.5613","December 2015",dk+"3/december2015/kobo-update-3.19.5613.zip","e4baae4cae994c786ebe91b00b0a98ca"], 154 | [dh+"4",dd+"320","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"], 155 | [dh+"4",dd+"330","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"], 156 | [dh+"4",dd+"340","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"], 157 | [dh+"4",dd+"350","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"], 158 | [dh+"5",dd+"360","3.19.5613","December 2015",dk+"5/december2015/kobo-update-3.19.5613.zip","74517df68961aeb57408cf8e693d5f63"], 159 | [dh+"5",dd+"370","3.19.5613","December 2015",dk+"5/december2015/kobo-update-3.19.5613.zip","74517df68961aeb57408cf8e693d5f63"], 160 | [dh+"6",dd+"371","3.19.5613","December 2015",dk+"6/december2015/kobo-update-3.19.5613.zip","555e5d0fc1122ca6ec3775e116833933"], 161 | [dh+"6",dd+"372","3.19.5613","December 2015",dk+"6/december2015/kobo-update-3.19.5613.zip","555e5d0fc1122ca6ec3775e116833933"], 162 | [dh+"3",dd+"310","3.19.5761","December 2015",dk+"3/january2016/kobo-update-3.19.5761.zip","816a23f62c95edd1431bdc800954aef2"], 163 | [dh+"4",dd+"320","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"], 164 | [dh+"4",dd+"330","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"], 165 | [dh+"4",dd+"340","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"], 166 | [dh+"4",dd+"350","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"], 167 | [dh+"5",dd+"360","3.19.5761","December 2015",dk+"5/january2016/kobo-update-3.19.5761.zip","7db74f0026caf1fb10293370ac0d4202"], 168 | [dh+"5",dd+"370","3.19.5761","December 2015",dk+"5/january2016/kobo-update-3.19.5761.zip","7db74f0026caf1fb10293370ac0d4202"], 169 | [dh+"6",dd+"371","3.19.5761","December 2015",dk+"6/january2016/kobo-update-3.19.5761.zip","5a62affb167039bdffac3b4f5f07e777"], 170 | [dh+"6",dd+"372","3.19.5761","December 2015",dk+"6/january2016/kobo-update-3.19.5761.zip","5a62affb167039bdffac3b4f5f07e777"], 171 | [dh+"4",dd+"340","3.19.5761-s","December 2015",dk+"4/january2016/kobo-update-3.19.5761-s.zip","bf51c1e8e1033f9694079489a3436e52"], 172 | [dh+"6",dd+"373","4.0.7523","September 2016",dk+"6/September2016/kobo-update-4.0.7523.zip","b9c6a5ee929283a1c447f654b02f8f80"], 173 | [dh+"6",dd+"375","4.0.7523","September 2016",dk+"6/September2016/kobo-update-4.0.7523.zip","b9c6a5ee929283a1c447f654b02f8f80"], 174 | [dh+"6",dd+"373","4.1.7729","November 2016",dk+"6/October2016/kobo-update-4.1.7729.zip","4db24597799e75909a0f9dab7d626478"], 175 | [dh+"6",dd+"375","4.1.7729","November 2016",dk+"6/October2016/kobo-update-4.1.7729.zip","4db24597799e75909a0f9dab7d626478"], 176 | [dh+"6",dd+"373","4.2.8110","December 2016",dk+"6/December2016/kobo-update-4.2.8110.zip","043a224c6f3d71117441fc1c245d9cef"], 177 | [dh+"6",dd+"375","4.2.8110","December 2016",dk+"6/December2016/kobo-update-4.2.8110.zip","043a224c6f3d71117441fc1c245d9cef"], 178 | [dh+"6",dd+"373","4.2.8283","January 2017",dk+"6/Jan2017/kobo-update-4.2.8283.zip","dca409a3f4d4424a06b565be90e44b1a"], 179 | [dh+"6",dd+"375","4.2.8283","January 2017",dk+"6/Jan2017/kobo-update-4.2.8283.zip","dca409a3f4d4424a06b565be90e44b1a"], 180 | [dh+"3",dd+"310","4.2.8432","February 2017",dk+"3/Jan2017/kobo-update-4.2.8432.zip","5da02de981231bfa3120507087a6d28e"], 181 | [dh+"4",dd+"320","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"], 182 | [dh+"4",dd+"330","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"], 183 | [dh+"4",dd+"350","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"], 184 | [dh+"5",dd+"360","4.2.8432","February 2017",dk+"5/Jan2017/kobo-update-4.2.8432.zip","db520d94347d5b0af45f5216db21ce0d"], 185 | [dh+"5",dd+"370","4.2.8432","February 2017",dk+"5/Jan2017/kobo-update-4.2.8432.zip","db520d94347d5b0af45f5216db21ce0d"], 186 | [dh+"6",dd+"371","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"], 187 | [dh+"6",dd+"372","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"], 188 | [dh+"6",dd+"373","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"], 189 | [dh+"6",dd+"375","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"], 190 | [dh+"3",dd+"310","4.3.8842","February 2017",dk+"3/Feb2017/kobo-update-4.3.8842.zip","5f2b1544eb106f6402f9a0a075126509"], 191 | [dh+"4",dd+"320","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"], 192 | [dh+"4",dd+"330","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"], 193 | [dh+"4",dd+"350","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"], 194 | [dh+"5",dd+"360","4.3.8842","February 2017",dk+"5/Feb2017/kobo-update-4.3.8842.zip","1b38e8e237fcb3d1266784b4b22ecf46"], 195 | [dh+"5",dd+"370","4.3.8842","February 2017",dk+"5/Feb2017/kobo-update-4.3.8842.zip","1b38e8e237fcb3d1266784b4b22ecf46"], 196 | [dh+"6",dd+"371","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"], 197 | [dh+"6",dd+"372","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"], 198 | [dh+"6",dd+"373","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"], 199 | [dh+"6",dd+"375","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"], 200 | [dh+"3",dd+"310","4.3.8871","March 2017",dk+"3/Feb2017/kobo-update-4.3.8871.zip","b177ab6201d9cc61f659b031627fc2bc"], 201 | [dh+"4",dd+"320","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"], 202 | [dh+"4",dd+"330","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"], 203 | [dh+"4",dd+"350","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"], 204 | [dh+"5",dd+"360","4.3.8871","March 2017",dk+"5/Feb2017/kobo-update-4.3.8871.zip","8e57b82d62904d878a0e494009ec92d1"], 205 | [dh+"5",dd+"370","4.3.8871","March 2017",dk+"5/Feb2017/kobo-update-4.3.8871.zip","8e57b82d62904d878a0e494009ec92d1"], 206 | [dh+"6",dd+"371","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"], 207 | [dh+"6",dd+"372","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"], 208 | [dh+"6",dd+"373","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"], 209 | [dh+"6",dd+"375","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"], 210 | [dh+"3",dd+"310","4.3.8929","March 2017",dk+"3/Mar2017/kobo-update-4.3.8929.zip","f77aca39d7146cbb14adcc50a6104839"], 211 | [dh+"4",dd+"320","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"], 212 | [dh+"4",dd+"330","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"], 213 | [dh+"4",dd+"350","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"], 214 | [dh+"5",dd+"360","4.3.8929","March 2017",dk+"5/Mar2017/kobo-update-4.3.8929.zip","6b6f55caae2ebbf374da75194e810f36"], 215 | [dh+"5",dd+"370","4.3.8929","March 2017",dk+"5/Mar2017/kobo-update-4.3.8929.zip","6b6f55caae2ebbf374da75194e810f36"], 216 | [dh+"6",dd+"371","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"], 217 | [dh+"6",dd+"372","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"], 218 | [dh+"6",dd+"373","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"], 219 | [dh+"6",dd+"375","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"], 220 | [dh+"3",dd+"310","4.3.8945","March 2017",dk+"3/Mar2017/kobo-update-4.3.8945.zip","b4617f0f021ee7a69f2a236ff5ab060b"], 221 | [dh+"4",dd+"320","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"], 222 | [dh+"4",dd+"330","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"], 223 | [dh+"4",dd+"350","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"], 224 | [dh+"5",dd+"360","4.3.8945","March 2017",dk+"5/Mar2017/kobo-update-4.3.8945.zip","ba3ed04ea1b3ae6626c4be5a4cada14d"], 225 | [dh+"5",dd+"370","4.3.8945","March 2017",dk+"5/Mar2017/kobo-update-4.3.8945.zip","ba3ed04ea1b3ae6626c4be5a4cada14d"], 226 | [dh+"6",dd+"371","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"], 227 | [dh+"6",dd+"372","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"], 228 | [dh+"6",dd+"373","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"], 229 | [dh+"6",dd+"375","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"], 230 | [dh+"3",dd+"310","4.3.8966","March 2017",dk+"3/Mar2017/kobo-update-4.3.8966.zip","5c0454ae7d8f520c9fc5dfd0eb10b165"], 231 | [dh+"4",dd+"320","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"], 232 | [dh+"4",dd+"330","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"], 233 | [dh+"4",dd+"350","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"], 234 | [dh+"5",dd+"360","4.3.8966","March 2017",dk+"5/Mar2017/kobo-update-4.3.8966.zip","6ef08c80a3794df066b1a73cd8ca9c5a"], 235 | [dh+"5",dd+"370","4.3.8966","March 2017",dk+"5/Mar2017/kobo-update-4.3.8966.zip","6ef08c80a3794df066b1a73cd8ca9c5a"], 236 | [dh+"6",dd+"371","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"], 237 | [dh+"6",dd+"372","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"], 238 | [dh+"6",dd+"373","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"], 239 | [dh+"6",dd+"375","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"], 240 | [dh+"3",dd+"310","4.3.9084","April 2017",dk+"3/rakuten-439084/kobo-update-4.3.9084.zip","d4c36a7e00f4ef8cb1a10d0af2953f7c"], 241 | [dh+"4",dd+"320","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"], 242 | [dh+"4",dd+"330","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"], 243 | [dh+"4",dd+"350","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"], 244 | [dh+"5",dd+"360","4.3.9084","April 2017",dk+"5/rakuten-439084/kobo-update-4.3.9084.zip","dccaff3dc8ac4350799c13c7f2c8dc20"], 245 | [dh+"5",dd+"370","4.3.9084","April 2017",dk+"5/rakuten-439084/kobo-update-4.3.9084.zip","dccaff3dc8ac4350799c13c7f2c8dc20"], 246 | [dh+"6",dd+"371","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"], 247 | [dh+"6",dd+"372","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"], 248 | [dh+"6",dd+"373","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"], 249 | [dh+"6",dd+"375","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"], 250 | [dh+"6",dd+"373","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"], 251 | [dh+"6",dd+"374","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"], 252 | [dh+"6",dd+"375","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"], 253 | [dh+"3",dd+"310","4.4.9298","May 2017",dk+"3/May2017/kobo-update-4.4.9298.zip","6088179f535bd1f14e7b9ef415959ec4"], 254 | [dh+"4",dd+"320","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"], 255 | [dh+"4",dd+"330","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"], 256 | [dh+"4",dd+"350","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"], 257 | [dh+"5",dd+"360","4.4.9298","May 2017",dk+"5/May2017/kobo-update-4.4.9298.zip","3add0b388aa0c4cfb56b79006830f9ff"], 258 | [dh+"5",dd+"370","4.4.9298","May 2017",dk+"5/May2017/kobo-update-4.4.9298.zip","3add0b388aa0c4cfb56b79006830f9ff"], 259 | [dh+"6",dd+"371","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"], 260 | [dh+"6",dd+"372","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"], 261 | [dh+"6",dd+"373","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"], 262 | [dh+"6",dd+"374","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"], 263 | [dh+"6",dd+"375","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"], 264 | [dh+"3",dd+"310","4.5.9587","July 2017",dk+"3/July2017/kobo-update-4.5.9587.zip","5577950bfd6445c2593437f950564f5d"], 265 | [dh+"4",dd+"320","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"], 266 | [dh+"4",dd+"330","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"], 267 | [dh+"4",dd+"350","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"], 268 | [dh+"5",dd+"360","4.5.9587","July 2017",dk+"5/July2017/kobo-update-4.5.9587.zip","6ce687f7727c2a4a7b41adb460f14ba4"], 269 | [dh+"5",dd+"370","4.5.9587","July 2017",dk+"5/July2017/kobo-update-4.5.9587.zip","6ce687f7727c2a4a7b41adb460f14ba4"], 270 | [dh+"6",dd+"371","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"], 271 | [dh+"6",dd+"372","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"], 272 | [dh+"6",dd+"373","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"], 273 | [dh+"6",dd+"374","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"], 274 | [dh+"6",dd+"375","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"], 275 | [dh+"3",dd+"310","4.6.9960","October 2017",dk+"3/July2017/kobo-update-4.6.9960.zip","8d3bf9ad6fc6703ee8d83f17b070a766"], 276 | [dh+"4",dd+"320","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"], 277 | [dh+"4",dd+"330","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"], 278 | [dh+"4",dd+"350","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"], 279 | [dh+"5",dd+"360","4.6.9960","October 2017",dk+"5/July2017/kobo-update-4.6.9960.zip","68a43ea625c8adcc11e658c5d8b3a6b7"], 280 | [dh+"5",dd+"370","4.6.9960","October 2017",dk+"5/July2017/kobo-update-4.6.9960.zip","68a43ea625c8adcc11e658c5d8b3a6b7"], 281 | [dh+"6",dd+"371","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"], 282 | [dh+"6",dd+"372","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"], 283 | [dh+"6",dd+"373","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"], 284 | [dh+"6",dd+"374","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"], 285 | [dh+"6",dd+"375","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"], 286 | [dh+"3",dd+"310","4.6.9995","October 2017",dk+"3/Oct2017/kobo-update-4.6.9995.zip","40575959beaa24104913f251a3146d16"], 287 | [dh+"4",dd+"320","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"], 288 | [dh+"4",dd+"330","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"], 289 | [dh+"4",dd+"350","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"], 290 | [dh+"5",dd+"360","4.6.9995","October 2017",dk+"5/Oct2017/kobo-update-4.6.9995.zip","033d76bccb8daee6fdf8a822d6ddb3ae"], 291 | [dh+"5",dd+"370","4.6.9995","October 2017",dk+"5/Oct2017/kobo-update-4.6.9995.zip","033d76bccb8daee6fdf8a822d6ddb3ae"], 292 | [dh+"6",dd+"371","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"], 293 | [dh+"6",dd+"372","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"], 294 | [dh+"6",dd+"373","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"], 295 | [dh+"6",dd+"375","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"], 296 | [dh+"4",dd+"330","4.7.10075","November 2017",dk+"4/rakuten-4.6/kobo-update-4.6.10075.zip","c1aa87bf7ecbaebb065b6d67e54714c8"], 297 | [dh+"4",dd+"350","4.7.10075","November 2017",dk+"4/rakuten-4.6/kobo-update-4.6.10075.zip","c1aa87bf7ecbaebb065b6d67e54714c8"], 298 | [dh+"5",dd+"360","4.7.10075","November 2017",dk+"5/rakuten-4.6/kobo-update-4.6.10075.zip","384bb9392b5abbafc3b9649ae5d73888"], 299 | [dh+"5",dd+"370","4.7.10075","November 2017",dk+"5/rakuten-4.6/kobo-update-4.6.10075.zip","384bb9392b5abbafc3b9649ae5d73888"], 300 | [dh+"6",dd+"371","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"], 301 | [dh+"6",dd+"372","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"], 302 | [dh+"6",dd+"373","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"], 303 | [dh+"6",dd+"374","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"], 304 | [dh+"6",dd+"375","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"], 305 | [dh+"6",dd+"381","4.7.10364","December 2017",dk+"6/Dec2017/kobo-limitededitionupdate-4.7.10364.zip","3f8cad1167722637985241adc45d440f"], 306 | [dh+"4",dd+"330","4.7.10413","December 2017",dk+"4/Dec2017/kobo-update-4.7.10413.zip","20abd3426b91438a5b46394e2a405463"], 307 | [dh+"4",dd+"350","4.7.10413","December 2017",dk+"4/Dec2017/kobo-update-4.7.10413.zip","20abd3426b91438a5b46394e2a405463"], 308 | [dh+"5",dd+"360","4.7.10413","December 2017",dk+"5/Dec2017/kobo-update-4.7.10413.zip","f537ba2e5034cc4571f68db0c69f937e"], 309 | [dh+"5",dd+"370","4.7.10413","December 2017",dk+"5/Dec2017/kobo-update-4.7.10413.zip","f537ba2e5034cc4571f68db0c69f937e"], 310 | [dh+"6",dd+"371","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"], 311 | [dh+"6",dd+"372","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"], 312 | [dh+"6",dd+"373","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"], 313 | [dh+"6",dd+"374","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"], 314 | [dh+"6",dd+"375","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"], 315 | [dh+"3",dd+"310","4.8.10956","April 2018",dk+"3/April2018/kobo-update-4.8.10956.zip","78581f9624287f74651be3de3e345faf"], 316 | [dh+"4",dd+"320","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"], 317 | [dh+"4",dd+"330","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"], 318 | [dh+"4",dd+"350","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"], 319 | [dh+"5",dd+"360","4.8.10956","April 2018",dk+"5/April2018/kobo-update-4.8.10956.zip","afbc2cca371b6415e37bb06a6dfde5f2"], 320 | [dh+"5",dd+"370","4.8.10956","April 2018",dk+"5/April2018/kobo-update-4.8.10956.zip","afbc2cca371b6415e37bb06a6dfde5f2"], 321 | [dh+"6",dd+"371","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 322 | [dh+"6",dd+"372","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 323 | [dh+"6",dd+"373","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 324 | [dh+"6",dd+"374","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 325 | [dh+"6",dd+"375","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 326 | [dh+"7",dd+"378","4.8.10956","April 2018",dk+"7/April2018/kobo-update-4.8.zip","2391f2467ced21805c8ccd4c656e572b"], 327 | [dh+"7",dd+"379","4.8.10956","April 2018",dk+"7/April2018/kobo-update-4.8.zip","2391f2467ced21805c8ccd4c656e572b"], 328 | [dh+"6",dd+"381","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"], 329 | [dh+"3",dd+"310","4.8.11073","May 2018",dk+"3/May2018/kobo-update-4.8.11073.zip","9bb491fe03b80fa8f87a71290e8158c4"], 330 | [dh+"4",dd+"320","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"], 331 | [dh+"4",dd+"330","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"], 332 | [dh+"4",dd+"350","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"], 333 | [dh+"5",dd+"360","4.8.11073","May 2018",dk+"5/May2018/kobo-update-4.8.11073.zip","43202cc20b30be263224fc3bff111df1"], 334 | [dh+"5",dd+"370","4.8.11073","May 2018",dk+"5/May2018/kobo-update-4.8.11073.zip","43202cc20b30be263224fc3bff111df1"], 335 | [dh+"6",dd+"371","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 336 | [dh+"6",dd+"372","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 337 | [dh+"6",dd+"373","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 338 | [dh+"6",dd+"374","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 339 | [dh+"6",dd+"375","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 340 | [dh+"7",dd+"378","4.8.11073","May 2018",dk+"7/May2018/kobo-update-4.8.11073.zip","7ba11e60b0728c35c6bc606351b87ac2"], 341 | [dh+"7",dd+"379","4.8.11073","May 2018",dk+"7/May2018/kobo-update-4.8.11073.zip","7ba11e60b0728c35c6bc606351b87ac2"], 342 | [dh+"6",dd+"381","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"], 343 | [dh+"7",dd+"376","4.8.11090","May 2018",dk+"7/May2018/kobo-update-4.8.zip","9a26a8477f62f7387ce327b1d8bf5e45"], 344 | [dh+"6",dd+"373","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"], 345 | [dh+"6",dd+"374","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"], 346 | [dh+"6",dd+"375","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"], 347 | [dh+"7",dd+"376","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"], 348 | [dh+"7",dd+"378","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"], 349 | [dh+"7",dd+"379","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"], 350 | [dh+"6",dd+"381","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"], 351 | [dh+"4",dd+"320","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"], 352 | [dh+"4",dd+"330","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"], 353 | [dh+"4",dd+"350","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"], 354 | [dh+"5",dd+"360","4.9.11314","June 2018",dk+"5/May2018/kobo-update-4.9.11311.zip","2b1f7ec52a7cbde986e22f7509aa3583"], 355 | [dh+"5",dd+"370","4.9.11314","June 2018",dk+"5/May2018/kobo-update-4.9.11311.zip","2b1f7ec52a7cbde986e22f7509aa3583"], 356 | [dh+"6",dd+"373","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"], 357 | [dh+"6",dd+"374","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"], 358 | [dh+"6",dd+"375","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"], 359 | [dh+"7",dd+"376","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"], 360 | [dh+"7",dd+"378","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"], 361 | [dh+"7",dd+"379","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"], 362 | [dh+"6",dd+"381","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"], 363 | [dh+"7",dd+"380","4.11.11911","October 2018",dk+"7/Oct2018/kobo-update-4.11.11911.zip","05b970c838d149e452f1cbc218e3c946"], 364 | [dh+"7",dd+"380","4.11.11976","November 2018",dk+"7/Nov2018/kobo-update-4.11.11976.zip","dbe31e3a9ea7c25a0ca13fedf612401f"], 365 | [dh+"7",dd+"380","4.11.11980","November 2018",dk+"7/Nov2018/kobo-update-4.11.11980.zip","dbe31e3a9ea7c25a0ca13fedf612401f"], 366 | [dh+"7",dd+"380","4.11.11982","November 2018",dk+"7/Nov2018/kobo-update-4.11.11982.zip","473c1c3663ce6b8c626d3039728608a4"], 367 | [dh+"7",dd+"380","4.11.12019","November 2018",da+"7/Nov2018/kobo-update-4.11.12019.zip","dbe31e3a9ea7c25a0ca13fedf612401f"], 368 | [dh+"3",dd+"310","4.12.12111","December 2018",da+"3/Dec2018/kobo-update-4.12.12111.zip","7799734b00a587213ea8cc59a57a6e85"], 369 | [dh+"4",dd+"320","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"], 370 | [dh+"4",dd+"330","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"], 371 | [dh+"4",dd+"350","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"], 372 | [dh+"5",dd+"360","4.12.12111","December 2018",da+"5/Dec2018/kobo-update-4.12.12111.zip","bcdf3cd8c16efc31771c981de4a36ffd"], 373 | [dh+"5",dd+"370","4.12.12111","December 2018",da+"5/Dec2018/kobo-update-4.12.12111.zip","bcdf3cd8c16efc31771c981de4a36ffd"], 374 | [dh+"6",dd+"371","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 375 | [dh+"6",dd+"372","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 376 | [dh+"6",dd+"373","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 377 | [dh+"6",dd+"374","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 378 | [dh+"6",dd+"375","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 379 | [dh+"7",dd+"376","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"], 380 | [dh+"7",dd+"378","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"], 381 | [dh+"7",dd+"379","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"], 382 | [dh+"7",dd+"380","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"], 383 | [dh+"6",dd+"381","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"], 384 | [dh+"3",dd+"310","4.13.12638","April 2019",da+"3/Apr2019/kobo-update-4.13.12638.zip","a11900c3b61a7c51af8bb6684592d244"], 385 | [dh+"4",dd+"320","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"], 386 | [dh+"4",dd+"330","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"], 387 | [dh+"4",dd+"350","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"], 388 | [dh+"5",dd+"360","4.13.12638","April 2019",da+"5/Apr2019/kobo-update-4.13.12638.zip","5380c4e5461c5f93ba20f4da41013ca7"], 389 | [dh+"5",dd+"370","4.13.12638","April 2019",da+"5/Apr2019/kobo-update-4.13.12638.zip","5380c4e5461c5f93ba20f4da41013ca7"], 390 | [dh+"6",dd+"371","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 391 | [dh+"6",dd+"372","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 392 | [dh+"6",dd+"373","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 393 | [dh+"6",dd+"374","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 394 | [dh+"6",dd+"375","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 395 | [dh+"7",dd+"376","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"], 396 | [dh+"7",dd+"378","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"], 397 | [dh+"7",dd+"379","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"], 398 | [dh+"7",dd+"380","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"], 399 | [dh+"6",dd+"381","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"], 400 | [dh+"3",dd+"310","4.13.12638-s","April 2019",da+"3/Apr2019/kobo-update-4.13.12638-s.zip","3ce5e37482ea4166191f101b47996ed2"], 401 | [dh+"4",dd+"320","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"], 402 | [dh+"4",dd+"330","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"], 403 | [dh+"4",dd+"350","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"], 404 | [dh+"5",dd+"360","4.13.12638-s","April 2019",da+"5/Apr2019/kobo-update-4.13.12638-s.zip","f58f1ffbf01d1526e7f2d8e4cc553307"], 405 | [dh+"5",dd+"370","4.13.12638-s","April 2019",da+"5/Apr2019/kobo-update-4.13.12638-s.zip","f58f1ffbf01d1526e7f2d8e4cc553307"], 406 | [dh+"6",dd+"371","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 407 | [dh+"6",dd+"372","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 408 | [dh+"6",dd+"373","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 409 | [dh+"6",dd+"374","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 410 | [dh+"6",dd+"375","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 411 | [dh+"7",dd+"376","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"], 412 | [dh+"7",dd+"378","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"], 413 | [dh+"7",dd+"379","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"], 414 | [dh+"7",dd+"380","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"], 415 | [dh+"6",dd+"381","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"], 416 | [dh+"3",dd+"310","4.14.12777","May 2019",da+"3/May2019/kobo-update-4.14.12777.zip","9f019a31e2df4112a47ee7ea57fc1b19"], 417 | [dh+"4",dd+"320","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"], 418 | [dh+"4",dd+"330","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"], 419 | [dh+"4",dd+"350","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"], 420 | [dh+"5",dd+"360","4.14.12777","May 2019",da+"5/May2019/kobo-update-4.14.12777.zip","64c99fc690affc8301b760d2092f6b57"], 421 | [dh+"5",dd+"370","4.14.12777","May 2019",da+"5/May2019/kobo-update-4.14.12777.zip","64c99fc690affc8301b760d2092f6b57"], 422 | [dh+"6",dd+"371","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 423 | [dh+"6",dd+"372","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 424 | [dh+"6",dd+"373","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 425 | [dh+"6",dd+"374","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 426 | [dh+"6",dd+"375","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 427 | [dh+"7",dd+"376","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"], 428 | [dh+"7",dd+"378","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"], 429 | [dh+"7",dd+"379","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"], 430 | [dh+"7",dd+"380","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"], 431 | [dh+"6",dd+"381","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"], 432 | [dh+"3",dd+"310","4.15.12920","May 2019",da+"3/May2019/kobo-update-4.15.12920.zip","cad1ffbd8899d03d26e25a2a040ffc8b"], 433 | [dh+"4",dd+"320","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"], 434 | [dh+"4",dd+"330","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"], 435 | [dh+"4",dd+"350","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"], 436 | [dh+"5",dd+"360","4.15.12920","May 2019",da+"5/May2019/kobo-update-4.15.12920.zip","3fa7fd20f6a38c2949494ee74ae6c4a5"], 437 | [dh+"5",dd+"370","4.15.12920","May 2019",da+"5/May2019/kobo-update-4.15.12920.zip","3fa7fd20f6a38c2949494ee74ae6c4a5"], 438 | [dh+"6",dd+"371","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 439 | [dh+"6",dd+"372","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 440 | [dh+"6",dd+"373","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 441 | [dh+"6",dd+"374","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 442 | [dh+"6",dd+"375","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 443 | [dh+"7",dd+"376","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"], 444 | [dh+"7",dd+"378","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"], 445 | [dh+"7",dd+"379","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"], 446 | [dh+"7",dd+"380","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"], 447 | [dh+"6",dd+"381","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"], 448 | [dh+"7",dd+"384","4.16.13337","August 2019",da+"7/Aug2019/kobo-update-4.16.13337.zip","bd2de1e06361fe6e6d760c53fa8e4fe8"], 449 | [dh+"3",dd+"310","4.17.13651","September 2019",da+"3/Sept2019/kobo-update-4.17.13651.zip","a01e4af4660e9dfcd63ca9bbef75052c"], 450 | [dh+"4",dd+"320","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"], 451 | [dh+"4",dd+"330","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"], 452 | [dh+"4",dd+"350","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"], 453 | [dh+"5",dd+"360","4.17.13651","September 2019",da+"5/Sept2019/kobo-update-4.17.13651.zip","05d0670530f47ae02b7234bec1d8be66"], 454 | [dh+"5",dd+"370","4.17.13651","September 2019",da+"5/Sept2019/kobo-update-4.17.13651.zip","05d0670530f47ae02b7234bec1d8be66"], 455 | [dh+"6",dd+"371","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 456 | [dh+"6",dd+"372","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 457 | [dh+"6",dd+"373","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 458 | [dh+"6",dd+"374","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 459 | [dh+"6",dd+"375","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 460 | [dh+"7",dd+"376","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"], 461 | [dh+"7",dd+"378","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"], 462 | [dh+"7",dd+"379","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"], 463 | [dh+"7",dd+"380","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"], 464 | [dh+"6",dd+"381","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"], 465 | [dh+"7",dd+"384","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"], 466 | [dh+"3",dd+"310","4.17.13694","September 2019",da+"3/Sept2019/kobo-update-4.17.13694.zip","26233079c0cb6266c96ded44ccc7e569"], 467 | [dh+"4",dd+"320","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"], 468 | [dh+"4",dd+"330","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"], 469 | [dh+"4",dd+"350","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"], 470 | [dh+"5",dd+"360","4.17.13694","September 2019",da+"5/Sept2019/kobo-update-4.17.13694.zip","492fbafa13ce24a4db48602b413c1814"], 471 | [dh+"5",dd+"370","4.17.13694","September 2019",da+"5/Sept2019/kobo-update-4.17.13694.zip","492fbafa13ce24a4db48602b413c1814"], 472 | [dh+"6",dd+"371","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 473 | [dh+"6",dd+"372","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 474 | [dh+"6",dd+"373","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 475 | [dh+"6",dd+"374","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 476 | [dh+"6",dd+"375","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 477 | [dh+"7",dd+"376","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"], 478 | [dh+"7",dd+"378","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"], 479 | [dh+"7",dd+"379","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"], 480 | [dh+"7",dd+"380","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"], 481 | [dh+"6",dd+"381","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"], 482 | [dh+"7",dd+"384","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"], 483 | [dh+"3",dd+"310","4.18.13737","September 2019",da+"3/Sept2019/kobo-update-4.18.13737.zip","77d5940894b7341cc0ca469bd557ad3b"], 484 | [dh+"4",dd+"320","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"], 485 | [dh+"4",dd+"330","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"], 486 | [dh+"4",dd+"350","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"], 487 | [dh+"5",dd+"360","4.18.13737","September 2019",da+"5/Sept2019/kobo-update-4.18.13737.zip","b582aec95610098319ecf083456f3252"], 488 | [dh+"5",dd+"370","4.18.13737","September 2019",da+"5/Sept2019/kobo-update-4.18.13737.zip","b582aec95610098319ecf083456f3252"], 489 | [dh+"6",dd+"371","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 490 | [dh+"6",dd+"372","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 491 | [dh+"6",dd+"373","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 492 | [dh+"6",dd+"374","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 493 | [dh+"6",dd+"375","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 494 | [dh+"7",dd+"376","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"], 495 | [dh+"7",dd+"378","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"], 496 | [dh+"7",dd+"379","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"], 497 | [dh+"7",dd+"380","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"], 498 | [dh+"6",dd+"381","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"], 499 | [dh+"7",dd+"384","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"], 500 | [dh+"3",dd+"310","4.19.14123","December 2019",da+"3/Dec2019/kobo-update-4.19.14123.zip","fb0a40b1839e667f6b2300d461561711"], 501 | [dh+"4",dd+"320","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"], 502 | [dh+"4",dd+"330","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"], 503 | [dh+"4",dd+"350","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"], 504 | [dh+"5",dd+"360","4.19.14123","December 2019",da+"5/Dec2019/kobo-update-4.19.14123.zip","31404d8a48997bef45ad57655757a5c8"], 505 | [dh+"5",dd+"370","4.19.14123","December 2019",da+"5/Dec2019/kobo-update-4.19.14123.zip","31404d8a48997bef45ad57655757a5c8"], 506 | [dh+"6",dd+"371","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 507 | [dh+"6",dd+"372","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 508 | [dh+"6",dd+"373","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 509 | [dh+"6",dd+"374","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 510 | [dh+"6",dd+"375","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 511 | [dh+"7",dd+"376","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"], 512 | [dh+"7",dd+"378","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"], 513 | [dh+"7",dd+"379","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"], 514 | [dh+"7",dd+"380","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"], 515 | [dh+"6",dd+"381","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"], 516 | [dh+"7",dd+"384","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"], 517 | [dh+"3",dd+"310","4.20.14601","February 2020",da+"3/Feb2020/kobo-update-4.20.14601.zip","99d3fbf29e2f59f5e5483c11047b783d"], 518 | [dh+"4",dd+"320","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"], 519 | [dh+"4",dd+"330","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"], 520 | [dh+"4",dd+"350","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"], 521 | [dh+"5",dd+"360","4.20.14601","February 2020",da+"5/Feb2020/kobo-update-4.20.14601.zip","7754e129a3d007ae4a53d56cb594b39b"], 522 | [dh+"5",dd+"370","4.20.14601","February 2020",da+"5/Feb2020/kobo-update-4.20.14601.zip","7754e129a3d007ae4a53d56cb594b39b"], 523 | [dh+"6",dd+"371","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 524 | [dh+"6",dd+"372","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 525 | [dh+"6",dd+"373","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 526 | [dh+"6",dd+"374","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 527 | [dh+"6",dd+"375","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 528 | [dh+"7",dd+"376","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"], 529 | [dh+"7",dd+"378","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"], 530 | [dh+"7",dd+"379","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"], 531 | [dh+"7",dd+"380","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"], 532 | [dh+"6",dd+"381","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"], 533 | [dh+"7",dd+"384","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"], 534 | [dh+"3",dd+"310","4.20.14617","March 2020",da+"3/Mar2020/kobo-update-4.20.14617.zip","484b729fc27488dc608f36bac7d8cf42"], 535 | [dh+"4",dd+"320","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"], 536 | [dh+"4",dd+"330","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"], 537 | [dh+"4",dd+"350","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"], 538 | [dh+"5",dd+"360","4.20.14617","March 2020",da+"5/Mar2020/kobo-update-4.20.14617.zip","61567854623e35a3bdeb5a36a5e1f395"], 539 | [dh+"5",dd+"370","4.20.14617","March 2020",da+"5/Mar2020/kobo-update-4.20.14617.zip","61567854623e35a3bdeb5a36a5e1f395"], 540 | [dh+"6",dd+"371","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 541 | [dh+"6",dd+"372","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 542 | [dh+"6",dd+"373","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 543 | [dh+"6",dd+"374","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 544 | [dh+"6",dd+"375","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 545 | [dh+"7",dd+"376","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"], 546 | [dh+"7",dd+"378","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"], 547 | [dh+"7",dd+"379","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"], 548 | [dh+"7",dd+"380","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"], 549 | [dh+"6",dd+"381","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"], 550 | [dh+"7",dd+"384","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"], 551 | [dh+"3",dd+"310","4.20.14622","March 2020",da+"3/Mar2020/kobo-update-4.20.14622.zip","4ab3a3b0e8a672e0c367c45ecdb43637"], 552 | [dh+"4",dd+"320","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"], 553 | [dh+"4",dd+"330","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"], 554 | [dh+"4",dd+"350","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"], 555 | [dh+"5",dd+"360","4.20.14622","March 2020",da+"5/Mar2020/kobo-update-4.20.14622.zip","dd23bb318942a2b8a44cf021502b664e"], 556 | [dh+"5",dd+"370","4.20.14622","March 2020",da+"5/Mar2020/kobo-update-4.20.14622.zip","dd23bb318942a2b8a44cf021502b664e"], 557 | [dh+"6",dd+"371","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 558 | [dh+"6",dd+"372","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 559 | [dh+"6",dd+"373","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 560 | [dh+"6",dd+"374","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 561 | [dh+"6",dd+"375","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 562 | [dh+"7",dd+"376","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"], 563 | [dh+"7",dd+"378","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"], 564 | [dh+"7",dd+"379","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"], 565 | [dh+"7",dd+"380","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"], 566 | [dh+"6",dd+"381","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"], 567 | [dh+"7",dd+"384","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"], 568 | [dh+"3",dd+"310","4.21.15015","May 2020",da+"3/May2020/kobo-update-4.21.15015.zip","960dd60a04bbb418b453d20487707446"], 569 | [dh+"4",dd+"320","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"], 570 | [dh+"4",dd+"330","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"], 571 | [dh+"4",dd+"350","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"], 572 | [dh+"5",dd+"360","4.21.15015","May 2020",da+"5/May2020/kobo-update-4.21.15015.zip","842caf754eb51c4b6c2ce2ebe0cb9629"], 573 | [dh+"5",dd+"370","4.21.15015","May 2020",da+"5/May2020/kobo-update-4.21.15015.zip","842caf754eb51c4b6c2ce2ebe0cb9629"], 574 | [dh+"6",dd+"371","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 575 | [dh+"6",dd+"372","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 576 | [dh+"6",dd+"373","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 577 | [dh+"6",dd+"374","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 578 | [dh+"6",dd+"375","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 579 | [dh+"7",dd+"376","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"], 580 | [dh+"7",dd+"378","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"], 581 | [dh+"7",dd+"379","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"], 582 | [dh+"7",dd+"380","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"], 583 | [dh+"6",dd+"381","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"], 584 | [dh+"7",dd+"384","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"], 585 | [dh+"3",dd+"310","4.22.15190","June 2020",da+"3/Jun2020/kobo-update-4.22.15190.zip","7c2d43bf48705681ade7f70dc7f0fe8b"], 586 | [dh+"4",dd+"320","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"], 587 | [dh+"4",dd+"330","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"], 588 | [dh+"4",dd+"350","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"], 589 | [dh+"5",dd+"360","4.22.15190","June 2020",da+"5/Jun2020/kobo-update-4.22.15190.zip","b727441eebff8140421e3f2288f12cec"], 590 | [dh+"5",dd+"370","4.22.15190","June 2020",da+"5/Jun2020/kobo-update-4.22.15190.zip","b727441eebff8140421e3f2288f12cec"], 591 | [dh+"6",dd+"371","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 592 | [dh+"6",dd+"372","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 593 | [dh+"6",dd+"373","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 594 | [dh+"6",dd+"374","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 595 | [dh+"6",dd+"375","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 596 | [dh+"7",dd+"376","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"], 597 | [dh+"7",dd+"378","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"], 598 | [dh+"7",dd+"379","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"], 599 | [dh+"7",dd+"380","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"], 600 | [dh+"6",dd+"381","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"], 601 | [dh+"7",dd+"384","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"], 602 | [dh+"7",dd+"382","4.22.15268","July 2020",da+"7/Jul2020/kobo-update-4.22.15268.zip","504812ccf4e5a027b0faabd03736a493"], 603 | [dh+"3",dd+"310","4.23.15505","August 2020",da+"3/Aug2020/kobo-update-4.23.15505.zip","b6533b6ff5beba4118b8488cd724f9bf"], 604 | [dh+"4",dd+"320","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"], 605 | [dh+"4",dd+"330","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"], 606 | [dh+"4",dd+"350","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"], 607 | [dh+"5",dd+"360","4.23.15505","August 2020",da+"5/Aug2020/kobo-update-4.23.15505.zip","ec2c10da79430ce8856fd49bb957a88d"], 608 | [dh+"5",dd+"370","4.23.15505","August 2020",da+"5/Aug2020/kobo-update-4.23.15505.zip","ec2c10da79430ce8856fd49bb957a88d"], 609 | [dh+"6",dd+"371","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 610 | [dh+"6",dd+"372","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 611 | [dh+"6",dd+"373","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 612 | [dh+"6",dd+"374","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 613 | [dh+"6",dd+"375","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 614 | [dh+"7",dd+"376","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 615 | [dh+"7",dd+"378","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 616 | [dh+"7",dd+"379","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 617 | [dh+"7",dd+"380","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 618 | [dh+"6",dd+"381","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"], 619 | [dh+"7",dd+"382","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 620 | [dh+"7",dd+"384","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"], 621 | [dh+"3",dd+"310","4.23.15548","August 2020",da+"3/Aug2020/kobo-update-4.23.15548.zip","22a015cc0df127a2963f7267096c62b0"], 622 | [dh+"4",dd+"320","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"], 623 | [dh+"4",dd+"330","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"], 624 | [dh+"4",dd+"350","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"], 625 | [dh+"5",dd+"360","4.23.15548","August 2020",da+"5/Aug2020/kobo-update-4.23.15548.zip","9c455d7bc2bc6d710f1f1941c9f49be2"], 626 | [dh+"5",dd+"370","4.23.15548","August 2020",da+"5/Aug2020/kobo-update-4.23.15548.zip","9c455d7bc2bc6d710f1f1941c9f49be2"], 627 | [dh+"6",dd+"371","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 628 | [dh+"6",dd+"372","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 629 | [dh+"6",dd+"373","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 630 | [dh+"6",dd+"374","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 631 | [dh+"6",dd+"375","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 632 | [dh+"7",dd+"376","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 633 | [dh+"7",dd+"378","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 634 | [dh+"7",dd+"379","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 635 | [dh+"7",dd+"380","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 636 | [dh+"6",dd+"381","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"], 637 | [dh+"7",dd+"382","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 638 | [dh+"7",dd+"384","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"], 639 | [dh+"3",dd+"310","4.24.15672","September 2020",da+"3/Sep2020/kobo-update-4.24.15672.zip","48afc6b1f2ef41b12c95f7bf7f5c8757"], 640 | [dh+"4",dd+"320","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"], 641 | [dh+"4",dd+"330","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"], 642 | [dh+"4",dd+"350","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"], 643 | [dh+"5",dd+"360","4.24.15672","September 2020",da+"5/Sep2020/kobo-update-4.24.15672.zip","ec7c4dcbc11a11ba0fc71bfb4b703eb2"], 644 | [dh+"5",dd+"370","4.24.15672","September 2020",da+"5/Sep2020/kobo-update-4.24.15672.zip","ec7c4dcbc11a11ba0fc71bfb4b703eb2"], 645 | [dh+"6",dd+"371","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 646 | [dh+"6",dd+"372","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 647 | [dh+"6",dd+"373","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 648 | [dh+"6",dd+"374","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 649 | [dh+"6",dd+"375","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 650 | [dh+"7",dd+"376","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 651 | [dh+"7",dd+"378","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 652 | [dh+"7",dd+"379","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 653 | [dh+"7",dd+"380","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 654 | [dh+"6",dd+"381","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"], 655 | [dh+"7",dd+"382","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 656 | [dh+"7",dd+"384","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"], 657 | [dh+"3",dd+"310","4.24.15676","September 2020",da+"3/Sep2020/kobo-update-4.24.15676.zip","c7690efd962f510706d0859ce53511cb"], 658 | [dh+"4",dd+"320","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"], 659 | [dh+"4",dd+"330","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"], 660 | [dh+"4",dd+"350","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"], 661 | [dh+"5",dd+"360","4.24.15676","September 2020",da+"5/Sep2020/kobo-update-4.24.15676.zip","ed6c0363f139af08923c0f7a4f761f81"], 662 | [dh+"5",dd+"370","4.24.15676","September 2020",da+"5/Sep2020/kobo-update-4.24.15676.zip","ed6c0363f139af08923c0f7a4f761f81"], 663 | [dh+"6",dd+"371","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 664 | [dh+"6",dd+"372","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 665 | [dh+"6",dd+"373","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 666 | [dh+"6",dd+"374","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 667 | [dh+"6",dd+"375","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 668 | [dh+"7",dd+"376","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 669 | [dh+"7",dd+"378","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 670 | [dh+"7",dd+"379","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 671 | [dh+"7",dd+"380","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 672 | [dh+"6",dd+"381","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"], 673 | [dh+"7",dd+"382","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 674 | [dh+"7",dd+"384","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"], 675 | [dh+"3",dd+"310","4.25.15875","November 2020",da+"3/Nov2020/kobo-update-4.25.15875.zip","6eb450621f7470dbc8c6a224bef42450"], 676 | [dh+"4",dd+"320","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"], 677 | [dh+"4",dd+"330","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"], 678 | [dh+"4",dd+"350","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"], 679 | [dh+"5",dd+"360","4.25.15875","November 2020",da+"5/Nov2020/kobo-update-4.25.15875.zip","4ddaff5579d333540228c4706059d654"], 680 | [dh+"5",dd+"370","4.25.15875","November 2020",da+"5/Nov2020/kobo-update-4.25.15875.zip","4ddaff5579d333540228c4706059d654"], 681 | [dh+"6",dd+"371","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 682 | [dh+"6",dd+"372","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 683 | [dh+"6",dd+"373","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 684 | [dh+"6",dd+"374","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 685 | [dh+"6",dd+"375","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 686 | [dh+"7",dd+"376","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 687 | [dh+"7",dd+"378","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 688 | [dh+"7",dd+"379","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 689 | [dh+"7",dd+"380","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 690 | [dh+"6",dd+"381","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"], 691 | [dh+"7",dd+"382","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 692 | [dh+"7",dd+"384","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"], 693 | [dh+"3",dd+"310","4.26.16704","February 2021",da+"3/Feb2021/kobo-update-4.26.16704.zip","06721016b086f18884ab9d37a975f88e"], 694 | [dh+"4",dd+"320","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"], 695 | [dh+"4",dd+"330","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"], 696 | [dh+"4",dd+"350","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"], 697 | [dh+"5",dd+"360","4.26.16704","February 2021",da+"5/Feb2021/kobo-update-4.26.16704.zip","4e5a543f958d4e84bd2e3f92096b6492"], 698 | [dh+"5",dd+"370","4.26.16704","February 2021",da+"5/Feb2021/kobo-update-4.26.16704.zip","4e5a543f958d4e84bd2e3f92096b6492"], 699 | [dh+"6",dd+"371","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 700 | [dh+"6",dd+"372","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 701 | [dh+"6",dd+"373","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 702 | [dh+"6",dd+"374","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 703 | [dh+"6",dd+"375","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 704 | [dh+"7",dd+"376","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 705 | [dh+"7",dd+"378","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 706 | [dh+"7",dd+"379","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 707 | [dh+"7",dd+"380","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 708 | [dh+"6",dd+"381","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"], 709 | [dh+"7",dd+"382","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 710 | [dh+"7",dd+"384","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"], 711 | [dh+"8",dd+"387","4.28.17623","June 2021",da+"8/May2021/kobo-update-4.28.17623-TF6412.zip","285ac4377e8aab902ca084eaf3604b3d"], 712 | [dh+"8",dd+"387","4.28.17820","June 2021",da+"8/June2021/kobo-update-4.28.17820-TouchFW-6417.zip","eac3aa52f2afaf17a8083cce33869bc8"], 713 | [dh+"8",dd+"387","4.28.17826","June 2021",da+"8/June2021/kobo-update-4.28.17826-TouchFW-6417.zip","344aa5d2c3e260baeb484bc5c8cce980"], 714 | [dh+"8",dd+"387","4.28.17925","July 2021",da+"8/July2021/kobo-update-4.28.17925.zip","97a926fb1faa74d216c4222998ae354a"], 715 | [dh+"3",dd+"310","4.28.18220","August 2021",da+"3/Aug2021/kobo-update-4.28.18220.zip","1862c9db921397b7bbfd93bec310ce6e"], 716 | [dh+"4",dd+"320","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"], 717 | [dh+"4",dd+"330","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"], 718 | [dh+"4",dd+"350","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"], 719 | [dh+"5",dd+"360","4.28.18220","August 2021",da+"5/Aug2021/kobo-update-4.28.18220.zip","b3a2d6ad2c8d8c27f594ac5b789fde84"], 720 | [dh+"5",dd+"370","4.28.18220","August 2021",da+"5/Aug2021/kobo-update-4.28.18220.zip","b3a2d6ad2c8d8c27f594ac5b789fde84"], 721 | [dh+"6",dd+"371","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 722 | [dh+"6",dd+"372","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 723 | [dh+"6",dd+"373","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 724 | [dh+"6",dd+"374","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 725 | [dh+"6",dd+"375","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 726 | [dh+"7",dd+"376","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 727 | [dh+"7",dd+"378","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 728 | [dh+"7",dd+"379","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 729 | [dh+"7",dd+"380","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 730 | [dh+"6",dd+"381","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"], 731 | [dh+"7",dd+"382","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 732 | [dh+"7",dd+"384","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"], 733 | [dh+"8",dd+"383","4.29.18730","October 2021",da+"8/Oct2021/kobo-update-4.29.18730.zip","4fce1ba8e2a7110285fe4aa1baf17fa8"], 734 | [dh+"9",dd+"388","4.29.18730","October 2021",da+"9/Oct2021/kobo-update-4.29.18730-TF6408.zip","c41874f2bde070c9f03a5141e8cc2d2a"], 735 | [dh+"3",dd+"310","4.30.18838","November 2021",da+"3/Nov2021/kobo-update-4.30.18838.zip","7939b71940b0adc6b1f80072eac1a3c4"], 736 | [dh+"4",dd+"320","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"], 737 | [dh+"4",dd+"330","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"], 738 | [dh+"4",dd+"350","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"], 739 | [dh+"5",dd+"360","4.30.18838","November 2021",da+"5/Nov2021/kobo-update-4.30.18838.zip","137afedf74b8d51156fea5db45970c0c"], 740 | [dh+"5",dd+"370","4.30.18838","November 2021",da+"5/Nov2021/kobo-update-4.30.18838.zip","137afedf74b8d51156fea5db45970c0c"], 741 | [dh+"6",dd+"371","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 742 | [dh+"6",dd+"372","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 743 | [dh+"6",dd+"373","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 744 | [dh+"6",dd+"374","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 745 | [dh+"6",dd+"375","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 746 | [dh+"7",dd+"376","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 747 | [dh+"7",dd+"378","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 748 | [dh+"7",dd+"379","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 749 | [dh+"7",dd+"380","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 750 | [dh+"6",dd+"381","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"], 751 | [dh+"7",dd+"382","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 752 | [dh+"7",dd+"384","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"], 753 | [dh+"8",dd+"387","4.30.18838","November 2021",da+"8/Nov2021/kobo-update-4.30.18838.zip","4a3c664297505034e3b92092663b5674"], 754 | [dh+"8",dd+"383","4.30.18838","November 2021",da+"8/Nov2021/kobo-update-4.30.18838.zip","4a3c664297505034e3b92092663b5674"], 755 | [dh+"9",dd+"388","4.30.18838","November 2021",da+"9/Nov2021/kobo-update-4.30.18838.zip","2baee7c983ca20620e3cf8b0b366734e"], 756 | [dh+"3",dd+"310","4.31.19086","January 2022",da+"3/Jan2022/kobo-update-4.31.19086.zip","f13929745e9c2a679d15b47e2dfbb7da"], 757 | [dh+"4",dd+"320","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"], 758 | [dh+"4",dd+"330","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"], 759 | [dh+"4",dd+"350","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"], 760 | [dh+"5",dd+"360","4.31.19086","January 2022",da+"5/Jan2022/kobo-update-4.31.19086.zip","df4a625b2f5aa64ca94eb54b331b957f"], 761 | [dh+"5",dd+"370","4.31.19086","January 2022",da+"5/Jan2022/kobo-update-4.31.19086.zip","df4a625b2f5aa64ca94eb54b331b957f"], 762 | [dh+"6",dd+"371","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 763 | [dh+"6",dd+"372","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 764 | [dh+"6",dd+"373","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 765 | [dh+"6",dd+"374","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 766 | [dh+"6",dd+"375","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 767 | [dh+"7",dd+"376","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 768 | [dh+"7",dd+"378","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 769 | [dh+"7",dd+"379","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 770 | [dh+"7",dd+"380","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 771 | [dh+"6",dd+"381","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"], 772 | [dh+"7",dd+"382","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 773 | [dh+"7",dd+"384","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"], 774 | [dh+"8",dd+"387","4.31.19086","January 2022",da+"8/Jan2022/kobo-update-4.31.19086.zip","83cee24c3c584f0026dd33dc00adc21f"], 775 | [dh+"8",dd+"383","4.31.19086","January 2022",da+"8/Jan2022/kobo-update-4.31.19086.zip","83cee24c3c584f0026dd33dc00adc21f"], 776 | [dh+"9",dd+"388","4.31.19086","January 2022",da+"9/Jan2022/kobo-update-4.31.19086.zip","80ee29698be2a87fb4d37d0abefc703e"], 777 | [dh+"3",dd+"310","4.32.19501","April 2022",da+"3/Apr2022/kobo-update-4.32.19501.zip","9266082b5233fca2be7aee6522e1107a"], 778 | [dh+"4",dd+"320","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"], 779 | [dh+"4",dd+"330","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"], 780 | [dh+"4",dd+"350","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"], 781 | [dh+"5",dd+"360","4.32.19501","April 2022",da+"5/Apr2022/kobo-update-4.32.19501.zip","ff7f93cf1e6638f2308d9a85e9798124"], 782 | [dh+"5",dd+"370","4.32.19501","April 2022",da+"5/Apr2022/kobo-update-4.32.19501.zip","ff7f93cf1e6638f2308d9a85e9798124"], 783 | [dh+"6",dd+"371","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 784 | [dh+"6",dd+"372","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 785 | [dh+"6",dd+"373","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 786 | [dh+"6",dd+"374","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 787 | [dh+"6",dd+"375","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 788 | [dh+"7",dd+"376","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 789 | [dh+"7",dd+"378","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 790 | [dh+"7",dd+"379","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 791 | [dh+"7",dd+"380","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 792 | [dh+"6",dd+"381","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"], 793 | [dh+"7",dd+"382","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 794 | [dh+"7",dd+"384","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"], 795 | [dh+"8",dd+"387","4.32.19501","April 2022",da+"8/Apr2022/kobo-update-4.32.19501.zip","bcffe5447cdee07d25516e8ddf29952a"], 796 | [dh+"8",dd+"383","4.32.19501","April 2022",da+"8/Apr2022/kobo-update-4.32.19501.zip","bcffe5447cdee07d25516e8ddf29952a"], 797 | [dh+"9",dd+"388","4.32.19501","April 2022",da+"9/Apr2022/kobo-update-4.32.19501.zip","7fa52602c83c183eabddc51723d9f932"], 798 | [dh+"3",dd+"310","4.33.19608","May 2022",da+"3/May2022/kobo-update-4.33.19608.zip","e999012de836ecda5aad6369b61a9f49"], 799 | [dh+"4",dd+"320","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"], 800 | [dh+"4",dd+"330","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"], 801 | [dh+"4",dd+"350","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"], 802 | [dh+"5",dd+"360","4.33.19608","May 2022",da+"5/May2022/kobo-update-4.33.19608.zip","ca2196065643d49acf1ce2baf68389d9"], 803 | [dh+"5",dd+"370","4.33.19608","May 2022",da+"5/May2022/kobo-update-4.33.19608.zip","ca2196065643d49acf1ce2baf68389d9"], 804 | [dh+"6",dd+"371","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 805 | [dh+"6",dd+"372","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 806 | [dh+"6",dd+"373","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 807 | [dh+"6",dd+"374","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 808 | [dh+"6",dd+"375","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 809 | [dh+"7",dd+"376","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 810 | [dh+"7",dd+"378","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 811 | [dh+"7",dd+"379","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 812 | [dh+"7",dd+"380","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 813 | [dh+"6",dd+"381","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"], 814 | [dh+"7",dd+"382","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 815 | [dh+"7",dd+"384","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"], 816 | [dh+"8",dd+"387","4.33.19608","May 2022",da+"8/May2022/kobo-update-4.33.19608.zip","33c9c23b9af191eaa0bd4a02d3dc07fe"], 817 | [dh+"8",dd+"383","4.33.19608","May 2022",da+"8/May2022/kobo-update-4.33.19608.zip","33c9c23b9af191eaa0bd4a02d3dc07fe"], 818 | [dh+"9",dd+"388","4.33.19608","May 2022",da+"9/May2022/kobo-update-4.33.19608.zip","0ab6183ae49e9cb84648a1f92213c0e8"], 819 | [dh+"7",dd+"376","4.33.19611","June 2022",da+"7/Jun2022/kobo-update-4.33.19611.zip","0e8d3e7ed27fbaecd5cb62e94b2616a5"], 820 | [dh+"7",dd+"382","4.33.19611","June 2022",da+"7/Jun2022/kobo-update-4.33.19611.zip","0e8d3e7ed27fbaecd5cb62e94b2616a5"], 821 | [dh+"8",dd+"383","4.33.19611","June 2022",da+"8/Jun2022/kobo-update-4.33.19611.zip","ad54d56f91bc5623318768bc12fe8d7d"], 822 | [dh+"9",dd+"388","4.33.19611","June 2022",da+"9/Jun2022/kobo-update-4.33.19611.zip","fcbfcf6ddcb53c6506d3a6812773c2f6"], 823 | [dh+"3",dd+"310","4.33.19759","July 2022",da+"3/Jul2022/kobo-update-4.33.19759.zip","75c35cf52711989fd826f9fdf1d037be"], 824 | [dh+"4",dd+"320","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"], 825 | [dh+"4",dd+"330","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"], 826 | [dh+"4",dd+"350","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"], 827 | [dh+"5",dd+"360","4.33.19759","July 2022",da+"5/Jul2022/kobo-update-4.33.19759.zip","efcb2539540662d7b8c253eef5beaf8f"], 828 | [dh+"5",dd+"370","4.33.19759","July 2022",da+"5/Jul2022/kobo-update-4.33.19759.zip","efcb2539540662d7b8c253eef5beaf8f"], 829 | [dh+"6",dd+"371","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 830 | [dh+"6",dd+"372","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 831 | [dh+"6",dd+"373","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 832 | [dh+"6",dd+"374","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 833 | [dh+"6",dd+"375","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 834 | [dh+"7",dd+"376","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 835 | [dh+"7",dd+"378","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 836 | [dh+"7",dd+"379","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 837 | [dh+"7",dd+"380","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 838 | [dh+"6",dd+"381","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"], 839 | [dh+"7",dd+"382","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 840 | [dh+"7",dd+"384","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"], 841 | [dh+"8",dd+"387","4.33.19759","July 2022",da+"8/Jul2022/kobo-update-4.33.19759.zip","4b9eee767b199a04ee38ce01249ef077"], 842 | [dh+"8",dd+"383","4.33.19759","July 2022",da+"8/Jul2022/kobo-update-4.33.19759.zip","4b9eee767b199a04ee38ce01249ef077"], 843 | [dh+"9",dd+"388","4.33.19759","July 2022",da+"9/Jul2022/kobo-update-4.33.19759.zip","6f52595794232b814e686839c03a9f7f"], 844 | [dh+"3",dd+"310","4.34.20097","September 2022",da+"3/Sep2022/kobo-update-4.34.20097.zip","9c0454a10675dc4b787eb555efc5c136"], 845 | [dh+"4",dd+"320","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"], 846 | [dh+"4",dd+"330","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"], 847 | [dh+"4",dd+"350","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"], 848 | [dh+"5",dd+"360","4.34.20097","September 2022",da+"5/Sep2022/kobo-update-4.34.20097.zip","f9b9f9d483accbd665227efc40185ca2"], 849 | [dh+"5",dd+"370","4.34.20097","September 2022",da+"5/Sep2022/kobo-update-4.34.20097.zip","f9b9f9d483accbd665227efc40185ca2"], 850 | [dh+"6",dd+"371","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 851 | [dh+"6",dd+"372","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 852 | [dh+"6",dd+"373","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 853 | [dh+"6",dd+"374","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 854 | [dh+"6",dd+"375","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 855 | [dh+"7",dd+"376","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 856 | [dh+"7",dd+"378","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 857 | [dh+"7",dd+"379","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 858 | [dh+"7",dd+"380","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 859 | [dh+"6",dd+"381","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"], 860 | [dh+"7",dd+"382","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 861 | [dh+"7",dd+"384","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"], 862 | [dh+"8",dd+"387","4.34.20097","September 2022",da+"8/Sep2022/kobo-update-4.34.20097.zip","5b66c42d79f8c45eb416d636aa5d3ce5"], 863 | [dh+"8",dd+"383","4.34.20097","September 2022",da+"8/Sep2022/kobo-update-4.34.20097.zip","5b66c42d79f8c45eb416d636aa5d3ce5"], 864 | [dh+"9",dd+"388","4.34.20097","September 2022",da+"9/Sep2022/kobo-update-4.34.20097.zip","9b2f5a83f8859854dfd467b3bcd4b3c8"], 865 | [dh+"10",dd+"386","4.34.20097","September 2022",da+"10/Sep2022/kobo-update-4.34.20097.zip","68f862e62450bea445da9b03dc50e2a0"], 866 | [dh+"3",dd+"310","4.35.20400","December 2022",da+"3/Dec2022/kobo-update-4.35.20400.zip","23cab980522f32860aa1e3bf2ee4519e"], 867 | [dh+"4",dd+"320","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"], 868 | [dh+"4",dd+"330","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"], 869 | [dh+"4",dd+"350","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"], 870 | [dh+"5",dd+"360","4.35.20400","December 2022",da+"5/Dec2022/kobo-update-4.35.20400.zip","d1538ea29955972872f401b68e568a69"], 871 | [dh+"5",dd+"370","4.35.20400","December 2022",da+"5/Dec2022/kobo-update-4.35.20400.zip","d1538ea29955972872f401b68e568a69"], 872 | [dh+"6",dd+"371","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 873 | [dh+"6",dd+"372","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 874 | [dh+"6",dd+"373","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 875 | [dh+"6",dd+"374","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 876 | [dh+"6",dd+"375","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 877 | [dh+"7",dd+"376","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 878 | [dh+"7",dd+"378","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 879 | [dh+"7",dd+"379","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 880 | [dh+"7",dd+"380","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 881 | [dh+"6",dd+"381","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"], 882 | [dh+"7",dd+"382","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 883 | [dh+"7",dd+"384","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"], 884 | [dh+"8",dd+"387","4.35.20400","December 2022",da+"8/Dec2022/kobo-update-4.35.20400.zip","ebbcaf4c9b721c6adee87ae77657b272"], 885 | [dh+"8",dd+"383","4.35.20400","December 2022",da+"8/Dec2022/kobo-update-4.35.20400.zip","ebbcaf4c9b721c6adee87ae77657b272"], 886 | [dh+"9",dd+"388","4.35.20400","December 2022",da+"9/Dec2022/kobo-update-4.35.20400.zip","b3aa426aba75de106f7fd4fd06bd5de0"], 887 | [dh+"10",dd+"386","4.35.20400","December 2022",da+"10/Dec2022/kobo-update-4.35.20400.zip","b8f76146e47413177168271d3439b3dc"], 888 | [dh+"11",dd+"389","4.36.21095","April 2023",da+"11/Apr2023/kobo-update-4.36.21095.zip","540d5db1b0878430dcbad0554c024ce5"], 889 | [dh+"3",dd+"310","4.37.21533","June 2023",da+"3/Jun2023/kobo-update-4.37.21533.zip","5ca26ba46a60d5eeac81cb4586913f72"], 890 | [dh+"4",dd+"320","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"], 891 | [dh+"4",dd+"330","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"], 892 | [dh+"4",dd+"350","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"], 893 | [dh+"5",dd+"360","4.37.21533","June 2023",da+"5/Jun2023/kobo-update-4.37.21533.zip","1b4d14823f09b4d4fb18e8407d16a815"], 894 | [dh+"5",dd+"370","4.37.21533","June 2023",da+"5/Jun2023/kobo-update-4.37.21533.zip","1b4d14823f09b4d4fb18e8407d16a815"], 895 | [dh+"6",dd+"371","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 896 | [dh+"6",dd+"372","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 897 | [dh+"6",dd+"373","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 898 | [dh+"6",dd+"374","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 899 | [dh+"6",dd+"375","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 900 | [dh+"7",dd+"376","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 901 | [dh+"7",dd+"378","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 902 | [dh+"7",dd+"379","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 903 | [dh+"7",dd+"380","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 904 | [dh+"6",dd+"381","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"], 905 | [dh+"7",dd+"382","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 906 | [dh+"7",dd+"384","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"], 907 | [dh+"8",dd+"387","4.37.21533","June 2023",da+"8/Jun2023/kobo-update-4.37.21533.zip","7870a60cf6d03030a52cebddb70fc946"], 908 | [dh+"8",dd+"383","4.37.21533","June 2023",da+"8/Jun2023/kobo-update-4.37.21533.zip","7870a60cf6d03030a52cebddb70fc946"], 909 | [dh+"9",dd+"388","4.37.21533","June 2023",da+"9/Jun2023/kobo-update-4.37.21533.zip","302219cc121df3bd353eb4b53dce1f04"], 910 | [dh+"10",dd+"386","4.37.21533","June 2023",da+"10/Jun2023/kobo-update-4.37.21533.zip","f81f1ebb26cd566c6f27ae73ffaa5c5d"], 911 | [dh+"11",dd+"389","4.37.21533","June 2023",da+"11/Jun2023/kobo-update-4.37.21533.zip","df5ea93f5536ca5e4633e1850d97e747"], 912 | [dh+"3",dd+"310","4.37.21582","July 2023",da+"3/Jul2023/kobo-update-4.37.21582.zip","411509baad75cf287ebb2398fadb9331"], 913 | [dh+"4",dd+"320","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"], 914 | [dh+"4",dd+"330","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"], 915 | [dh+"4",dd+"350","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"], 916 | [dh+"5",dd+"360","4.37.21582","July 2023",da+"5/Jul2023/kobo-update-4.37.21582.zip","c043bad65f10f365ef725c79039b328e"], 917 | [dh+"5",dd+"370","4.37.21582","July 2023",da+"5/Jul2023/kobo-update-4.37.21582.zip","c043bad65f10f365ef725c79039b328e"], 918 | [dh+"6",dd+"371","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 919 | [dh+"6",dd+"372","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 920 | [dh+"6",dd+"373","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 921 | [dh+"6",dd+"374","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 922 | [dh+"6",dd+"375","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 923 | [dh+"7",dd+"376","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 924 | [dh+"7",dd+"378","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 925 | [dh+"7",dd+"379","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 926 | [dh+"7",dd+"380","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 927 | [dh+"6",dd+"381","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"], 928 | [dh+"7",dd+"382","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 929 | [dh+"7",dd+"384","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"], 930 | [dh+"8",dd+"387","4.37.21582","July 2023",da+"8/Jul2023/kobo-update-4.37.21582.zip","4941484508946b0d860f5b139fd491a1"], 931 | [dh+"8",dd+"383","4.37.21582","July 2023",da+"8/Jul2023/kobo-update-4.37.21582.zip","4941484508946b0d860f5b139fd491a1"], 932 | [dh+"9",dd+"388","4.37.21582","July 2023",da+"9/Jul2023/kobo-update-4.37.21582.zip","6b5a918391feffc9ec6583b21a376023"], 933 | [dh+"10",dd+"386","4.37.21582","July 2023",da+"10/Jul2023/kobo-update-4.37.21582.zip","21aea4804cfe5e9a393e8180a33d93dd"], 934 | [dh+"11",dd+"389","4.37.21582","July 2023",da+"11/Jul2023/kobo-update-4.37.21582.zip","d226931efa2626c2bdd07ca85fbb91be"], 935 | [dh+"3",dd+"310","4.37.21586","July 2023",da+"3/Jul2023/kobo-update-4.37.21586.zip","1f658d22a00caa5a6418191f1ee037a9"], 936 | [dh+"4",dd+"320","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"], 937 | [dh+"4",dd+"330","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"], 938 | [dh+"4",dd+"350","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"], 939 | [dh+"5",dd+"360","4.37.21586","July 2023",da+"5/Jul2023/kobo-update-4.37.21586.zip","c02750c7276a1a7d57bf12d9ce5e34ae"], 940 | [dh+"5",dd+"370","4.37.21586","July 2023",da+"5/Jul2023/kobo-update-4.37.21586.zip","c02750c7276a1a7d57bf12d9ce5e34ae"], 941 | [dh+"6",dd+"371","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 942 | [dh+"6",dd+"372","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 943 | [dh+"6",dd+"373","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 944 | [dh+"6",dd+"374","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 945 | [dh+"6",dd+"375","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 946 | [dh+"7",dd+"376","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 947 | [dh+"7",dd+"378","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 948 | [dh+"7",dd+"379","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 949 | [dh+"7",dd+"380","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 950 | [dh+"6",dd+"381","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"], 951 | [dh+"7",dd+"382","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 952 | [dh+"7",dd+"384","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"], 953 | [dh+"8",dd+"387","4.37.21586","July 2023",da+"8/Jul2023/kobo-update-4.37.21586.zip","4834cf3a0da8c4b974e41f934ffbece2"], 954 | [dh+"8",dd+"383","4.37.21586","July 2023",da+"8/Jul2023/kobo-update-4.37.21586.zip","4834cf3a0da8c4b974e41f934ffbece2"], 955 | [dh+"9",dd+"388","4.37.21586","July 2023",da+"9/Jul2023/kobo-update-4.37.21586.zip","1717e8c63ea3cb08515537f0f70b251e"], 956 | [dh+"10",dd+"386","4.37.21586","July 2023",da+"10/Jul2023/kobo-update-4.37.21586.zip","9796a102222370de48919cc9d95f8265"], 957 | [dh+"11",dd+"389","4.37.21586","July 2023",da+"11/Jul2023/kobo-update-4.37.21586.zip","0ec8c092b74fe9a0c0d9f151b32f6da4"], 958 | [dh+"3",dd+"310","4.38.21908","August 2023",da+"3/Aug2023/kobo-update-4.38.21908.zip","8886847097768d7aef7af66a0a0c3fba"], 959 | [dh+"4",dd+"320","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"], 960 | [dh+"4",dd+"330","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"], 961 | [dh+"4",dd+"350","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"], 962 | [dh+"5",dd+"360","4.38.21908","August 2023",da+"5/Aug2023/kobo-update-4.38.21908.zip","c60058996b024a7650bb1db57e89f849"], 963 | [dh+"5",dd+"370","4.38.21908","August 2023",da+"5/Aug2023/kobo-update-4.38.21908.zip","c60058996b024a7650bb1db57e89f849"], 964 | [dh+"6",dd+"371","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 965 | [dh+"6",dd+"372","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 966 | [dh+"6",dd+"373","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 967 | [dh+"6",dd+"374","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 968 | [dh+"6",dd+"375","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 969 | [dh+"7",dd+"376","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 970 | [dh+"7",dd+"378","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 971 | [dh+"7",dd+"379","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 972 | [dh+"7",dd+"380","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 973 | [dh+"6",dd+"381","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"], 974 | [dh+"7",dd+"382","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 975 | [dh+"7",dd+"384","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"], 976 | [dh+"8",dd+"387","4.38.21908","August 2023",da+"8/Aug2023/kobo-update-4.38.21908.zip","2d730e993413e2b0d700ad84e9154e13"], 977 | [dh+"8",dd+"383","4.38.21908","August 2023",da+"8/Aug2023/kobo-update-4.38.21908.zip","2d730e993413e2b0d700ad84e9154e13"], 978 | [dh+"9",dd+"388","4.38.21908","August 2023",da+"9/Aug2023/kobo-update-4.38.21908.zip","d6dffacfa241849dddcdb25e38885f75"], 979 | [dh+"10",dd+"386","4.38.21908","August 2023",da+"10/Aug2023/kobo-update-4.38.21908.zip","2b907f92fee626d6ee61df7046a98ee7"], 980 | [dh+"11",dd+"389","4.38.21908","August 2023",da+"11/Aug2023/kobo-update-4.38.21908.zip","89d5c7937974d61d15739738328533e4"], 981 | [dh+"11",dd+"390","4.39.22801","April 2024",da+"11/Apr2024/kobo-update-4.39.22801.zip","898d850f0410de35816adf0a4d9c2660"], 982 | [dh+"12",dd+"391","4.39.22801","April 2024",da+"12/Apr2024/kobo-update-4.39.22801.zip","f37e257ac23fdcc76167c033f16ec358"], 983 | [dh+"12",dd+"393","4.39.22801","April 2024",da+"12/Apr2024/kobo-update-4.39.22801.zip","f37e257ac23fdcc76167c033f16ec358"], 984 | [dh+"11",dd+"390","4.39.22861","April 2024",da+"11/Apr2024/kobo-update-4.39.22861.zip","0848a1678163c1a24478225a1a95755c"], 985 | [dh+"12",dd+"391","4.39.22861","April 2024",da+"12/Apr2024/kobo-update-4.39.22861.zip","008e9acbaf5a55a15d4b7abd8db4a6e8"], 986 | [dh+"12",dd+"393","4.39.22861","April 2024",da+"12/Apr2024/kobo-update-4.39.22861.zip","008e9acbaf5a55a15d4b7abd8db4a6e8"], 987 | [dh+"3",dd+"310","4.38.23038","June 2024",da+"3/Jun2024/kobo-update-4.38.23038.zip","28c82d823cb8f760e2ef57ef5145eff6"], 988 | [dh+"4",dd+"320","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"], 989 | [dh+"4",dd+"330","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"], 990 | [dh+"6",dd+"371","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 991 | [dh+"6",dd+"372","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 992 | [dh+"5",dd+"360","4.38.23038","June 2024",da+"5/Jun2024/kobo-update-4.38.23038.zip","1d9968f2ac60ace675466189a9f34930"], 993 | [dh+"4",dd+"350","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"], 994 | [dh+"5",dd+"370","4.38.23038","June 2024",da+"5/Jun2024/kobo-update-4.38.23038.zip","1d9968f2ac60ace675466189a9f34930"], 995 | [dh+"6",dd+"374","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 996 | [dh+"7",dd+"378","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 997 | [dh+"6",dd+"373","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 998 | [dh+"6",dd+"381","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 999 | [dh+"6",dd+"375","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"], 1000 | [dh+"7",dd+"379","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 1001 | [dh+"7",dd+"382","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 1002 | [dh+"7",dd+"376","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 1003 | [dh+"7",dd+"380","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 1004 | [dh+"7",dd+"384","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"], 1005 | [dh+"8",dd+"387","4.38.23038","June 2024",da+"8/Jun2024/kobo-update-4.38.23038.zip","38df7247ef1da3030596dd29dc5b13a3"], 1006 | [dh+"8",dd+"383","4.38.23038","June 2024",da+"8/Jun2024/kobo-update-4.38.23038.zip","38df7247ef1da3030596dd29dc5b13a3"], 1007 | [dh+"9",dd+"388","4.38.23038","June 2024",da+"9/Jun2024/kobo-update-4.38.23038.zip","19cf00bdaba6b109e227eea03f75cfe3"], 1008 | [dh+"10",dd+"386","4.38.23038","June 2024",da+"10/Jun2024/kobo-update-4.38.23038.zip","686fef0582a49b8b4d9fbc6be346aa31"], 1009 | [dh+"11",dd+"389","4.38.23038","June 2024",da+"11/Jun2024/kobo-update-4.38.23038.zip","0c8fa70e7f0bcc186b86bb976c5824d2"], 1010 | [dh+"13",dd+"390","4.39.23027","June 2024",da+"13/Jun2024/kobo-update-4.39.23027.zip","f86d76f0023239901e0b1588c73d7a0f"], 1011 | [dh+"12",dd+"391","4.39.23027","June 2024",da+"12/Jun2024/kobo-update-4.39.23027.zip","3418bd784985783da57e86b40b111511"], 1012 | [dh+"12",dd+"393","4.39.23027","June 2024",da+"12/Jun2024/kobo-update-4.39.23027.zip","3418bd784985783da57e86b40b111511"], 1013 | [dh+"13",dd+"390","4.40.23081","August 2024",da+"13/Aug2024/kobo-update-4.40.23081.zip","2133d24ed5afc95fbc0351d06a76373e"], 1014 | [dh+"12",dd+"391","4.40.23081","August 2024",da+"12/Aug2024/kobo-update-4.40.23081.zip","323f454c629a0d52dbbc2a729f6caa1a"], 1015 | [dh+"12",dd+"393","4.40.23081","August 2024",da+"12/Aug2024/kobo-update-4.40.23081.zip","323f454c629a0d52dbbc2a729f6caa1a"], 1016 | [dh+"13",dd+"390","4.41.23145","October 2024",da+"13/Oct2024/kobo-update-4.41.23145.zip","8db87b3d27fc274eb07036345877db74"], 1017 | [dh+"12",dd+"391","4.41.23145","October 2024",da+"12/Oct2024/kobo-update-4.41.23145.zip","9fadf60b9e8b4e1938a4b1b54a3d4cec"], 1018 | [dh+"12",dd+"393","4.41.23145","October 2024",da+"12/Oct2024/kobo-update-4.41.23145.zip","9fadf60b9e8b4e1938a4b1b54a3d4cec"], 1019 | [dh+"3",dd+"310","4.38.23171","October 2024",da+"3/Oct2024/kobo-update-4.38.23171.zip","c6fe1bca82a342bbfb3897e4e65514aa"], 1020 | [dh+"4",dd+"320","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"], 1021 | [dh+"4",dd+"330","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"], 1022 | [dh+"6",dd+"371","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1023 | [dh+"6",dd+"372","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1024 | [dh+"5",dd+"360","4.38.23171","October 2024",da+"5/Oct2024/kobo-update-4.38.23171.zip","fa4ba6384aa1f00532c3a4310c35fe81"], 1025 | [dh+"4",dd+"350","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"], 1026 | [dh+"5",dd+"370","4.38.23171","October 2024",da+"5/Oct2024/kobo-update-4.38.23171.zip","fa4ba6384aa1f00532c3a4310c35fe81"], 1027 | [dh+"6",dd+"374","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1028 | [dh+"7",dd+"378","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1029 | [dh+"6",dd+"373","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1030 | [dh+"6",dd+"381","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1031 | [dh+"6",dd+"375","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"], 1032 | [dh+"7",dd+"379","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1033 | [dh+"7",dd+"382","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1034 | [dh+"7",dd+"376","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1035 | [dh+"7",dd+"380","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1036 | [dh+"7",dd+"384","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"], 1037 | [dh+"8",dd+"387","4.38.23171","October 2024",da+"8/Oct2024/kobo-update-4.38.23171.zip","a806a21c92812bd66170597f335925f9"], 1038 | [dh+"8",dd+"383","4.38.23171","October 2024",da+"8/Oct2024/kobo-update-4.38.23171.zip","a806a21c92812bd66170597f335925f9"], 1039 | [dh+"9",dd+"388","4.38.23171","October 2024",da+"9/Oct2024/kobo-update-4.38.23171.zip","1cd0d3a3bf0a01247680ddad017ca3ae"], 1040 | [dh+"10",dd+"386","4.38.23171","October 2024",da+"10/Oct2024/kobo-update-4.38.23171.zip","6c2ec94b88c4e8189f0a4c293d30386b"], 1041 | [dh+"11",dd+"389","4.38.23171","October 2024",da+"11/Oct2024/kobo-update-4.38.23171.zip","3fd93636086d302c8156b34f619acd25"], 1042 | [dh+"13",dd+"390","4.42.23296","May 2025",da+"13/May2025/kobo-update-4.42.23296.zip","dfebed1efc99faee5b49cb50604f2206"], 1043 | [dh+"12",dd+"391","4.42.23296","May 2025",da+"12/May2025/kobo-update-4.42.23296.zip","c695db481e0351999d3e677c0cce7cc6"], 1044 | [dh+"12",dd+"393","4.42.23296","May 2025",da+"12/May2025/kobo-update-4.42.23296.zip","c695db481e0351999d3e677c0cce7cc6"], 1045 | [dh+"3",dd+"310","4.38.23429","August 2025",da+"3/Aug2025/kobo-update-4.38.23429.zip","bad3e07aa9b45488cc7ca4e7a3754a51"], 1046 | [dh+"4",dd+"320","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"], 1047 | [dh+"4",dd+"330","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"], 1048 | [dh+"6",dd+"371","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"], 1049 | [dh+"6",dd+"372","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"], 1050 | [dh+"5",dd+"360","4.38.23429","August 2025",da+"5/Aug2025/kobo-update-4.38.23429.zip","880544ac0863b02172300b1b79c67e5c"], 1051 | [dh+"4",dd+"350","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"], 1052 | [dh+"5",dd+"370","4.38.23429","August 2025",da+"5/Aug2025/kobo-update-4.38.23429.zip","880544ac0863b02172300b1b79c67e5c"], 1053 | [dh+"6",dd+"373","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"], 1054 | [dh+"6",dd+"381","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"], 1055 | [dh+"7",dd+"382","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"], 1056 | [dh+"7",dd+"376","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"], 1057 | [dh+"7",dd+"380","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"], 1058 | [dh+"7",dd+"384","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"], 1059 | [dh+"8",dd+"387","4.38.23429","August 2025",da+"8/Aug2025/kobo-update-4.38.23429.zip","aa651351165f45919f84b4cd374c1121"], 1060 | [dh+"8",dd+"383","4.38.23429","August 2025",da+"8/Aug2025/kobo-update-4.38.23429.zip","aa651351165f45919f84b4cd374c1121"], 1061 | [dh+"9",dd+"388","4.38.23429","August 2025",da+"9/Aug2025/kobo-update-4.38.23429.zip","2fef0a97c430cf84959b3b6be97ee0a7"], 1062 | [dh+"10",dd+"386","4.38.23429","August 2025",da+"10/Aug2025/kobo-update-4.38.23429.zip","a604d3a89022a4e52f07c0a317ff0d81"], 1063 | [dh+"11",dd+"389","4.38.23429","August 2025",da+"11/Aug2025/kobo-update-4.38.23429.zip","b2c8ddb1306d52037d5f5f3db8bb2de8"], 1064 | [dh+"13",dd+"390","4.43.23418","August 2025",da+"13/Aug2025/kobo-update-4.43.23418.zip","022bc0260b56d95e9ca2af5d2e287352"], 1065 | [dh+"12",dd+"391","4.43.23418","August 2025",da+"12/Aug2025/kobo-update-4.43.23418.zip","81128664146c3b3b241973c252436519"], 1066 | [dh+"12",dd+"393","4.43.23418","August 2025",da+"12/Aug2025/kobo-update-4.43.23418.zip","81128664146c3b3b241973c252436519"], 1067 | [dh+"8",dd+"387","4.38.23552","November 2025",da+"8/Nov2025/kobo-update-4.38.23552.zip","e63acc805362b3ecd07901135e7a92d4"], 1068 | [dh+"8",dd+"383","4.38.23552","November 2025",da+"8/Nov2025/kobo-update-4.38.23552.zip","e63acc805362b3ecd07901135e7a92d4"], 1069 | [dh+"9",dd+"388","4.38.23552","November 2025",da+"9/Nov2025/kobo-update-4.38.23552.zip","43c0d529289cacb4aa6c91e86096b6e4"], 1070 | [dh+"10",dd+"386","4.38.23552","November 2025",da+"10/Nov2025/kobo-update-4.38.23552.zip","852a81f0719b459b9eccef2fdb470b5f"], 1071 | [dh+"11",dd+"389","4.38.23552","November 2025",da+"11/Nov2025/kobo-update-4.38.23552.zip","5c01411d5b05cb7154a2464085cd09f9"], 1072 | [dh+"13",dd+"390","4.44.23552","November 2025",da+"13/Nov2025/kobo-update-4.44.23552.zip","648840df32495a29f135d7e387cdf197"], 1073 | [dh+"12",dd+"391","4.44.23552","November 2025",da+"12/Nov2025/kobo-update-4.44.23552.zip","ed95b9ee2a4dbb4536a6ce5742c993dc"], 1074 | [dh+"12",dd+"393","4.44.23552","November 2025",da+"12/Nov2025/kobo-update-4.44.23552.zip","ed95b9ee2a4dbb4536a6ce5742c993dc"], 1075 | ]}()); --------------------------------------------------------------------------------