/
PcmInfo.cs
2240 lines (2173 loc) · 73.8 KB
/
PcmInfo.cs
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
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PcmHacking
{
public enum PcmType
{
Undefined = 0, // required for failed osid test on binary file
P01_P59,
P04,
P05,
P08,
P10,
P12,
E54,
LLY,
BLACKBOX
}
/// <summary>
/// This combines various metadata about whatever PCM we've connected to.
/// </summary>
/// <remarks>
/// This was ported from the LS1 flashing utility originally posted at pcmhacking.net.
/// </remarks>
public class PcmInfo
{
/// <summary>
/// Operating system ID.
/// </summary>
public uint OSID { get; private set; }
/// <summary>
/// Descriptive text.
/// </summary>
public string Description { get; private set; }
/// <summary>
/// Indicates whether this PCM is supported by the app.
/// </summary>
public bool IsSupported { get; private set; }
/// <summary>
/// PCM requires a kernel loader
/// </summary>
/// <remarks>
/// We make dual use of this, once it has outlived it's usefulness,
/// we use it as a state switch between Loader and Kernel.
/// </remarks>
public bool LoaderRequired { get; set; }
/// <summary>
/// Indicates how to validate files before writing.
/// </summary>
public PcmType ValidationMethod { get; private set; }
/// <summary>
/// What type of hardware it is
/// </summary>
public PcmType HardwareType { get; private set; }
/// <summary>
/// Name of the kernel file to use.
/// </summary>
public string KernelFileName { get; private set; }
/// <summary>
/// Base address to begin writing the kernel to.
/// </summary>
public int KernelBaseAddress { get; private set; }
/// <summary>
/// Name of the kernel loader file to use.
/// </summary>
public string LoaderFileName { get; private set; }
/// <summary>
/// Base address to begin writing the kernel loader to.
/// </summary>
public int LoaderBaseAddress { get; private set; }
/// <summary>
/// Base address to begin reading or writing the ROM contents.
/// </summary>
public int ImageBaseAddress { get; private set; }
/// <summary>
/// Size of the ROM.
/// </summary>
public int ImageSize { get; private set; }
/// <summary>
/// Size of the ROM.
/// </summary>
public int RAMSize { get; private set; }
/// <summary>
/// Which key algorithm to use to unlock the PCM.
/// </summary>
public int KeyAlgorithm { get; private set; }
/// <summary>
/// Supports file validation checksums?
/// </summary>
public bool ChecksumSupport { get; private set; }
/// <summary>
/// Supports flash sector CRC?
/// </summary>
public bool FlashCRCSupport { get; private set; }
/// <summary>
/// Does PCM's kernel support flash chip identification?
/// </summary>
public bool FlashIDSupport { get; private set; }
/// <summary>
/// Does PCM's kernel support version number identification?
/// </summary>
public bool KernelVersionSupport { get; private set; }
/// <summary>
/// PCM kernel max block size.
/// </summary>
public int KernelMaxBlockSize { get; private set; }
/// <summary>
/// Assembly Kernel detected.
/// </summary>
/// <remarks>
/// Bit of a hack to support both the C Kernels and the Assembly Kernels EASILY with minimal changes.
/// After the C Kernels are gone this is no longer necessary.
/// Also see notes in CKernelVerifier CompareRanges().
/// </remarks>
public bool AssemblyKernel { get; set; } = false;
/// <summary>
/// Populate this object based on the given OSID.
/// </summary>
public PcmInfo(uint osid)
{
this.OSID = osid;
// These defaults work for P01 and P59 hardware.
// Differences are overwriten for other hardware and kernels.
//
// This is a complete list of PCM related properties and in the same order as the declarations above.
// It's a good template to use for each PCM ... Nice neat and ordely.
//
//this.Description = "";
this.IsSupported = true;
this.LoaderRequired = false;
this.ValidationMethod = PcmType.P01_P59;
this.HardwareType = PcmType.P01_P59;
this.KernelFileName = "Kernel-P01.bin";
this.KernelBaseAddress = 0xFF8000;
//this.LoaderFileName = string.Empty;
//this.LoaderBaseAddress = 0x0;
//this.ImageBaseAddress = 0x0;
//this.ImageSize = 0x0;
this.RAMSize = 0x4DFF;
//this.KeyAlgorithm = 0;
this.ChecksumSupport = true;
this.FlashCRCSupport = true;
this.FlashIDSupport = true;
this.KernelVersionSupport = true;
this.KernelMaxBlockSize = 4096;
switch (osid)
{
// LB7 Duramax EFI Live COS
case 01337601:
case 01710001:
case 01887301:
case 02444101:
case 02600601:
case 02685301:
case 03904401:
case 01337605:
case 01710005:
case 01887305:
case 02444105:
case 02600605:
case 02685305:
case 03904405:
this.Description = "E54 LB7 EFILive COS";
this.IsSupported = false;
this.ValidationMethod = PcmType.E54;
this.HardwareType = PcmType.E54;
this.KernelFileName = "Kernel-E54.bin";
this.KernelBaseAddress = 0xFF8F50;
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
this.KeyAlgorithm = 2;
this.ChecksumSupport = false;
this.FlashCRCSupport = true;
this.FlashIDSupport = true;
this.KernelVersionSupport = true;
break;
// LB7 Duramax service no 9388505
case 15063376:
case 15188873:
case 15097100:
this.Description = "E54 LB7 9388505";
this.IsSupported = false;
this.ValidationMethod = PcmType.E54;
this.HardwareType = PcmType.E54;
this.KernelFileName = "Kernel-E54.bin";
this.KernelBaseAddress = 0xFF8F50;
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
this.KeyAlgorithm = 2;
this.ChecksumSupport = false;
this.FlashCRCSupport = true;
this.FlashIDSupport = true;
this.KernelVersionSupport = true;
break;
// LB7 Duramax service no 12210729
case 15094441:
case 15085499:
case 15166853:
case 15186006:
case 15189044:
this.Description = "E54 LB7 12210729";
this.IsSupported = false;
this.ValidationMethod = PcmType.E54;
this.HardwareType = PcmType.E54;
this.KernelFileName = "Kernel-E54.bin";
this.KernelBaseAddress = 0xFF8F50;
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
this.KeyAlgorithm = 2;
this.ChecksumSupport = false;
this.FlashCRCSupport = true;
this.FlashIDSupport = true;
this.KernelVersionSupport = true;
break;
// LLY Duramax service no 12244189 - 1mbyte?
case 15141668:
case 15193885:
case 15228758:
case 15231599:
case 15231600:
case 15879103:
case 15087230:
this.IsSupported = false;
this.KeyAlgorithm = 2;
this.Description = "LLY 12244189";
this.ImageBaseAddress = 0x0;
this.ImageSize = 1024 * 1024;
this.HardwareType = PcmType.LLY;
break;
// LL7 Duramax EFI Live Cos
case 04166801:
case 04166805:
case 05160001:
case 05160005:
case 05388501:
case 05388505:
case 05875801:
case 05875805:
this.IsSupported = false;
this.KeyAlgorithm = 2;
this.Description = "LLY EFILive COS";
this.ImageBaseAddress = 0x0;
this.ImageSize = 1024 * 1024;
this.HardwareType = PcmType.LLY;
break;
// VCM Suite COS
case 1251001:
this.KeyAlgorithm = 3;
this.Description = "VCM Suite 2 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1261001:
this.KeyAlgorithm = 4;
this.Description = "VCM Suite 3 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1271001:
this.KeyAlgorithm = 5;
this.Description = "VCM Suite Mafless";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1281001:
this.KeyAlgorithm = 6;
this.Description = "VCM Suite MAF RTT";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1271002:
this.KeyAlgorithm = 7;
this.Description = "VCM Suite Mafless";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1251002:
this.KeyAlgorithm = 8;
this.Description = "VCM Suite 2 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1261002:
this.KeyAlgorithm = 9;
this.Description = "VCM Suite MAF RTT";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1281002:
this.KeyAlgorithm = 10;
this.Description = "VCM Suite 3 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1271003:
this.KeyAlgorithm = 11;
this.Description = "VCM Suite Mafless";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1251003:
this.KeyAlgorithm = 12;
this.Description = "VCM Suite 2 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1261003:
this.KeyAlgorithm = 13;
this.Description = "VCM Suite 3 Bar";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1281003:
this.KeyAlgorithm = 14;
this.Description = "VCM Suite MAF RTT";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 1273057:
this.KeyAlgorithm = 40;
this.Description = "VCM Suite COS 1M";
this.ImageBaseAddress = 0x0;
this.ImageSize = 1024 * 1024;
break;
//------- HPT COS -----------
case 1250013:
case 1250018:
case 1251005:
case 1251006:
case 1251008:
case 1251010:
case 1251011:
case 1251012:
case 1251014:
case 1251016:
case 1251017:
case 1260006:
case 1260011:
case 1261005:
case 1261008:
case 1261014:
case 1261016:
case 1270013:
case 1270017:
case 1271005:
case 1271006:
case 1271008:
case 1271010:
case 1271011:
case 1271012:
case 1271014:
case 1271016:
case 1271018:
case 1281005:
case 1281006:
case 1281008:
case 1281010:
case 1281011:
case 1281012:
case 1281014:
case 1281016:
case 1281918:
this.Description = "Unknown VCM Suite COS";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
//-------------------------
// 9354896
case 9360360:
case 9360361:
case 9361140:
case 9363996:
case 9365637:
case 9373372:
case 9379910:
case 9381344:
case 12205612:
case 12584929:
case 12593359:
case 12597506:
case 16253027:
this.KeyAlgorithm = 40;
this.Description = "9354896";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
// 12200411
case 12202088: // main 2000/2001 OS
case 12206871:
case 12208322:
case 12209203:
case 12212156:
case 12216125:
case 12221588:
case 12225074: // main 2003/2004 OS
case 12593358:
this.KeyAlgorithm = 40;
this.Description = "12200411";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
case 01250001:
case 01290001:
case 02020002:
case 02040001:
case 03150002:
case 04072901:
case 04073101:
case 04110003:
case 05120003:
case 01250002:
case 01290002:
case 02020003:
case 02040002:
case 03150003:
case 04072902:
case 04073102:
case 04140001:
case 01250003:
case 01290003:
case 02020005:
case 02040003:
case 03170001:
case 04072903:
case 04073103:
case 04140002:
case 01270001:
case 01290005:
case 02030001:
case 03110001:
case 03190001:
case 04073001:
case 04080001:
case 04140003:
case 01270002:
case 02010001:
case 02030002:
case 03130001:
case 03190002:
case 04073002:
case 04110001:
case 05120001:
case 01270003:
case 02020001:
case 02030003:
case 03150001:
case 03190003:
case 04073003:
case 04110002:
case 05120002:
this.KeyAlgorithm = 40;
string type = osid.ToString();
switch (Convert.ToInt32(type, 10))
{
case 1:
this.Description = "EFI Live COS1";
break;
case 2:
this.Description = "EFI Live COS2";
break;
case 3:
this.Description = "EFI Live COS3";
break;
case 5:
this.Description = "EFI Live COS5";
break;
default:
this.Description = "EFI Live COS";
break;
}
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
break;
// 1Mb pcms
// GMC Sierra service number 12589463
case 12591725:
case 12592618:
case 12593555:
case 12606961:
case 12612115:
this.KeyAlgorithm = 40;
this.Description = "12589463";
this.ImageSize = 1024 * 1024;
break;
//case 1250052:
//case 1250058:
//case 4073103:
case 12564440:
case 12585950:
case 12588804:
case 12592425:
case 12592433: //Aussie
case 12606960:
case 12612114:
this.KeyAlgorithm = 40;
this.Description = "12586242";
this.ImageSize = 1024 * 1024;
break;
// usa 12586243
case 12587603:
case 12587604:
case 76030003:
case 76030004:
case 76030005:
case 76030006:
case 76030007:
case 76030008:
case 76030009:
this.KeyAlgorithm = 40;
this.Description = "12586243";
this.ImageSize = 1024 * 1024;
break;
// not sure 12582605
case 12578128:
case 12579405:
case 12580055:
case 12593058:
this.KeyAlgorithm = 40;
this.Description = "12582605";
this.ImageSize = 1024 * 1024;
break;
// not sure 12582811
case 12587811:
case 12605114:
case 12606807:
case 12608669:
case 12613245:
case 12613246:
case 12613247:
case 12619623:
this.KeyAlgorithm = 40;
this.Description = "12582811";
this.ImageSize = 1024 * 1024;
break;
// not sure 12602802
case 12597120:
case 12613248:
case 12619624:
this.KeyAlgorithm = 40;
this.Description = "12602802";
this.ImageSize = 1024 * 1024;
break;
case 9355699:
case 9365095:
case 16263425: // 9366810 'black box'
this.IsSupported = false;
this.KeyAlgorithm = 15;
this.Description = "'Black Box' 9366810";
this.ImageBaseAddress = 0x0;
this.ImageSize = 512 * 1024;
this.HardwareType = PcmType.BLACKBOX;
break;
// P04 V6 Service number 9374997
case 9355672:
case 9356706:
case 9357008:
case 9357010:
case 9363226:
case 9365170:
case 9365972:
case 9365973:
case 9365977:
case 9365978:
case 9365983:
case 9365986:
case 9366308:
case 9366310:
case 9366315:
case 9366318:
case 9367318:
case 9367321:
case 9367398:
case 9367515:
case 9367516:
case 9367752:
case 9367753:
case 9367757:
case 9367758:
case 9367767:
case 9367772:
case 9368196:
case 9369225:
case 9369227:
case 9369228:
case 9369229:
case 9369230:
case 9369231:
case 9369232:
case 9369252:
case 9369308:
case 9369309:
case 9369311:
case 9369312:
case 9369319:
case 9369320:
case 9369321:
case 9369326:
case 9369395:
case 9369396:
case 9370627:
case 9370635:
case 9370688:
case 9370700:
case 9371626:
case 9371627:
case 9371628:
case 9372327:
case 9372328:
case 9372332:
case 9372357:
case 9372358:
case 9372360:
case 9372361:
case 9372362:
case 9372363:
case 9372465:
case 9372466:
case 9372474:
case 9372477:
case 9373168:
case 9373171:
case 9373175:
case 9373176:
case 9373181:
case 9373182:
case 9373184:
case 9373962:
case 9374336:
case 9374337:
case 9374338:
case 9374625:
case 9374628:
case 9375070:
case 9375073:
case 9375118:
case 9376661:
case 9376662:
case 9376663:
case 9377380:
case 9377381:
case 9377385:
case 9377388:
case 9377389:
case 9377390:
case 9377391:
case 9377392:
case 9377399:
case 9377525:
case 9377542:
case 9377739:
case 9378063:
case 9378065:
case 9378067:
case 9378068:
case 9378070:
case 9378072:
case 9378075:
case 9378076:
case 9378077:
case 9379115:
case 9379116:
case 9379117:
case 9379123:
case 9379126:
case 9379128:
case 9379427:
case 9379492:
case 9379603:
case 9379805:
case 9379806:
case 9382210:
case 9382460:
case 9382915:
case 9382916:
case 9382918:
case 9382920:
case 9382926:
case 9382950:
case 9382951:
case 9382956:
case 9383066:
case 9383068:
case 9383074:
case 9383079:
case 9383081:
case 9383084:
case 9383086:
case 9383087:
case 9383088:
case 9383089:
case 9383091:
case 9386582:
case 9386586:
case 12214377:
case 12214379:
case 16241831:
case 16241840:
case 16242217:
case 16242228:
case 16242233:
case 16242236:
case 16243026:
case 16255667:
case 16255675:
case 16255677:
case 16255680:
case 16255681:
case 16255794:
case 16256047:
case 16257159:
case 16257165:
case 16257166:
case 16257169:
case 16257171:
// P04 V6 Service number 9380717
case 9354406:
case 9356245:
case 9356247:
case 9356248:
case 9356251:
case 9356252:
case 9356253:
case 9356256:
case 9356258:
case 9363607:
case 9363608:
case 9364123:
case 9364125:
case 9364126:
case 9364127:
case 9374398:
case 9374402:
case 9377336:
case 9380138:
case 9380140:
case 9380718:
case 9380973:
case 9381748:
case 9381752:
case 9381754:
case 9381776:
case 9381796:
case 9381797:
case 9381798:
case 9381815:
case 9382558:
case 9382562:
case 9382566:
case 9382572:
case 9382728:
case 9382729:
case 9382730:
case 9384010:
case 9384011:
case 9384012:
case 9384013:
case 9384015:
case 9384017:
case 9384018:
case 9384020:
case 9384022:
case 9384023:
case 9384027:
case 9384028:
case 9384033:
case 9384035:
case 9384036:
case 9384042:
case 9384043:
case 9384046:
case 9384047:
case 9384048:
case 9384050:
case 9384051:
case 9384052:
case 9384053:
case 9384073:
case 9384075:
case 9384434:
case 9384436:
case 9384437:
case 9384438:
case 9384441:
case 9384442:
case 9384457:
case 9384458:
case 9384462:
case 9384464:
case 9384465:
case 9384467:
case 9384471:
case 9384473:
case 9384477:
case 9386283:
case 9386285:
case 9386286:
case 9386287:
case 9386288:
case 9386289:
case 9387045:
case 9387047:
case 9387048:
case 9387112:
case 9389253:
case 9389256:
case 9389257:
case 9389258:
case 9389259:
case 9389260:
case 9389282:
case 9389283:
case 9389339:
case 9389341:
case 9389343:
case 9389346:
case 9389348:
case 9389349:
case 9389352:
case 9389356:
case 9389397:
case 9389666:
case 9389667:
case 9389668:
case 9389670:
case 9389676:
case 9389679:
case 9389687:
case 9389688:
case 9389692:
case 9389695:
case 9389708:
case 9389750:
case 9389752:
case 9389759:
case 9389760:
case 9389761:
case 9389766:
case 9389767:
case 9389769:
case 9389770:
case 9389909:
case 9390172:
case 9390758:
case 9390763:
case 9390765:
case 9391248:
case 9392594:
case 9392748:
case 9392786:
case 9392787:
case 9392790:
case 9392791:
case 9392794:
case 9392797:
case 9392798:
case 9392800:
case 9392801:
case 9392802:
case 9392804:
case 9392807:
case 9393295:
case 9393297:
case 9393300:
case 9393302:
case 9393307:
case 9393309:
case 9393313:
case 9393315:
case 9393580:
case 9393581:
case 9393598:
case 9393608:
case 9393613:
case 9393832:
case 9393898:
case 9393901:
case 10384528:
case 10384529:
case 12201457:
case 12201458:
case 12201460:
case 12201461:
case 12201462:
case 12201463:
case 12201465:
case 12201466:
case 12201467:
case 12201468:
case 12201687:
case 12201772:
case 12201779:
case 12201782:
case 12201783:
case 12201785:
case 12201786:
case 12201787:
case 12201788:
case 12201791:
case 12201792:
case 12201793:
case 12201795:
case 12201796:
case 12201797:
case 12201803:
case 12201822:
case 12201829:
case 12201830:
case 12201840:
case 12201850:
case 12201862:
case 12201863:
case 12201865:
case 12201866:
case 12201867:
case 12201868:
case 12201875:
case 12201876:
case 12201877:
case 12201878:
case 12201879:
case 12201881:
case 12201885:
case 12201886:
case 12201887:
case 12201888:
case 12201889:
case 12201891:
case 12202127:
case 12202129:
case 12202133:
case 12202135:
case 12202155:
case 12202881:
case 12202882:
case 12202885:
case 12202941:
case 12202942:
case 12202945:
case 12203016:
case 12203657:
case 12203659: