1
+
2
+ <!doctype html>
3
+ < html lang ="en " class ="no-js ">
4
+ < head >
5
+
6
+ < meta charset ="utf-8 ">
7
+ < meta name ="viewport " content ="width=device-width,initial-scale=1 ">
8
+
9
+
10
+
11
+
12
+
13
+
14
+ < link rel ="icon " href ="/assets/images/favicon.png ">
15
+ < meta name ="generator " content ="mkdocs-1.6.1, mkdocs-material-9.6.15 ">
16
+
17
+
18
+
19
+ < title > Savvy Games</ title >
20
+
21
+
22
+
23
+ < link rel ="stylesheet " href ="/assets/stylesheets/main.342714a4.min.css ">
24
+
25
+
26
+ < link rel ="stylesheet " href ="/assets/stylesheets/palette.06af60db.min.css ">
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+ < link rel ="preconnect " href ="https://fonts.gstatic.com " crossorigin >
40
+ < link rel ="stylesheet " href ="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback ">
41
+ < style > : root {--md-text-font : "Roboto" ;--md-code-font : "Roboto Mono" }</ style >
42
+
43
+
44
+
45
+ < script > __md_scope = new URL ( "/" , location ) , __md_hash = e => [ ...e ] . reduce ( ( ( e , _ ) => ( e << 5 ) - e + _ . charCodeAt ( 0 ) ) , 0 ) , __md_get = ( e , _ = localStorage , t = __md_scope ) => JSON . parse ( _ . getItem ( t . pathname + "." + e ) ) , __md_set = ( e , _ , t = localStorage , a = __md_scope ) => { try { t . setItem ( a . pathname + "." + e , JSON . stringify ( _ ) ) } catch ( e ) { } } </ script >
46
+
47
+
48
+
49
+
50
+
51
+
52
+ </ head >
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+ < body dir ="ltr " data-md-color-scheme ="slate " data-md-color-primary ="white " data-md-color-accent ="lime ">
63
+
64
+
65
+ < input class ="md-toggle " data-md-toggle ="drawer " type ="checkbox " id ="__drawer " autocomplete ="off ">
66
+ < input class ="md-toggle " data-md-toggle ="search " type ="checkbox " id ="__search " autocomplete ="off ">
67
+ < label class ="md-overlay " for ="__drawer "> </ label >
68
+ < div data-md-component ="skip ">
69
+
70
+ </ div >
71
+ < div data-md-component ="announce ">
72
+
73
+ </ div >
74
+
75
+
76
+
77
+
78
+
79
+
80
+ < header class ="md-header md-header--shadow " data-md-component ="header ">
81
+ < nav class ="md-header__inner md-grid " aria-label ="Header ">
82
+ < a href ="/. " title ="Savvy Games " class ="md-header__button md-logo " aria-label ="Savvy Games " data-md-component ="logo ">
83
+
84
+
85
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54 "/> </ svg >
86
+
87
+ </ a >
88
+ < label class ="md-header__button md-icon " for ="__drawer ">
89
+
90
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z "/> </ svg >
91
+ </ label >
92
+ < div class ="md-header__title " data-md-component ="header-title ">
93
+ < div class ="md-header__ellipsis ">
94
+ < div class ="md-header__topic ">
95
+ < span class ="md-ellipsis ">
96
+ Savvy Games
97
+ </ span >
98
+ </ div >
99
+ < div class ="md-header__topic " data-md-component ="header-topic ">
100
+ < span class ="md-ellipsis ">
101
+
102
+
103
+
104
+ </ span >
105
+ </ div >
106
+ </ div >
107
+ </ div >
108
+
109
+
110
+ < form class ="md-header__option " data-md-component ="palette ">
111
+
112
+
113
+
114
+
115
+ < input class ="md-option " data-md-color-media ="(prefers-color-scheme: dark) " data-md-color-scheme ="slate " data-md-color-primary ="white " data-md-color-accent ="lime " aria-label ="Switch to light mode " type ="radio " name ="__palette " id ="__palette_0 ">
116
+
117
+ < label class ="md-header__button md-icon " title ="Switch to light mode " for ="__palette_1 " hidden >
118
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z "/> </ svg >
119
+ </ label >
120
+
121
+
122
+
123
+
124
+
125
+ < input class ="md-option " data-md-color-media ="(prefers-color-scheme: light) " data-md-color-scheme ="default " data-md-color-primary ="black " data-md-color-accent ="lime " aria-label ="Switch to dark mode " type ="radio " name ="__palette " id ="__palette_1 ">
126
+
127
+ < label class ="md-header__button md-icon " title ="Switch to dark mode " for ="__palette_0 " hidden >
128
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31 "/> </ svg >
129
+ </ label >
130
+
131
+
132
+ </ form >
133
+
134
+
135
+
136
+ < script > var palette = __md_get ( "__palette" ) ; if ( palette && palette . color ) { if ( "(prefers-color-scheme)" === palette . color . media ) { var media = matchMedia ( "(prefers-color-scheme: light)" ) , input = document . querySelector ( media . matches ?"[data-md-color-media='(prefers-color-scheme: light)']" :"[data-md-color-media='(prefers-color-scheme: dark)']" ) ; palette . color . media = input . getAttribute ( "data-md-color-media" ) , palette . color . scheme = input . getAttribute ( "data-md-color-scheme" ) , palette . color . primary = input . getAttribute ( "data-md-color-primary" ) , palette . color . accent = input . getAttribute ( "data-md-color-accent" ) } for ( var [ key , value ] of Object . entries ( palette . color ) ) document . body . setAttribute ( "data-md-color-" + key , value ) } </ script >
137
+
138
+
139
+
140
+
141
+
142
+ < label class ="md-header__button md-icon " for ="__search ">
143
+
144
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5 "/> </ svg >
145
+ </ label >
146
+ < div class ="md-search " data-md-component ="search " role ="dialog ">
147
+ < label class ="md-search__overlay " for ="__search "> </ label >
148
+ < div class ="md-search__inner " role ="search ">
149
+ < form class ="md-search__form " name ="search ">
150
+ < input type ="text " class ="md-search__input " name ="query " aria-label ="Search " placeholder ="Search " autocapitalize ="off " autocorrect ="off " autocomplete ="off " spellcheck ="false " data-md-component ="search-query " required >
151
+ < label class ="md-search__icon md-icon " for ="__search ">
152
+
153
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5 "/> </ svg >
154
+
155
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z "/> </ svg >
156
+ </ label >
157
+ < nav class ="md-search__options " aria-label ="Search ">
158
+
159
+ < button type ="reset " class ="md-search__icon md-icon " title ="Clear " aria-label ="Clear " tabindex ="-1 ">
160
+
161
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z "/> </ svg >
162
+ </ button >
163
+ </ nav >
164
+
165
+ </ form >
166
+ < div class ="md-search__output ">
167
+ < div class ="md-search__scrollwrap " tabindex ="0 " data-md-scrollfix >
168
+ < div class ="md-search-result " data-md-component ="search-result ">
169
+ < div class ="md-search-result__meta ">
170
+ Initializing search
171
+ </ div >
172
+ < ol class ="md-search-result__list " role ="presentation "> </ ol >
173
+ </ div >
174
+ </ div >
175
+ </ div >
176
+ </ div >
177
+ </ div >
178
+
179
+
180
+
181
+ </ nav >
182
+
183
+ </ header >
184
+
185
+ < div class ="md-container " data-md-component ="container ">
186
+
187
+
188
+
189
+
190
+
191
+
192
+ < main class ="md-main " data-md-component ="main ">
193
+ < div class ="md-main__inner md-grid ">
194
+
195
+
196
+
197
+ < div class ="md-sidebar md-sidebar--primary " data-md-component ="sidebar " data-md-type ="navigation " >
198
+ < div class ="md-sidebar__scrollwrap ">
199
+ < div class ="md-sidebar__inner ">
200
+
201
+
202
+
203
+
204
+
205
+
206
+ < nav class ="md-nav md-nav--primary md-nav--integrated " aria-label ="Navigation " data-md-level ="0 ">
207
+ < label class ="md-nav__title " for ="__drawer ">
208
+ < a href ="/. " title ="Savvy Games " class ="md-nav__button md-logo " aria-label ="Savvy Games " data-md-component ="logo ">
209
+
210
+
211
+ < svg xmlns ="http://www.w3.org/2000/svg " viewBox ="0 0 24 24 "> < path d ="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54 "/> </ svg >
212
+
213
+ </ a >
214
+ Savvy Games
215
+ </ label >
216
+
217
+ < ul class ="md-nav__list " data-md-scrollfix >
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+ < li class ="md-nav__item md-nav__item--nested ">
231
+
232
+
233
+
234
+ < input class ="md-nav__toggle md-toggle " type ="checkbox " id ="__nav_1 " >
235
+
236
+
237
+ < label class ="md-nav__link " for ="__nav_1 " id ="__nav_1_label " tabindex ="0 ">
238
+
239
+
240
+
241
+ < span class ="md-ellipsis ">
242
+ Redaplica
243
+
244
+ </ span >
245
+
246
+
247
+ < span class ="md-nav__icon md-icon "> </ span >
248
+ </ label >
249
+
250
+ < nav class ="md-nav " data-md-level ="1 " aria-labelledby ="__nav_1_label " aria-expanded ="false ">
251
+ < label class ="md-nav__title " for ="__nav_1 ">
252
+ < span class ="md-nav__icon md-icon "> </ span >
253
+ Redaplica
254
+ </ label >
255
+ < ul class ="md-nav__list " data-md-scrollfix >
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+ < li class ="md-nav__item ">
264
+ < a href ="/Redaplica/1-user-interface/ " class ="md-nav__link ">
265
+
266
+
267
+
268
+ < span class ="md-ellipsis ">
269
+ 🕹️ Redaplica Demo
270
+
271
+ </ span >
272
+
273
+
274
+ </ a >
275
+ </ li >
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ < li class ="md-nav__item ">
287
+ < a href ="/Redaplica/2-technical-details/ " class ="md-nav__link ">
288
+
289
+
290
+
291
+ < span class ="md-ellipsis ">
292
+ 🔐 Technical Overview
293
+
294
+ </ span >
295
+
296
+
297
+ </ a >
298
+ </ li >
299
+
300
+
301
+
302
+
303
+ </ ul >
304
+ </ nav >
305
+
306
+ </ li >
307
+
308
+
309
+
310
+ </ ul >
311
+ </ nav >
312
+ </ div >
313
+ </ div >
314
+ </ div >
315
+
316
+
317
+
318
+
319
+ < div class ="md-content " data-md-component ="content ">
320
+ < article class ="md-content__inner md-typeset ">
321
+
322
+ < h1 > 404 - Not found</ h1 >
323
+
324
+ </ article >
325
+ </ div >
326
+
327
+
328
+ < script > var target = document . getElementById ( location . hash . slice ( 1 ) ) ; target && target . name && ( target . checked = target . name . startsWith ( "__tabbed_" ) ) </ script >
329
+ </ div >
330
+
331
+ </ main >
332
+
333
+ < footer class ="md-footer ">
334
+
335
+ < div class ="md-footer-meta md-typeset ">
336
+ < div class ="md-footer-meta__inner md-grid ">
337
+ < div class ="md-copyright ">
338
+
339
+
340
+ Made with
341
+ < a href ="https://squidfunk.github.io/mkdocs-material/ " target ="_blank " rel ="noopener ">
342
+ Material for MkDocs
343
+ </ a >
344
+
345
+ </ div >
346
+
347
+ </ div >
348
+ </ div >
349
+ </ footer >
350
+
351
+ </ div >
352
+ < div class ="md-dialog " data-md-component ="dialog ">
353
+ < div class ="md-dialog__inner md-typeset "> </ div >
354
+ </ div >
355
+
356
+
357
+
358
+
359
+ < script id ="__config " type ="application/json "> { "base" : "/" , "features" : [ "toc.follow" , "toc.integrate" ] , "search" : "/assets/javascripts/workers/search.d50fe291.min.js" , "tags" : null , "translations" : { "clipboard.copied" : "Copied to clipboard" , "clipboard.copy" : "Copy to clipboard" , "search.result.more.one" : "1 more on this page" , "search.result.more.other" : "# more on this page" , "search.result.none" : "No matching documents" , "search.result.one" : "1 matching document" , "search.result.other" : "# matching documents" , "search.result.placeholder" : "Type to start searching" , "search.result.term.missing" : "Missing" , "select.version" : "Select version" } , "version" : null } </ script >
360
+
361
+
362
+ < script src ="/assets/javascripts/bundle.56ea9cef.min.js "> </ script >
363
+
364
+
365
+ </ body >
366
+ </ html >
0 commit comments