整一个墨水屏玩玩!

前言

前面一段时间,因为某些缘故入手了个 2.9 寸的墨水屏(电子价签),于是开始琢磨着要不玩玩 Embedded Rust 吧。就这样姑且是把嵌入式开发的入门硬件给买了回来…回到家把玩几下后就吃灰了(;´д`)ゞ

最近收拾抽屉的时候又看见了他们,于是想着姑且把屏幕点亮看看能不能正常用吧,毕竟之前买的时候买家说直接用微雪 2in9d-demo 就好了,当时看着第三方驱动库也挺多设备的就没留意,结果开始写的时候才发现,居然不支持!

这下寄了,只能自己看文档和例程来写写驱动,于是这里姑且算是 copy 例程内容时的一些记录吧。不过我手上的这个墨水屏排线上的丝印虽热和微雪 2.9 寸柔性墨水屏上的一样,但微雪的这个是柔性屏幕,我手上的这个是非柔性的,不过试了下应该也能正常驱动起来。

后面在驱动写到一半的时候,在大连佳显那找到了我的这个屏幕,对比了一下应该就是大连佳显 GDEW029T5D,于是本驱动移植到 rust 上时同时参考了微雪的和大连佳显的驱动。不过因为手上的是大连佳显的,所以主要参考它,等用微雪的反馈有问题再修修吧(

参考资料

食用方法

初始化屏幕

不管是局刷还是全刷,都先要初始化屏幕。

1
2
3
4
5
6
7
// cp: Cortex-M 处理器
// clocks: 系统时钟
// spi: SPI 接口
// cs, busy, dc, rst: 墨水屏驱动板上的接口
let mut delay = Delay::new(cp.SYST, clocks.sysclk().to_Hz());
let mut epd = Epd2in9d::new(&mut spi, cs, busy, dc, rst, &mut delay, None).unwrap();
let mut display = Display2in9d::default();

全刷

全刷的基本流程是:更新内存中的画面缓存区 -> 将内存中的画面缓存区内容传输到墨水屏上的 SRAM -> 墨水屏全屏刷新

1
2
3
4
5
6
7
// draw_text: 用于在屏幕上的指定位置(右上角坐标)绘制指定文本内容的函数
// update_frame: 将内存中的画面缓存区内容传输到墨水屏上的 SRAM
// display_frame: 墨水屏刷新
draw_text(&mut display, "NicoNicoNi~", 5, 5);
epd.update_frame(&mut spi, display.buffer(), &mut delay)
.unwrap();
epd.display_frame(&mut spi, &mut delay).unwrap();

局刷

该屏幕支持局部刷新,大体上的流程和全刷无异。

1
2
3
4
5
6
7
8
9
// NUM: 数字 0~9 的模
// update_partial_frame: 将需要显示的区域的内容传输到墨水屏上的 SRAM
// display_frame: 墨水屏刷新
for i in 0..10 {
epd.update_partial_frame(&mut spi, &mut delay, &NUM[i], 63, 86, 32, 24)
.unwrap();
epd.display_frame(&mut spi, &mut delay).unwrap();
delay.delay_ms(1000);
}

屏幕休眠

如果屏幕的内容短时间内不需要更新了之后,请务必让屏幕进入休眠状态,否则长时间上电显示静态内容不仅徒增功耗,还容易损坏屏幕。

1
2
// sleep: 使屏幕进入休眠状态,如果后面需要更新画面需要先初始化屏幕或者唤醒屏幕
epd.sleep(&mut spi, &mut delay).unwrap();

驱动实现

测试实例

这里的代码是基于 STM32F1xx 写的,不过其他平台的内容也大体相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
//!微雪 2.9(D)墨水屏测试
//!
//!测试内容包含了全刷和局刷

#![deny(unsafe_code)]
#![no_std]
#![no_main]

use fugit::RateExtU32;
use panic_halt as _;

// 引入 cortex-m-rt 库提供的 entry 宏
use cortex_m_rt::entry;
// 引入 STM32F1xx HAL 库
use stm32f1xx_hal::{
pac,
prelude::{_stm32_hal_flash_FlashExt, _stm32_hal_gpio_GpioExt},
rcc::RccExt, // 引入 SPI 接口的实现和 SPI1 接口没有被重新映射到其他引脚
spi::{NoMiso, Spi},
};

// 引入 embedded-hal 库提供的 SPI 接口抽象
use embedded_hal::spi::{Mode, Phase, Polarity};

use embedded_graphics::prelude::DrawTarget;
use epd_waveshare::{
epd2in9d::Display2in9d,
epd2in9d::Epd2in9d,
prelude::{Color, WaveshareDisplay},
};

use cortex_m::delay::Delay;

// 全刷用的画面,同时作为局刷的背景
const G_IMAGE_BASEMAP: &[u8; 4736] = &[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x8F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xCF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xEF, 0xFF, 0xFF,
0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0xFF, 0xFF,
0xFF, 0xFE, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0xFF, 0xFF,
0xFF, 0xFC, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE7, 0xFF, 0xFF,
0xFF, 0xFD, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xF6, 0x01, 0xFF,
0xFF, 0xFD, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xE0, 0x00, 0x1F, 0xFF, 0xFF, 0xF3, 0xF0, 0x7C, 0xFF,
0xFF, 0xF9, 0x7F, 0xFF, 0xFF, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF3, 0xC0, 0x3C, 0xFF,
0xFF, 0xF9, 0x7F, 0xFF, 0xFF, 0xC6, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xF9, 0x06, 0x0C, 0xFF,
0xFF, 0xFB, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0xF8, 0x0F, 0x20, 0x07,
0xFF, 0xFB, 0x7F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x3F, 0x31, 0xC0,
0xFF, 0xFB, 0xBF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1C, 0x7E, 0x67, 0xFC,
0xFF, 0xFB, 0xBF, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x20, 0x8F, 0xFF,
0xFF, 0xFB, 0xBB, 0xCE, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x80, 0x1F, 0xFF,
0xFF, 0xFB, 0xB4, 0x9E, 0x07, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x00, 0x7F,
0xFF, 0xFB, 0x97, 0x3F, 0xF7, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFE, 0x0F,
0xFF, 0xFB, 0xCF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x0F, 0xCF, 0xFF, 0xE3,
0xFF, 0xFB, 0xCF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x67, 0xFF, 0xF8,
0xFF, 0xFB, 0xCF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x3F, 0xFF, 0xE2, 0x03, 0xFF, 0xFE,
0xFF, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xFF, 0xF8, 0xE3, 0xFF, 0xFF,
0xFF, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF8, 0xFF, 0xFE, 0x39, 0xFF, 0xFF,
0xFF, 0xFB, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0xFF,
0xFF, 0xFB, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xCF, 0xFF, 0xCF, 0xFF, 0xFF,
0xFF, 0xF9, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xE3, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xF9, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xF8, 0xFF, 0xF3, 0xFF, 0xFF,
0xFF, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0x7F, 0xF9, 0xFF, 0xFF,
0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFC,
0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xDF, 0xEF, 0xFF, 0x81, 0xF8, 0x00, 0x80,
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xEF, 0xE7, 0xFF, 0xC0, 0x80, 0x3C, 0x1F,
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x01, 0xFD, 0x00, 0x7F, 0xEF, 0xF3, 0xFF, 0xE0, 0x18, 0x7F, 0x1F,
0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x1F, 0x0F, 0xF7, 0xF3, 0xFF, 0xF0, 0x79, 0xFF, 0xCF,
0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x1F, 0xE1, 0xF7, 0xFB, 0xFF, 0xF8, 0x73, 0xFF, 0xCF,
0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x3F, 0xFC, 0x7B, 0xF9, 0xFF, 0xF8, 0x7F, 0xFF, 0xE7,
0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x3F, 0x18, 0xF9, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7,
0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFA, 0x00, 0x0F, 0xCD, 0x7D, 0xFF, 0xFC, 0x7F, 0xFF, 0xF7,
0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xF8, 0x3A, 0x27, 0xB7, 0xF5, 0xBD, 0xFF, 0xFE, 0x7F, 0xFF, 0xF3,
0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFC, 0x46, 0x7F, 0xFF, 0xF9, 0x9C, 0xFF, 0x86, 0x7F, 0xFF, 0xF3,
0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xF9, 0x72, 0x7F, 0x7B, 0xF9, 0x8C, 0x3F, 0xB8, 0x73, 0xFF, 0xF3,
0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xE6, 0xFC, 0x60, 0x7B, 0xFD, 0xD5, 0xCF, 0xDC, 0x6F, 0xFF, 0xFB,
0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFC, 0x60, 0x7B, 0xFF, 0xCB, 0xF3, 0xDE, 0x1F, 0xFF, 0xFB,
0xFF, 0x9F, 0xFF, 0xE7, 0xFF, 0x3E, 0xFC, 0x70, 0x7B, 0xFF, 0xCB, 0xF9, 0xDE, 0x3F, 0xFF, 0xFB,
0xFF, 0x9F, 0xFC, 0xFC, 0x08, 0xFE, 0xFC, 0x76, 0xFB, 0xFF, 0xEF, 0xFE, 0x5E, 0x7F, 0xFF, 0xFB,
0xFF, 0x9F, 0xFF, 0xFF, 0xF0, 0x7E, 0xFE, 0x77, 0xFF, 0xFF, 0xEF, 0xFF, 0x1C, 0xFF, 0xFF, 0xFB,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x0E, 0xFE, 0x07, 0x77, 0xFF, 0xEF, 0xFF, 0x99, 0xFF, 0xFF, 0xFB,
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFE, 0x06, 0x2F, 0xFF, 0xE6, 0x1F, 0xD3, 0xFF, 0xFF, 0xF8,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x40, 0x1F, 0xFF, 0xE5, 0x8F, 0xE7, 0xFF, 0xFF, 0xFB,
0xFF, 0x3F, 0xFF, 0xFE, 0xFF, 0xFF, 0x1F, 0x7F, 0xFF, 0xFF, 0xF7, 0x07, 0xEF, 0xFF, 0xFF, 0xF8,
0xFF, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xC7, 0x9F, 0xFF, 0xFF, 0xF0, 0x31, 0xCF, 0xFF, 0xFF, 0xFB,
0xFF, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xF4, 0x18, 0x1F, 0xFF, 0xFF, 0xFB,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF4, 0x18, 0x3F, 0xFF, 0xFF, 0xFB,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0xF6, 0x99, 0x3F, 0xFF, 0xFF, 0xFB,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xF2, 0x8C, 0x7F, 0xFF, 0xFF, 0xF0,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF7, 0xF2, 0x8C, 0x7F, 0xFF, 0xFF, 0xF1,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFB, 0xF2, 0x8C, 0xFF, 0xFF, 0xFF, 0xF1,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFB, 0xF2, 0x8E, 0xFF, 0xFF, 0xFF, 0xF3,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xF6, 0x0C, 0xFF, 0xFF, 0xFF, 0xF3,
0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFB, 0xF6, 0x1C, 0xFF, 0xFF, 0xFF, 0xE3,
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFB, 0xF4, 0x1C, 0xFF, 0xFF, 0xFF, 0xE3,
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xF7, 0xF5, 0x1C, 0xFF, 0xFF, 0xFF, 0xE7,
0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFF, 0xFF, 0xE7, 0xE4, 0x38, 0xFF, 0xFF, 0xFF, 0xE7,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x9F, 0xE0, 0x30, 0xD0, 0x0F, 0xFF, 0xC7,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x68, 0x3F, 0xE3, 0xFF, 0xC7,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xF8, 0xF7, 0x7F, 0xFF, 0xFF, 0xEA, 0x06, 0x7F, 0xF9, 0xFF, 0x80,
0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x7F, 0xFF, 0xFF, 0xEC, 0x7E, 0xFF, 0xFC, 0xFF, 0x80,
0xFF, 0xDF, 0x7F, 0xFF, 0xFF, 0xFF, 0x9C, 0x00, 0xFF, 0xFF, 0xCF, 0xFC, 0x80, 0xFE, 0xFF, 0xBF,
0xFF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFE, 0x3C, 0x88, 0x3F, 0xFF, 0xDF, 0xF8, 0x38, 0x1F, 0xFF, 0x3F,
0xFF, 0xEF, 0xE3, 0xFF, 0xFF, 0xF8, 0xF8, 0x3E, 0xDF, 0xFF, 0xDF, 0xC3, 0xFF, 0x8F, 0xFE, 0x7C,
0xFF, 0xEF, 0xFC, 0x7F, 0xFF, 0x81, 0xF8, 0xF7, 0xFF, 0xFF, 0x9F, 0x9F, 0xFF, 0xE7, 0xFC, 0xC3,
0xFF, 0xE7, 0xFF, 0x81, 0xE0, 0x1F, 0xF8, 0xA1, 0xEF, 0xFF, 0xBC, 0x7F, 0xFF, 0xF3, 0x60, 0x20,
0xFF, 0xE7, 0xFF, 0xF8, 0x01, 0xFF, 0xF8, 0xC1, 0xEF, 0xFF, 0x11, 0xFF, 0xFF, 0xF2, 0x07, 0xFF,
0xFF, 0xEB, 0xFF, 0xFF, 0xFE, 0x7F, 0xF1, 0xF3, 0xEF, 0xFF, 0x43, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
0xFF, 0xCB, 0xFF, 0xFF, 0xFF, 0x3F, 0xF1, 0xFF, 0xFF, 0xFE, 0x17, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF,
0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x07, 0x7F, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xED, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xF5, 0x56, 0x00, 0x00, 0x03, 0x0E, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF,
0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFB, 0x50, 0x00, 0x00, 0x01, 0x86, 0xFF, 0xFF, 0x93, 0xFF, 0xFF,
0xFF, 0x9F, 0xFF, 0xFF, 0x3F, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF,
0xFF, 0x9F, 0xBF, 0xFF, 0xC7, 0xFD, 0x4F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFE, 0x00, 0x03, 0xFF,
0xFF, 0x9F, 0x3F, 0xFF, 0xF8, 0x7F, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0x83, 0x40, 0x00,
0xFF, 0xBF, 0x7F, 0xFF, 0xFF, 0x81, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF1, 0x83, 0x7F, 0x80,
0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC3, 0x82, 0x7F, 0xFF,
0xFF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x1F, 0x82, 0x7F, 0xFF,
0xFF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0x82, 0x7F, 0xFF,
0xFF, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x7F, 0xFF,
0xFF, 0x3A, 0xFF, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0xFF, 0xFF,
0xFF, 0x3A, 0xDF, 0x9F, 0xFF, 0xF9, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0xFF, 0xFF,
0xFF, 0x36, 0x0F, 0xEF, 0xFF, 0xFB, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF,
0xFF, 0x37, 0x66, 0x03, 0xFF, 0xF3, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF,
0xFF, 0x3F, 0xF0, 0xFC, 0xFF, 0xF7, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
0xFF, 0x2F, 0xFF, 0xFF, 0x1F, 0xF7, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
0xFF, 0x2F, 0xFF, 0xFF, 0xC7, 0xF7, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
0xFF, 0xBF, 0xFF, 0xFF, 0xF8, 0x77, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF,
0xFF, 0xBF, 0xFF, 0xFF, 0x81, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0x8F, 0xFF, 0xF0, 0x07, 0xE7, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xF3, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFA, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFA, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0xC3, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFE, 0x7B, 0x13, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0x73, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xF3, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF3, 0xE0, 0xF8, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xE7, 0xF8, 0xFB, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xEF, 0xF0, 0xFB, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xCF, 0xE0, 0xF9, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0x7D, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0x78, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x9F, 0xE8, 0x79, 0x40, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xDF, 0xF0, 0x7B, 0x1F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xCF, 0xF1, 0x80, 0x7F, 0x3F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xE7, 0xFE, 0x71, 0xFE, 0x7F, 0xFF, 0xC8, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x7C, 0xF8, 0xFF, 0xFF, 0x03, 0xF0, 0xFF, 0xFF, 0x83, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x7E, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x7F, 0x00, 0x00, 0x40, 0xEF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x40, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xDF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x30, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x0F, 0xE0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3C, 0x3F, 0x80,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xF8, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, 0x03, 0xE0, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x78, 0x1F, 0x83, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0xC0, 0x7E, 0x0F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0x03, 0xE0, 0x7F, 0xF8,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xFC, 0x1F, 0xC1, 0xFF, 0xE0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xF0, 0x3F, 0x87, 0xFF, 0xC1,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xFF, 0x1F, 0xFF, 0x83,
0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x0F, 0xFE, 0x7F, 0xFC, 0x07,
0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xF0, 0x1F,
0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, 0x3F,
0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xDF,
0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x11, 0x9F,
0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFD, 0xC1, 0xFF, 0xF0, 0x47, 0x3F,
0xFF, 0xFF, 0xF3, 0xFF, 0xE0, 0x1F, 0xC3, 0xF0, 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xE3, 0x1E, 0x3F,
0xFF, 0xFF, 0xE7, 0xFE, 0x03, 0xFF, 0xCF, 0xFE, 0x3F, 0xFC, 0x00, 0xFF, 0xE0, 0x0C, 0x7C, 0x7F,
0xFF, 0xFF, 0x8F, 0xFC, 0x7F, 0xFF, 0xDB, 0xFF, 0x1E, 0x00, 0x1F, 0xFF, 0xFE, 0x10, 0xFC, 0x7F,
0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFC, 0x7F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFC, 0x0C, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0xF8, 0x7F,
0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xE0, 0x04, 0x7F, 0xFC, 0x7F,
0xFF, 0xFD, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x11, 0xFF, 0xFC, 0x7F,
0xFF, 0xFB, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x7F,
0xFF, 0xF3, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x7F,
0xFF, 0xE7, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0x7F,
0xFF, 0xCF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x3F,
0xFF, 0x9F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0x3F,
0xFF, 0x3F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF,
0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x9F,
0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x9F, 0xFF, 0xDF,
0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xCF, 0xFF, 0xCF,
0xFC, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03, 0xF1, 0xFF, 0xF1, 0xC0, 0xCF, 0xFF, 0xCF,
0xFD, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xF9, 0xFF, 0xF1, 0xF8, 0x27, 0xFF, 0xEF,
0xF9, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0xFF, 0xF4, 0xFF, 0x01, 0xFF, 0xE7,
0xFB, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFC, 0xFF, 0x04, 0xFF, 0x80, 0x7F, 0xE7,
0xF3, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x83, 0xFE, 0x3F, 0xFE, 0x70, 0x14, 0xFF, 0xE3, 0x0F, 0xF7,
0xF7, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x01, 0xFC, 0x3F, 0xFE, 0x40, 0xF4, 0xFF, 0xF3, 0xC0, 0xC3,
0xE7, 0xFF, 0xF8, 0x7F, 0xFF, 0xD8, 0x61, 0xF8, 0x3F, 0xFF, 0x0F, 0xE4, 0xFF, 0xFF, 0xF8, 0x03,
0xE7, 0xFF, 0xF1, 0xFF, 0xFF, 0xC1, 0xF0, 0xF8, 0x7F, 0xFF, 0x1F, 0xE4, 0xFF, 0xFF, 0xF1, 0xFB,
0xEF, 0xFF, 0xC3, 0xFF, 0xFF, 0x87, 0xF0, 0xF8, 0x7F, 0xFF, 0x9F, 0xE4, 0xFF, 0xFF, 0xE3, 0xF9,
0xCF, 0xFF, 0x8F, 0xFF, 0xFF, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0x8F, 0xE0, 0xE0, 0x7F, 0xC7, 0xF9,
0xCF, 0xFF, 0x1F, 0xFF, 0xFE, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xCF, 0xC9, 0xF0, 0x00, 0x0F, 0xFC,
0xDF, 0xFE, 0x7F, 0xFF, 0xFC, 0x01, 0xF8, 0x40, 0xFF, 0xFF, 0xE7, 0xC3, 0xFF, 0xFE, 0x3F, 0xBC,
0xDF, 0xFF, 0xFF, 0xFF, 0xC0, 0x73, 0xF8, 0x00, 0xFF, 0xFF, 0xE7, 0x83, 0xFF, 0xFF, 0xFF, 0x00,
0x9F, 0xFF, 0xFF, 0xFF, 0x03, 0xF3, 0xFC, 0x10, 0xFF, 0xFF, 0xE3, 0x27, 0xFF, 0xFF, 0xFF, 0x30,
0x9F, 0xFF, 0xFF, 0xF8, 0x3F, 0xF3, 0xFC, 0x11, 0xFF, 0xFF, 0xF3, 0x2F, 0xFF, 0xFF, 0xFF, 0x20,
0x9F, 0xFF, 0xFF, 0xE0, 0xFF, 0xF1, 0xF8, 0x01, 0xFF, 0xFF, 0xF3, 0x2F, 0xFF, 0xFF, 0xFF, 0x48,
0xBF, 0xFF, 0xFF, 0x87, 0xFF, 0xF1, 0xE0, 0x01, 0xFF, 0xFF, 0xF2, 0x27, 0xFF, 0xFF, 0xFF, 0x09,
0xBF, 0xFF, 0xFE, 0x1F, 0xFF, 0xF9, 0xC7, 0x03, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0x0B,
0xBF, 0xFF, 0xFE, 0x7F, 0xFF, 0xF9, 0x0F, 0x03, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0x0B,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x83, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x19,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x83, 0xFF, 0xFF, 0xF9, 0xE7, 0xFF, 0xFF, 0xFF, 0x19,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFC, 0xE3, 0xFF, 0xFF, 0xFF, 0x19,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x7F, 0xE7, 0xFF, 0xFF, 0xFC, 0xF3, 0xFF, 0xFF, 0xFF, 0x59,
0x3F, 0xFF, 0xFF, 0xFF, 0xF8, 0x3E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF1, 0xFF, 0xFF, 0xFF, 0x19,
0x3F, 0xFF, 0xFF, 0xFF, 0xC0, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0xFF, 0xFF, 0xFF, 0x09,
0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x1E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0xFF, 0xFF, 0xFF, 0x09,
0x3F, 0xFF, 0xFE, 0x01, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0x99,
0x3F, 0xFF, 0xFE, 0x7F, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0x9D,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xF9, 0xFC, 0xFE, 0x1E, 0x7F, 0xFF, 0xE6,
0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF3, 0xFC, 0x00, 0x1C, 0x07, 0xFF, 0xF3,
0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xF1, 0xFC, 0x0F, 0xFF, 0x80, 0x3F, 0xF3,
0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xF8, 0xFC, 0xFF, 0xFF, 0xF8, 0x00, 0x03,
0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0xFC, 0xFC, 0xFF, 0xFF, 0xFF, 0x80, 0x03,
0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0xFD, 0xFF, 0xFF, 0xFF, 0xFB,
0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFC, 0xF9, 0xFE, 0x3F, 0xFF, 0xFB,
0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFC, 0xF9, 0xFC, 0x0F, 0xFF, 0xF3,
0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xFC, 0xFB, 0xF8, 0x03, 0xFF, 0xF3,
0xDF, 0xFF, 0xFF, 0xFF, 0xF8, 0xEF, 0x01, 0xCF, 0xFF, 0xFF, 0xFC, 0xF3, 0xC0, 0x00, 0x3F, 0xE1,
0xCF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, 0xC7, 0xFF, 0xFF, 0xFD, 0xF3, 0xC3, 0xFE, 0x1F, 0xE1,
0xCF, 0xFF, 0xE1, 0xFF, 0xFF, 0xE0, 0x0F, 0xC7, 0xFF, 0xFF, 0xFD, 0xFF, 0xCE, 0xD3, 0x9F, 0xE1,
0xCF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF3, 0x00, 0x03, 0xFF, 0xFF, 0xFD, 0xFF, 0xC6, 0x53, 0x8F, 0xC9,
0xEF, 0xFF, 0xFE, 0x03, 0xFF, 0xFB, 0xC0, 0x83, 0xFF, 0xFF, 0xF8, 0x47, 0xE6, 0x4B, 0xCF, 0xC1,
0xE7, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x0F, 0x83, 0xFF, 0xFF, 0xF8, 0x0F, 0xE7, 0xFF, 0xCF, 0xFC,
0xE7, 0xFF, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0x01, 0xFF, 0xFF, 0xF9, 0xCF, 0xF3, 0xFF, 0xE7, 0xFF,
0xE3, 0xFF, 0xFF, 0xFC, 0x1F, 0xFB, 0xFF, 0x01, 0xFF, 0xFF, 0xFB, 0xC7, 0xF1, 0xFF, 0xE7, 0xFF,
0xF3, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0x11, 0xFF, 0xFF, 0xFB, 0xC3, 0xF0, 0xFF, 0xE7, 0xFF,
0xF3, 0xFF, 0xFF, 0xFF, 0xC0, 0x73, 0xFE, 0x10, 0xFF, 0xFF, 0xF3, 0xE3, 0xF8, 0x1F, 0xF5, 0xFF,
0xF9, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFE, 0x10, 0xFF, 0xFF, 0xF3, 0xE3, 0xFF, 0x03, 0xF0, 0xFF,
0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3E, 0x18, 0xFF, 0xFF, 0xF7, 0xC3, 0xFF, 0xE1, 0xC2, 0xFF,
0xFC, 0xFF, 0xF9, 0xFF, 0xFF, 0xE0, 0x00, 0x08, 0x7F, 0xFF, 0xE7, 0xC3, 0x9F, 0xC0, 0x0C, 0xFF,
0xFC, 0xFF, 0xF8, 0xFF, 0xFF, 0xE7, 0xE0, 0x08, 0x7F, 0xFF, 0xE7, 0x93, 0xC7, 0xD8, 0x7E, 0xFF,
0xFE, 0x7F, 0xFE, 0x1F, 0xFF, 0xEF, 0xFC, 0x3C, 0x7F, 0xFF, 0xE7, 0x93, 0xC3, 0xDF, 0xFE, 0x7F,
0xFE, 0x7F, 0xFF, 0x87, 0xFF, 0xCF, 0xF0, 0x3C, 0x3F, 0xFF, 0xCF, 0x87, 0xE0, 0xCF, 0xFE, 0x07,
0xFE, 0x3F, 0xFF, 0xE0, 0x7F, 0xCF, 0x00, 0x7C, 0x3F, 0xFF, 0xCF, 0xC7, 0x80, 0x0F, 0xFF, 0x03,
0xFF, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x1C, 0x7E, 0x3F, 0xFF, 0x8F, 0xE7, 0xFF, 0x1F, 0xFE, 0x73,
0xFF, 0x9F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0xFF, 0x83, 0xF3, 0xFF, 0x1F, 0xF0, 0xF7,
0xFF, 0x8F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0x10, 0xF9, 0xFE, 0x3F, 0x83, 0xF7,
0xFF, 0xCF, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x1F, 0xFE, 0x3C, 0x1C, 0xFC, 0xF0, 0x07, 0xE0,
0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0x07, 0xFC, 0x7F, 0x00, 0x7D, 0xFF, 0x27, 0xE8,
0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3E, 0x00, 0x70, 0xFF, 0xE0, 0x3C, 0xFF, 0x6F, 0xEF,
0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x6C, 0x00, 0x3F, 0xFC, 0x3C, 0xFF, 0x4F, 0xEF,
0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFE, 0x01, 0xFE, 0x1C, 0xFF, 0x4F, 0xE7,
0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xF0, 0x00, 0x1C, 0xFE, 0x5F, 0xE7,
0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x7E, 0x5F, 0xE7,
0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7E, 0x5F, 0xE7,
0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7E, 0x5F, 0xE7,
0xFF, 0xFF, 0x8F, 0xFF, 0xEF, 0xFF, 0xC0, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x5F, 0xF7,
0xFF, 0xFF, 0xC7, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x5F, 0xF3,
0xFF, 0xFF, 0xE3, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x4F, 0xF3,
0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x7E, 0x4F, 0xF3,
0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x7E, 0x4F, 0xF9,
0xFF, 0xFF, 0xFE, 0x3F, 0xF7, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xC3, 0x7F, 0x67, 0xF9,
0xFF, 0xFF, 0xFF, 0x0F, 0xF0, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x7C, 0x06, 0x7F, 0x27, 0xFC,
0xFF, 0xFF, 0xFF, 0xC3, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x83, 0xFC, 0x00, 0x76, 0x7F, 0x33, 0xFC,
0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x8B, 0xF9, 0xFF, 0xFF, 0xF0, 0x3F, 0x00, 0xF6, 0xFF, 0x11, 0xFC,
0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0xE1, 0xFC, 0xFF, 0xFF, 0xFE, 0x07, 0xFC, 0x00, 0xFF, 0x99, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0x04, 0xFF, 0xFF, 0xFF, 0xE0, 0x3F, 0xE0, 0xFF, 0x89, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x7F, 0xF0, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xCC, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x10, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xE4, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xE4, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFC, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF2, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x08, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xF2, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xF2, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xF3, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFB, 0x3C,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFB, 0x3C,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7B, 0x39,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1B, 0x33,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x07,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
];

// 数字 0~9 的模
const NUM: [[u8; 96]; 10] = [
// 0
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0x01,
0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x0F, 0xF8, 0x3F, 0xFE, 0x3F,
0xFE, 0x3F, 0xFC, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0x9F, 0xFD, 0xFF, 0xFF, 0xDF, 0xFD,
0xFF, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xDF, 0xFC, 0xFF, 0xFF, 0x9F,
0xFC, 0x7F, 0xFF, 0x1F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFE, 0x0F, 0xF8, 0x3F, 0xFF, 0x00, 0x00,
0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 1
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF,
0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFE,
0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x1F, 0xFF, 0x7F, 0xFF, 0x9F, 0xFF, 0x7F, 0xFF, 0xDF,
0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 2
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xF8,
0xFF, 0xFF, 0x01, 0xF8, 0x1F, 0xFE, 0x00, 0xFC, 0x1F, 0xFE, 0x00, 0xFF, 0x1F, 0xFC, 0x78,
0x7F, 0x9F, 0xFC, 0xFE, 0x3F, 0x9F, 0xFC, 0xFF, 0x3F, 0x9F, 0xFD, 0xFF, 0x9F, 0x9F, 0xFD,
0xFF, 0x9F, 0x9F, 0xFD, 0xFF, 0xCF, 0x9F, 0xFD, 0xFF, 0xE7, 0x9F, 0xFD, 0xFF, 0xE7, 0x9F,
0xFC, 0xFF, 0xF3, 0x9F, 0xFE, 0xE7, 0xF9, 0x9F, 0xFE, 0x07, 0xF8, 0x9F, 0xFE, 0x07, 0xFC,
0x9F, 0xFF, 0x07, 0xFE, 0x1F, 0xFF, 0x8F, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 3
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0xC0,
0xFF, 0xFF, 0x07, 0x80, 0x7F, 0xFE, 0x03, 0x80, 0x3F, 0xFE, 0x01, 0x1E, 0x3F, 0xFC, 0x79,
0x3F, 0xBF, 0xFC, 0xFC, 0x7F, 0x9F, 0xFD, 0xFC, 0x7F, 0xDF, 0xFD, 0xFE, 0xFF, 0xDF, 0xFD,
0xFE, 0xFF, 0xDF, 0xFD, 0xFE, 0xFF, 0xDF, 0xFD, 0xFE, 0xFF, 0xDF, 0xFD, 0xFE, 0xFF, 0xDF,
0xFC, 0xCF, 0xFF, 0x9F, 0xFE, 0x0F, 0xF8, 0x9F, 0xFE, 0x0F, 0xF8, 0x3F, 0xFF, 0x0F, 0xF8,
0x3F, 0xFF, 0x9F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 4
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0xFF, 0xFF, 0xF7, 0xEF, 0xFF, 0xFF, 0xF7,
0xEF, 0xFF, 0xFF, 0xF7, 0xEF, 0xFF, 0xFF, 0xF7, 0xCF, 0xFC, 0x00, 0x00, 0x0F, 0xFC, 0x00,
0x00, 0x0F, 0xFC, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x1F, 0xF7, 0xCF, 0xFF,
0x8F, 0xF7, 0xEF, 0xFF, 0xC7, 0xF7, 0xEF, 0xFF, 0xE3, 0xF7, 0xEF, 0xFF, 0xF1, 0xF7, 0xEF,
0xFF, 0xF8, 0xF7, 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xFF, 0xFE, 0x37, 0xFF, 0xFF, 0xFF, 0x17,
0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 5
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0xFC, 0xFF, 0x00,
0xFF, 0xFC, 0xFE, 0x00, 0x7F, 0xFC, 0xFC, 0x00, 0x3F, 0xFC, 0xFC, 0x7E, 0x3F, 0xFC, 0xF8,
0xFF, 0x1F, 0xFC, 0xF9, 0xFF, 0x9F, 0xFC, 0xFB, 0xFF, 0xDF, 0xFC, 0xFB, 0xFF, 0xDF, 0xFC,
0xFB, 0xFF, 0xDF, 0xFC, 0xFB, 0xFF, 0xDF, 0xFC, 0xFB, 0xFF, 0xDF, 0xFC, 0xF9, 0xFF, 0xDF,
0xFC, 0xF9, 0xFF, 0x9F, 0xFC, 0xFC, 0xF9, 0xBF, 0xFC, 0x1C, 0x78, 0x3F, 0xFC, 0x00, 0x78,
0x3F, 0xFF, 0xE0, 0x78, 0x7F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 6
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x00,
0xFF, 0xFF, 0x3E, 0x00, 0x7F, 0xFE, 0x3E, 0x00, 0x3F, 0xFC, 0x3E, 0x3E, 0x3F, 0xFC, 0x3C,
0xFF, 0x9F, 0xFC, 0x3C, 0xFF, 0x9F, 0xFD, 0xFD, 0xFF, 0xDF, 0xFD, 0xFD, 0xFF, 0xDF, 0xFD,
0xFD, 0xFF, 0xDF, 0xFD, 0xFD, 0xFF, 0xDF, 0xFC, 0xFD, 0xFF, 0xDF, 0xFC, 0xFC, 0xFF, 0x9F,
0xFE, 0x7E, 0xFF, 0x1F, 0xFE, 0x3E, 0x7F, 0x3F, 0xFF, 0x0F, 0x3C, 0x3F, 0xFF, 0x80, 0x00,
0x7F, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 7
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFC, 0x8F, 0xFF, 0xFF, 0xFC, 0xC7,
0xFF, 0xFF, 0xFC, 0xE1, 0xFF, 0xFF, 0xFC, 0xF0, 0xFF, 0xFF, 0xFC, 0xFC, 0x3F, 0xFF, 0xFC,
0xFE, 0x00, 0x1F, 0xFC, 0xFF, 0x00, 0x1F, 0xFC, 0xFF, 0xC0, 0x1F, 0xFC, 0xFF, 0xF0, 0x1F,
0xFC, 0xFF, 0xFC, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF,
0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 8
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xF1, 0xFF, 0xFF, 0x03, 0xC0,
0x7F, 0xFE, 0x03, 0xC0, 0x7F, 0xFE, 0x01, 0x80, 0x3F, 0xFE, 0x79, 0x0F, 0x3F, 0xFC, 0xFC,
0x1F, 0x9F, 0xFC, 0xFE, 0x1F, 0x9F, 0xFD, 0xFE, 0x3F, 0xDF, 0xFD, 0xFE, 0x3F, 0xDF, 0xFD,
0xFE, 0x7F, 0xDF, 0xFD, 0xFC, 0x7F, 0xDF, 0xFD, 0xFC, 0x7F, 0xDF, 0xFC, 0xF8, 0x7F, 0xDF,
0xFC, 0xF8, 0x7F, 0x9F, 0xFE, 0x70, 0x3F, 0x9F, 0xFE, 0x01, 0x8F, 0x3F, 0xFE, 0x01, 0x80,
0x3F, 0xFF, 0x03, 0xC0, 0x7F, 0xFF, 0x87, 0xC0, 0x7F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
// 9
[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xC0, 0x03,
0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x3E, 0x60, 0x7F, 0xFE, 0x7F,
0x3C, 0x3F, 0xFC, 0xFF, 0xBF, 0x3F, 0xFD, 0xFF, 0x9F, 0x9F, 0xFD, 0xFF, 0xDF, 0x9F, 0xFD,
0xFF, 0xDF, 0xDF, 0xFD, 0xFF, 0xDF, 0xDF, 0xFD, 0xFF, 0xDF, 0xDF, 0xFD, 0xFF, 0xDF, 0xDF,
0xFC, 0xFF, 0x9E, 0x1F, 0xFC, 0x7F, 0x9E, 0x1F, 0xFE, 0x3E, 0x1E, 0x1F, 0xFE, 0x00, 0x3E,
0x3F, 0xFF, 0x00, 0x3E, 0x3F, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
];

// fn draw_text(display: &mut impl DrawTarget<Color = Color>, text: &str, x: i32, y: i32) {
// let style = MonoTextStyleBuilder::new()
// .font(&FONT_10X20)
// .text_color(Color::Black)
// .background_color(Color::White)
// .build();

// let text_style = TextStyleBuilder::new().baseline(Baseline::Top).build();

// let _ = Text::with_text_style(text, Point::new(x, y), style, text_style).draw(display);
// }

#[entry]
fn main() -> ! {
let cp = cortex_m::Peripherals::take().unwrap();
let dp = pac::Peripherals::take().unwrap(); // 获取 STM32F1xx 的外设

let mut flash = dp.FLASH.constrain(); // 初始化 FLASH 模块
let rcc = dp.RCC.constrain(); // 初始化 RCC 模块

let clocks = rcc.cfgr.freeze(&mut flash.acr); // 冻结时钟

let mut gpioa = dp.GPIOA.split(); // 初始化 GPIOA 模块
let mut gpiob = dp.GPIOB.split(); // 初始化 GPIOB 模块
let mut gpioc = dp.GPIOC.split(); // 初始化 GPIOC 模块

// SPI2
let spi_pins = (
gpiob.pb13.into_alternate_push_pull(&mut gpiob.crh), // 将 PA5 引脚配置为 SPI2 的 SCK 引脚
NoMiso, // 将 PB14 引脚配置为 SPI2 的 MISO 引脚
gpiob.pb15.into_alternate_push_pull(&mut gpiob.crh), // 将 PA7 引脚配置为 SPI2 的 MOSI 引脚
);
let cs = gpiob.pb12.into_push_pull_output(&mut gpiob.crh); // 将 PA4 引脚配置为片选引脚

let rst = gpioa.pa11.into_push_pull_output(&mut gpioa.crh); // 将 USB-端口配置为复位引脚
let dc = gpioa.pa12.into_push_pull_output(&mut gpioa.crh); // 将 USB+ 端口配置为数据/命令控制引脚
let busy = gpiob.pb5.into_floating_input(&mut gpiob.crl); // 将 SMBAI1 端口配置为忙状态信号引脚

// 定义 SPI 接口的模式
let spi_mode = Mode {
polarity: Polarity::IdleLow, // 空闲时钟低电平的极性
phase: Phase::CaptureOnFirstTransition, // 捕获第一个时钟边沿的数据
};

// 配置 SPI 接口
let mut spi = Spi::spi2(
dp.SPI2, // 使用 SPI2
spi_pins, // 使用 SCK 和 MOSI 引脚
spi_mode,
1.MHz(), // 使用 1MHz 的时钟速度
clocks, // 使用上面定义的时钟
);

let mut delay = Delay::new(cp.SYST, clocks.sysclk().to_Hz());
let mut epd = Epd2in9d::new(&mut spi, cs, busy, dc, rst, &mut delay, None).unwrap();
let mut display = Display2in9d::default();
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
led.set_high();

display.clear(Color::White).ok();
epd.clear_frame(&mut spi, &mut delay).unwrap();
delay.delay_ms(5000);

// 全刷测试
// display.set_rotation(DisplayRotation::Rotate270);
// draw_text(&mut display, "NicoNicoNi~", 5, 5);

// epd.update_frame(&mut spi, display.buffer(), &mut delay)
// .unwrap();
// epd.display_frame(&mut spi, &mut delay).unwrap();
// delay.delay_ms(5000);
epd.update_frame(&mut spi, G_IMAGE_BASEMAP, &mut delay)
.unwrap();
epd.display_frame(&mut spi, &mut delay).unwrap();
delay.delay_ms(5000);

// 局刷测试
for i in 0..10 {
epd.update_partial_frame(&mut spi, &mut delay, &NUM[i], 63, 86, 32, 24)
.unwrap();
epd.display_frame(&mut spi, &mut delay).unwrap();
delay.delay_ms(1000);
}

epd.sleep(&mut spi, &mut delay).unwrap();

loop {
delay.delay_ms(1000);
led.set_high();
delay.delay_ms(1000);
led.set_low();
}
}