blob: 15c77e1af6efcb645902f216f18916272cbfc28e [file] [log] [blame]
/*
* Copyright (c) 2019 Ed Merks and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ed Merks - initial API and implementation
*/
package org.eclipse.net4j.util;
import java.io.IOException;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* This class is a major hack to support {@link AccessibleObject#setAccessible(boolean)} in Java 9 or higher.
* It is used only by {@link ReflectUtil#setValue(Field, Object, Object, boolean)} and then only to call {@link #setNonFinal(Field)}.
* The other methods are unused but may be useful in the future if we must reflect across module boundaries.
*
* @see #setAccessible(Constructor)
* @see #setAccessible(Field)
* @see #setAccessible(Method)
* @see #setNonFinal(Field)
*
* @author Ed Merks
*/
final class AccessUtil
{
/**
* The following three constants are generated by {@link #main(String[]) invoking the generator}.
* They capture information about the bytes needed to generate anonymous classes.
*
* @see #main(String[])
*/
private static final int NAME_PATH_INDEX = 14;
private static final int NAME_SIGNATURE_INDEX = 878;
private static final byte[] ACCESS_CONTROLLER_BYTES = new byte[] { //
(byte)0xca, // 0
(byte)0xfe, // 1
(byte)0xba, // 2
(byte)0xbe, // 3
0x00, // 4
0x00, // 5
0x00, // 6
0x35, // 5 7
0x00, // 8
0x65, // e 9
0x07, // 10
0x00, // 11
0x02, // 12
0x01, // 13
// 0x00, //
// 0x27, // '
// 0x6f, // o
// 0x72, // r
// 0x67, // g
// 0x2f, // /
// 0x65, // e
// 0x78, // x
// 0x61, // a
// 0x6d, // m
// 0x70, // p
// 0x6c, // l
// 0x65, // e
// 0x2f, // /
// 0x61, // a
// 0x63, // c
// 0x63, // c
// 0x65, // e
// 0x73, // s
// 0x73, // s
// 0x69, // i
// 0x62, // b
// 0x6c, // l
// 0x65, // e
// 0x2f, // /
// 0x41, // A
// 0x63, // c
// 0x63, // c
// 0x65, // e
// 0x73, // s
// 0x73, // s
// 0x43, // C
// 0x6f, // o
// 0x6e, // n
// 0x74, // t
// 0x72, // r
// 0x6f, // o
// 0x6c, // l
// 0x6c, // l
// 0x65, // e
// 0x72, // r
0x07, // 14
0x00, // 15
0x04, // 16
0x01, // 17
0x00, // 18
0x10, // 19
0x6a, // j 20
0x61, // a 21
0x76, // v 22
0x61, // a 23
0x2f, // / 24
0x6c, // l 25
0x61, // a 26
0x6e, // n 27
0x67, // g 28
0x2f, // / 29
0x4f, // O 30
0x62, // b 31
0x6a, // j 32
0x65, // e 33
0x63, // c 34
0x74, // t 35
0x07, // 36
0x00, // 37
0x06, // 38
0x01, // 39
0x00, // 40
0x1b, // 41
0x6a, // j 42
0x61, // a 43
0x76, // v 44
0x61, // a 45
0x2f, // / 46
0x75, // u 47
0x74, // t 48
0x69, // i 49
0x6c, // l 50
0x2f, // / 51
0x66, // f 52
0x75, // u 53
0x6e, // n 54
0x63, // c 55
0x74, // t 56
0x69, // i 57
0x6f, // o 58
0x6e, // n 59
0x2f, // / 60
0x43, // C 61
0x6f, // o 62
0x6e, // n 63
0x73, // s 64
0x75, // u 65
0x6d, // m 66
0x65, // e 67
0x72, // r 68
0x01, // 69
0x00, // 70
0x09, // 71
0x4d, // M 72
0x4f, // O 73
0x44, // D 74
0x49, // I 75
0x46, // F 76
0x49, // I 77
0x45, // E 78
0x52, // R 79
0x53, // S 80
0x01, // 81
0x00, // 82
0x1c, // 83
0x4c, // L 84
0x6a, // j 85
0x61, // a 86
0x76, // v 87
0x61, // a 88
0x2f, // / 89
0x6c, // l 90
0x61, // a 91
0x6e, // n 92
0x67, // g 93
0x2f, // / 94
0x69, // i 95
0x6e, // n 96
0x76, // v 97
0x6f, // o 98
0x6b, // k 99
0x65, // e 100
0x2f, // / 101
0x56, // V 102
0x61, // a 103
0x72, // r 104
0x48, // H 105
0x61, // a 106
0x6e, // n 107
0x64, // d 108
0x6c, // l 109
0x65, // e 110
0x3b, // ; 111
0x01, // 112
0x00, // 113
0x08, // 114
0x3c, // < 115
0x63, // c 116
0x6c, // l 117
0x69, // i 118
0x6e, // n 119
0x69, // i 120
0x74, // t 121
0x3e, // > 122
0x01, // 123
0x00, // 124
0x03, // 125
0x28, // ( 126
0x29, // ) 127
0x56, // V 128
0x01, // 129
0x00, // 130
0x04, // 131
0x43, // C 132
0x6f, // o 133
0x64, // d 134
0x65, // e 135
0x07, // 136
0x00, // 137
0x0d, // 138
0x01, // 139
0x00, // 140
0x17, // 141
0x6a, // j 142
0x61, // a 143
0x76, // v 144
0x61, // a 145
0x2f, // / 146
0x6c, // l 147
0x61, // a 148
0x6e, // n 149
0x67, // g 150
0x2f, // / 151
0x72, // r 152
0x65, // e 153
0x66, // f 154
0x6c, // l 155
0x65, // e 156
0x63, // c 157
0x74, // t 158
0x2f, // / 159
0x46, // F 160
0x69, // i 161
0x65, // e 162
0x6c, // l 163
0x64, // d 164
0x0a, // 165
0x00, // 166
0x0f, // 167
0x00, // 168
0x11, // 169
0x07, // 170
0x00, // 171
0x10, // 172
0x01, // 173
0x00, // 174
0x1e, // 175
0x6a, // j 176
0x61, // a 177
0x76, // v 178
0x61, // a 179
0x2f, // / 180
0x6c, // l 181
0x61, // a 182
0x6e, // n 183
0x67, // g 184
0x2f, // / 185
0x69, // i 186
0x6e, // n 187
0x76, // v 188
0x6f, // o 189
0x6b, // k 190
0x65, // e 191
0x2f, // / 192
0x4d, // M 193
0x65, // e 194
0x74, // t 195
0x68, // h 196
0x6f, // o 197
0x64, // d 198
0x48, // H 199
0x61, // a 200
0x6e, // n 201
0x64, // d 202
0x6c, // l 203
0x65, // e 204
0x73, // s 205
0x0c, // 206
0x00, // 207
0x12, // 208
0x00, // 209
0x13, // 210
0x01, // 211
0x00, // 212
0x06, // 213
0x6c, // l 214
0x6f, // o 215
0x6f, // o 216
0x6b, // k 217
0x75, // u 218
0x70, // p 219
0x01, // 220
0x00, // 221
0x29, // ) 222
0x28, // ( 223
0x29, // ) 224
0x4c, // L 225
0x6a, // j 226
0x61, // a 227
0x76, // v 228
0x61, // a 229
0x2f, // / 230
0x6c, // l 231
0x61, // a 232
0x6e, // n 233
0x67, // g 234
0x2f, // / 235
0x69, // i 236
0x6e, // n 237
0x76, // v 238
0x6f, // o 239
0x6b, // k 240
0x65, // e 241
0x2f, // / 242
0x4d, // M 243
0x65, // e 244
0x74, // t 245
0x68, // h 246
0x6f, // o 247
0x64, // d 248
0x48, // H 249
0x61, // a 250
0x6e, // n 251
0x64, // d 252
0x6c, // l 253
0x65, // e 254
0x73, // s 255
0x24, // $ 256
0x4c, // L 257
0x6f, // o 258
0x6f, // o 259
0x6b, // k 260
0x75, // u 261
0x70, // p 262
0x3b, // ; 263
0x0a, // 264
0x00, // 265
0x0f, // 266
0x00, // 267
0x15, // 268
0x0c, // 269
0x00, // 270
0x16, // 271
0x00, // 272
0x17, // 273
0x01, // 274
0x00, // 275
0x0f, // 276
0x70, // p 277
0x72, // r 278
0x69, // i 279
0x76, // v 280
0x61, // a 281
0x74, // t 282
0x65, // e 283
0x4c, // L 284
0x6f, // o 285
0x6f, // o 286
0x6b, // k 287
0x75, // u 288
0x70, // p 289
0x49, // I 290
0x6e, // n 291
0x01, // 292
0x00, // 293
0x61, // a 294
0x28, // ( 295
0x4c, // L 296
0x6a, // j 297
0x61, // a 298
0x76, // v 299
0x61, // a 300
0x2f, // / 301
0x6c, // l 302
0x61, // a 303
0x6e, // n 304
0x67, // g 305
0x2f, // / 306
0x43, // C 307
0x6c, // l 308
0x61, // a 309
0x73, // s 310
0x73, // s 311
0x3b, // ; 312
0x4c, // L 313
0x6a, // j 314
0x61, // a 315
0x76, // v 316
0x61, // a 317
0x2f, // / 318
0x6c, // l 319
0x61, // a 320
0x6e, // n 321
0x67, // g 322
0x2f, // / 323
0x69, // i 324
0x6e, // n 325
0x76, // v 326
0x6f, // o 327
0x6b, // k 328
0x65, // e 329
0x2f, // / 330
0x4d, // M 331
0x65, // e 332
0x74, // t 333
0x68, // h 334
0x6f, // o 335
0x64, // d 336
0x48, // H 337
0x61, // a 338
0x6e, // n 339
0x64, // d 340
0x6c, // l 341
0x65, // e 342
0x73, // s 343
0x24, // $ 344
0x4c, // L 345
0x6f, // o 346
0x6f, // o 347
0x6b, // k 348
0x75, // u 349
0x70, // p 350
0x3b, // ; 351
0x29, // ) 352
0x4c, // L 353
0x6a, // j 354
0x61, // a 355
0x76, // v 356
0x61, // a 357
0x2f, // / 358
0x6c, // l 359
0x61, // a 360
0x6e, // n 361
0x67, // g 362
0x2f, // / 363
0x69, // i 364
0x6e, // n 365
0x76, // v 366
0x6f, // o 367
0x6b, // k 368
0x65, // e 369
0x2f, // / 370
0x4d, // M 371
0x65, // e 372
0x74, // t 373
0x68, // h 374
0x6f, // o 375
0x64, // d 376
0x48, // H 377
0x61, // a 378
0x6e, // n 379
0x64, // d 380
0x6c, // l 381
0x65, // e 382
0x73, // s 383
0x24, // $ 384
0x4c, // L 385
0x6f, // o 386
0x6f, // o 387
0x6b, // k 388
0x75, // u 389
0x70, // p 390
0x3b, // ; 391
0x08, // 392
0x00, // 393
0x19, // 394
0x01, // 395
0x00, // 396
0x09, // 397
0x6d, // m 398
0x6f, // o 399
0x64, // d 400
0x69, // i 401
0x66, // f 402
0x69, // i 403
0x65, // e 404
0x72, // r 405
0x73, // s 406
0x09, // 407
0x00, // 408
0x1b, // 409
0x00, // 410
0x1d, // 411
0x07, // 412
0x00, // 413
0x1c, // 414
0x01, // 415
0x00, // 416
0x11, // 417
0x6a, // j 418
0x61, // a 419
0x76, // v 420
0x61, // a 421
0x2f, // / 422
0x6c, // l 423
0x61, // a 424
0x6e, // n 425
0x67, // g 426
0x2f, // / 427
0x49, // I 428
0x6e, // n 429
0x74, // t 430
0x65, // e 431
0x67, // g 432
0x65, // e 433
0x72, // r 434
0x0c, // 435
0x00, // 436
0x1e, // 437
0x00, // 438
0x1f, // 439
0x01, // 440
0x00, // 441
0x04, // 442
0x54, // T 443
0x59, // Y 444
0x50, // P 445
0x45, // E 446
0x01, // 447
0x00, // 448
0x11, // 449
0x4c, // L 450
0x6a, // j 451
0x61, // a 452
0x76, // v 453
0x61, // a 454
0x2f, // / 455
0x6c, // l 456
0x61, // a 457
0x6e, // n 458
0x67, // g 459
0x2f, // / 460
0x43, // C 461
0x6c, // l 462
0x61, // a 463
0x73, // s 464
0x73, // s 465
0x3b, // ; 466
0x0a, // 467
0x00, // 468
0x21, // ! 469
0x00, // 470
0x23, // # 471
0x07, // 472
0x00, // 473
0x22, // " 474
0x01, // 475
0x00, // 476
0x25, // % 477
0x6a, // j 478
0x61, // a 479
0x76, // v 480
0x61, // a 481
0x2f, // / 482
0x6c, // l 483
0x61, // a 484
0x6e, // n 485
0x67, // g 486
0x2f, // / 487
0x69, // i 488
0x6e, // n 489
0x76, // v 490
0x6f, // o 491
0x6b, // k 492
0x65, // e 493
0x2f, // / 494
0x4d, // M 495
0x65, // e 496
0x74, // t 497
0x68, // h 498
0x6f, // o 499
0x64, // d 500
0x48, // H 501
0x61, // a 502
0x6e, // n 503
0x64, // d 504
0x6c, // l 505
0x65, // e 506
0x73, // s 507
0x24, // $ 508
0x4c, // L 509
0x6f, // o 510
0x6f, // o 511
0x6b, // k 512
0x75, // u 513
0x70, // p 514
0x0c, // 515
0x00, // 516
0x24, // $ 517
0x00, // 518
0x25, // % 519
0x01, // 520
0x00, // 521
0x0d, // 522
0x66, // f 523
0x69, // i 524
0x6e, // n 525
0x64, // d 526
0x56, // V 527
0x61, // a 528
0x72, // r 529
0x48, // H 530
0x61, // a 531
0x6e, // n 532
0x64, // d 533
0x6c, // l 534
0x65, // e 535
0x01, // 536
0x00, // 537
0x52, // R 538
0x28, // ( 539
0x4c, // L 540
0x6a, // j 541
0x61, // a 542
0x76, // v 543
0x61, // a 544
0x2f, // / 545
0x6c, // l 546
0x61, // a 547
0x6e, // n 548
0x67, // g 549
0x2f, // / 550
0x43, // C 551
0x6c, // l 552
0x61, // a 553
0x73, // s 554
0x73, // s 555
0x3b, // ; 556
0x4c, // L 557
0x6a, // j 558
0x61, // a 559
0x76, // v 560
0x61, // a 561
0x2f, // / 562
0x6c, // l 563
0x61, // a 564
0x6e, // n 565
0x67, // g 566
0x2f, // / 567
0x53, // S 568
0x74, // t 569
0x72, // r 570
0x69, // i 571
0x6e, // n 572
0x67, // g 573
0x3b, // ; 574
0x4c, // L 575
0x6a, // j 576
0x61, // a 577
0x76, // v 578
0x61, // a 579
0x2f, // / 580
0x6c, // l 581
0x61, // a 582
0x6e, // n 583
0x67, // g 584
0x2f, // / 585
0x43, // C 586
0x6c, // l 587
0x61, // a 588
0x73, // s 589
0x73, // s 590
0x3b, // ; 591
0x29, // ) 592
0x4c, // L 593
0x6a, // j 594
0x61, // a 595
0x76, // v 596
0x61, // a 597
0x2f, // / 598
0x6c, // l 599
0x61, // a 600
0x6e, // n 601
0x67, // g 602
0x2f, // / 603
0x69, // i 604
0x6e, // n 605
0x76, // v 606
0x6f, // o 607
0x6b, // k 608
0x65, // e 609
0x2f, // / 610
0x56, // V 611
0x61, // a 612
0x72, // r 613
0x48, // H 614
0x61, // a 615
0x6e, // n 616
0x64, // d 617
0x6c, // l 618
0x65, // e 619
0x3b, // ; 620
0x09, // 621
0x00, // 622
0x01, // 623
0x00, // 624
0x27, // ' 625
0x0c, // 626
0x00, // 627
0x07, // 628
0x00, // 629
0x08, // 630
0x07, // 631
0x00, // 632
0x29, // ) 633
0x01, // 634
0x00, // 635
0x1a, // 636
0x6a, // j 637
0x61, // a 638
0x76, // v 639
0x61, // a 640
0x2f, // / 641
0x6c, // l 642
0x61, // a 643
0x6e, // n 644
0x67, // g 645
0x2f, // / 646
0x52, // R 647
0x75, // u 648
0x6e, // n 649
0x74, // t 650
0x69, // i 651
0x6d, // m 652
0x65, // e 653
0x45, // E 654
0x78, // x 655
0x63, // c 656
0x65, // e 657
0x70, // p 658
0x74, // t 659
0x69, // i 660
0x6f, // o 661
0x6e, // n 662
0x0a, // 663
0x00, // 664
0x28, // ( 665
0x00, // 666
0x2b, // + 667
0x0c, // 668
0x00, // 669
0x2c, // , 670
0x00, // 671
0x2d, // - 672
0x01, // 673
0x00, // 674
0x06, // 675
0x3c, // < 676
0x69, // i 677
0x6e, // n 678
0x69, // i 679
0x74, // t 680
0x3e, // > 681
0x01, // 682
0x00, // 683
0x18, // 684
0x28, // ( 685
0x4c, // L 686
0x6a, // j 687
0x61, // a 688
0x76, // v 689
0x61, // a 690
0x2f, // / 691
0x6c, // l 692
0x61, // a 693
0x6e, // n 694
0x67, // g 695
0x2f, // / 696
0x54, // T 697
0x68, // h 698
0x72, // r 699
0x6f, // o 700
0x77, // w 701
0x61, // a 702
0x62, // b 703
0x6c, // l 704
0x65, // e 705
0x3b, // ; 706
0x29, // ) 707
0x56, // V 708
0x07, // 709
0x00, // 710
0x2f, // / 711
0x01, // 712
0x00, // 713
0x13, // 714
0x6a, // j 715
0x61, // a 716
0x76, // v 717
0x61, // a 718
0x2f, // / 719
0x6c, // l 720
0x61, // a 721
0x6e, // n 722
0x67, // g 723
0x2f, // / 724
0x54, // T 725
0x68, // h 726
0x72, // r 727
0x6f, // o 728
0x77, // w 729
0x61, // a 730
0x62, // b 731
0x6c, // l 732
0x65, // e 733
0x01, // 734
0x00, // 735
0x0f, // 736
0x4c, // L 737
0x69, // i 738
0x6e, // n 739
0x65, // e 740
0x4e, // N 741
0x75, // u 742
0x6d, // m 743
0x62, // b 744
0x65, // e 745
0x72, // r 746
0x54, // T 747
0x61, // a 748
0x62, // b 749
0x6c, // l 750
0x65, // e 751
0x01, // 752
0x00, // 753
0x12, // 754
0x4c, // L 755
0x6f, // o 756
0x63, // c 757
0x61, // a 758
0x6c, // l 759
0x56, // V 760
0x61, // a 761
0x72, // r 762
0x69, // i 763
0x61, // a 764
0x62, // b 765
0x6c, // l 766
0x65, // e 767
0x54, // T 768
0x61, // a 769
0x62, // b 770
0x6c, // l 771
0x65, // e 772
0x01, // 773
0x00, // 774
0x27, // ' 775
0x4c, // L 776
0x6a, // j 777
0x61, // a 778
0x76, // v 779
0x61, // a 780
0x2f, // / 781
0x6c, // l 782
0x61, // a 783
0x6e, // n 784
0x67, // g 785
0x2f, // / 786
0x69, // i 787
0x6e, // n 788
0x76, // v 789
0x6f, // o 790
0x6b, // k 791
0x65, // e 792
0x2f, // / 793
0x4d, // M 794
0x65, // e 795
0x74, // t 796
0x68, // h 797
0x6f, // o 798
0x64, // d 799
0x48, // H 800
0x61, // a 801
0x6e, // n 802
0x64, // d 803
0x6c, // l 804
0x65, // e 805
0x73, // s 806
0x24, // $ 807
0x4c, // L 808
0x6f, // o 809
0x6f, // o 810
0x6b, // k 811
0x75, // u 812
0x70, // p 813
0x3b, // ; 814
0x01, // 815
0x00, // 816
0x02, // 817
0x65, // e 818
0x78, // x 819
0x01, // 820
0x00, // 821
0x15, // 822
0x4c, // L 823
0x6a, // j 824
0x61, // a 825
0x76, // v 826
0x61, // a 827
0x2f, // / 828
0x6c, // l 829
0x61, // a 830
0x6e, // n 831
0x67, // g 832
0x2f, // / 833
0x54, // T 834
0x68, // h 835
0x72, // r 836
0x6f, // o 837
0x77, // w 838
0x61, // a 839
0x62, // b 840
0x6c, // l 841
0x65, // e 842
0x3b, // ; 843
0x01, // 844
0x00, // 845
0x0d, // 846
0x53, // S 847
0x74, // t 848
0x61, // a 849
0x63, // c 850
0x6b, // k 851
0x4d, // M 852
0x61, // a 853
0x70, // p 854
0x54, // T 855
0x61, // a 856
0x62, // b 857
0x6c, // l 858
0x65, // e 859
0x0a, // 860
0x00, // 861
0x03, // 862
0x00, // 863
0x37, // 7 864
0x0c, // 865
0x00, // 866
0x2c, // , 867
0x00, // 868
0x0a, // 869
0x01, // 870
0x00, // 871
0x04, // 872
0x74, // t 873
0x68, // h 874
0x69, // i 875
0x73, // s 876
0x01, // 877
// 0x00, //
// 0x29, // )
// 0x4c, // L
// 0x6f, // o
// 0x72, // r
// 0x67, // g
// 0x2f, // /
// 0x65, // e
// 0x78, // x
// 0x61, // a
// 0x6d, // m
// 0x70, // p
// 0x6c, // l
// 0x65, // e
// 0x2f, // /
// 0x61, // a
// 0x63, // c
// 0x63, // c
// 0x65, // e
// 0x73, // s
// 0x73, // s
// 0x69, // i
// 0x62, // b
// 0x6c, // l
// 0x65, // e
// 0x2f, // /
// 0x41, // A
// 0x63, // c
// 0x63, // c
// 0x65, // e
// 0x73, // s
// 0x73, // s
// 0x43, // C
// 0x6f, // o
// 0x6e, // n
// 0x74, // t
// 0x72, // r
// 0x6f, // o
// 0x6c, // l
// 0x6c, // l
// 0x65, // e
// 0x72, // r
// 0x3b, // ;
0x01, // 878
0x00, // 879
0x0c, // 880
0x6d, // m 881
0x61, // a 882
0x6b, // k 883
0x65, // e 884
0x4e, // N 885
0x6f, // o 886
0x6e, // n 887
0x46, // F 888
0x69, // i 889
0x6e, // n 890
0x61, // a 891
0x6c, // l 892
0x01, // 893
0x00, // 894
0x1c, // 895
0x28, // ( 896
0x4c, // L 897
0x6a, // j 898
0x61, // a 899
0x76, // v 900
0x61, // a 901
0x2f, // / 902
0x6c, // l 903
0x61, // a 904
0x6e, // n 905
0x67, // g 906
0x2f, // / 907
0x72, // r 908
0x65, // e 909
0x66, // f 910
0x6c, // l 911
0x65, // e 912
0x63, // c 913
0x74, // t 914
0x2f, // / 915
0x46, // F 916
0x69, // i 917
0x65, // e 918
0x6c, // l 919
0x64, // d 920
0x3b, // ; 921
0x29, // ) 922
0x56, // V 923
0x0a, // 924
0x00, // 925
0x0c, // 926
0x00, // 927
0x3d, // = 928
0x0c, // 929
0x00, // 930
0x3e, // > 931
0x00, // 932
0x3f, // ? 933
0x01, // 934
0x00, // 935
0x0c, // 936
0x67, // g 937
0x65, // e 938
0x74, // t 939
0x4d, // M 940
0x6f, // o 941
0x64, // d 942
0x69, // i 943
0x66, // f 944
0x69, // i 945
0x65, // e 946
0x72, // r 947
0x73, // s 948
0x01, // 949
0x00, // 950
0x03, // 951
0x28, // ( 952
0x29, // ) 953
0x49, // I 954
0x0a, // 955
0x00, // 956
0x41, // A 957
0x00, // 958
0x43, // C 959
0x07, // 960
0x00, // 961
0x42, // B 962
0x01, // 963
0x00, // 964
0x1a, // 965
0x6a, // j 966
0x61, // a 967
0x76, // v 968
0x61, // a 969
0x2f, // / 970
0x6c, // l 971
0x61, // a 972
0x6e, // n 973
0x67, // g 974
0x2f, // / 975
0x72, // r 976
0x65, // e 977
0x66, // f 978
0x6c, // l 979
0x65, // e 980
0x63, // c 981
0x74, // t 982
0x2f, // / 983
0x4d, // M 984
0x6f, // o 985
0x64, // d 986
0x69, // i 987
0x66, // f 988
0x69, // i 989
0x65, // e 990
0x72, // r 991
0x0c, // 992
0x00, // 993
0x44, // D 994
0x00, // 995
0x45, // E 996
0x01, // 997
0x00, // 998
0x07, // 999
0x69, // i 1000
0x73, // s 1001
0x46, // F 1002
0x69, // i 1003
0x6e, // n 1004
0x61, // a 1005
0x6c, // l 1006
0x01, // 1007
0x00, // 1008
0x04, // 1009
0x28, // ( 1010
0x49, // I 1011
0x29, // ) 1012
0x5a, // Z 1013
0x0a, // 1014
0x00, // 1015
0x47, // G 1016
0x00, // 1017
0x49, // I 1018
0x07, // 1019
0x00, // 1020
0x48, // H 1021
0x01, // 1022
0x00, // 1023
0x1a, // 1024
0x6a, // j 1025
0x61, // a 1026
0x76, // v 1027
0x61, // a 1028
0x2f, // / 1029
0x6c, // l 1030
0x61, // a 1031
0x6e, // n 1032
0x67, // g 1033
0x2f, // / 1034
0x69, // i 1035
0x6e, // n 1036
0x76, // v 1037
0x6f, // o 1038
0x6b, // k 1039
0x65, // e 1040
0x2f, // / 1041
0x56, // V 1042
0x61, // a 1043
0x72, // r 1044
0x48, // H 1045
0x61, // a 1046
0x6e, // n 1047
0x64, // d 1048
0x6c, // l 1049
0x65, // e 1050
0x0c, // 1051
0x00, // 1052
0x4a, // J 1053
0x00, // 1054
0x4b, // K 1055
0x01, // 1056
0x00, // 1057
0x03, // 1058
0x73, // s 1059
0x65, // e 1060
0x74, // t 1061
0x01, // 1062
0x00, // 1063
0x1d, // 1064
0x28, // ( 1065
0x4c, // L 1066
0x6a, // j 1067
0x61, // a 1068
0x76, // v 1069
0x61, // a 1070
0x2f, // / 1071
0x6c, // l 1072
0x61, // a 1073
0x6e, // n 1074
0x67, // g 1075
0x2f, // / 1076
0x72, // r 1077
0x65, // e 1078
0x66, // f 1079
0x6c, // l 1080
0x65, // e 1081
0x63, // c 1082
0x74, // t 1083
0x2f, // / 1084
0x46, // F 1085
0x69, // i 1086
0x65, // e 1087
0x6c, // l 1088
0x64, // d 1089
0x3b, // ; 1090
0x49, // I 1091
0x29, // ) 1092
0x56, // V 1093
0x01, // 1094
0x00, // 1095
0x05, // 1096
0x66, // f 1097
0x69, // i 1098
0x65, // e 1099
0x6c, // l 1100
0x64, // d 1101
0x01, // 1102
0x00, // 1103
0x19, // 1104
0x4c, // L 1105
0x6a, // j 1106
0x61, // a 1107
0x76, // v 1108
0x61, // a 1109
0x2f, // / 1110
0x6c, // l 1111
0x61, // a 1112
0x6e, // n 1113
0x67, // g 1114
0x2f, // / 1115
0x72, // r 1116
0x65, // e 1117
0x66, // f 1118
0x6c, // l 1119
0x65, // e 1120
0x63, // c 1121
0x74, // t 1122
0x2f, // / 1123
0x46, // F 1124
0x69, // i 1125
0x65, // e 1126
0x6c, // l 1127
0x64, // d 1128
0x3b, // ; 1129
0x01, // 1130
0x00, // 1131
0x04, // 1132
0x6d, // m 1133
0x6f, // o 1134
0x64, // d 1135
0x73, // s 1136
0x01, // 1137
0x00, // 1138
0x01, // 1139
0x49, // I 1140
0x01, // 1141
0x00, // 1142
0x06, // 1143
0x61, // a 1144
0x63, // c 1145
0x63, // c 1146
0x65, // e 1147
0x70, // p 1148
0x74, // t 1149
0x01, // 1150
0x00, // 1151
0x27, // ' 1152
0x28, // ( 1153
0x4c, // L 1154
0x6a, // j 1155
0x61, // a 1156
0x76, // v 1157
0x61, // a 1158
0x2f, // / 1159
0x6c, // l 1160
0x61, // a 1161
0x6e, // n 1162
0x67, // g 1163
0x2f, // / 1164
0x72, // r 1165
0x65, // e 1166
0x66, // f 1167
0x6c, // l 1168
0x65, // e 1169
0x63, // c 1170
0x74, // t 1171
0x2f, // / 1172
0x41, // A 1173
0x63, // c 1174
0x63, // c 1175
0x65, // e 1176
0x73, // s 1177
0x73, // s 1178
0x69, // i 1179
0x62, // b 1180
0x6c, // l 1181
0x65, // e 1182
0x4f, // O 1183
0x62, // b 1184
0x6a, // j 1185
0x65, // e 1186
0x63, // c 1187
0x74, // t 1188
0x3b, // ; 1189
0x29, // ) 1190
0x56, // V 1191
0x0a, // 1192
0x00, // 1193
0x53, // S 1194
0x00, // 1195
0x55, // U 1196
0x07, // 1197
0x00, // 1198
0x54, // T 1199
0x01, // 1200
0x00, // 1201
0x22, // " 1202
0x6a, // j 1203
0x61, // a 1204
0x76, // v 1205
0x61, // a 1206
0x2f, // / 1207
0x6c, // l 1208
0x61, // a 1209
0x6e, // n 1210
0x67, // g 1211
0x2f, // / 1212
0x72, // r 1213
0x65, // e 1214
0x66, // f 1215
0x6c, // l 1216
0x65, // e 1217
0x63, // c 1218
0x74, // t 1219
0x2f, // / 1220
0x41, // A 1221
0x63, // c 1222
0x63, // c 1223
0x65, // e 1224
0x73, // s 1225
0x73, // s 1226
0x69, // i 1227
0x62, // b 1228
0x6c, // l 1229
0x65, // e 1230
0x4f, // O 1231
0x62, // b 1232
0x6a, // j 1233
0x65, // e 1234
0x63, // c 1235
0x74, // t 1236
0x0c, // 1237
0x00, // 1238
0x56, // V 1239
0x00, // 1240
0x57, // W 1241
0x01, // 1242
0x00, // 1243
0x0d, // 1244
0x73, // s 1245
0x65, // e 1246
0x74, // t 1247
0x41, // A 1248
0x63, // c 1249
0x63, // c 1250
0x65, // e 1251
0x73, // s 1252
0x73, // s 1253
0x69, // i 1254
0x62, // b 1255
0x6c, // l 1256
0x65, // e 1257
0x01, // 1258
0x00, // 1259
0x04, // 1260
0x28, // ( 1261
0x5a, // Z 1262
0x29, // ) 1263
0x56, // V 1264
0x0a, // 1265
0x00, // 1266
0x01, // 1267
0x00, // 1268
0x59, // Y 1269
0x0c, // 1270
0x00, // 1271
0x3a, // : 1272
0x00, // 1273
0x3b, // ; 1274
0x01, // 1275
0x00, // 1276
0x10, // 1277
0x61, // a 1278
0x63, // c 1279
0x63, // c 1280
0x65, // e 1281
0x73, // s 1282
0x73, // s 1283
0x69, // i 1284
0x62, // b 1285
0x6c, // l 1286
0x65, // e 1287
0x4f, // O 1288
0x62, // b 1289
0x6a, // j 1290
0x65, // e 1291
0x63, // c 1292
0x74, // t 1293
0x01, // 1294
0x00, // 1295
0x24, // $ 1296
0x4c, // L 1297
0x6a, // j 1298
0x61, // a 1299
0x76, // v 1300
0x61, // a 1301
0x2f, // / 1302
0x6c, // l 1303
0x61, // a 1304
0x6e, // n 1305
0x67, // g 1306
0x2f, // / 1307
0x72, // r 1308
0x65, // e 1309
0x66, // f 1310
0x6c, // l 1311
0x65, // e 1312
0x63, // c 1313
0x74, // t 1314
0x2f, // / 1315
0x41, // A 1316
0x63, // c 1317
0x63, // c 1318
0x65, // e 1319
0x73, // s 1320
0x73, // s 1321
0x69, // i 1322
0x62, // b 1323
0x6c, // l 1324
0x65, // e 1325
0x4f, // O 1326
0x62, // b 1327
0x6a, // j 1328
0x65, // e 1329
0x63, // c 1330
0x74, // t 1331
0x3b, // ; 1332
0x01, // 1333
0x00, // 1334
0x15, // 1335
0x28, // ( 1336
0x4c, // L 1337
0x6a, // j 1338
0x61, // a 1339
0x76, // v 1340
0x61, // a 1341
0x2f, // / 1342
0x6c, // l 1343
0x61, // a 1344
0x6e, // n 1345
0x67, // g 1346
0x2f, // / 1347
0x4f, // O 1348
0x62, // b 1349
0x6a, // j 1350
0x65, // e 1351
0x63, // c 1352
0x74, // t 1353
0x3b, // ; 1354
0x29, // ) 1355
0x56, // V 1356
0x0a, // 1357
0x00, // 1358
0x01, // 1359
0x00, // 1360
0x5e, // ^ 1361
0x0c, // 1362
0x00, // 1363
0x50, // P 1364
0x00, // 1365
0x51, // Q 1366
0x01, // 1367
0x00, // 1368
0x0a, // 1369
0x53, // S 1370
0x6f, // o 1371
0x75, // u 1372
0x72, // r 1373
0x63, // c 1374
0x65, // e 1375
0x46, // F 1376
0x69, // i 1377
0x6c, // l 1378
0x65, // e 1379
0x01, // 1380
0x00, // 1381
0x0f, // 1382
0x41, // A 1383
0x63, // c 1384
0x63, // c 1385
0x65, // e 1386
0x73, // s 1387
0x73, // s 1388
0x55, // U 1389
0x74, // t 1390
0x69, // i 1391
0x6c, // l 1392
0x2e, // . 1393
0x6a, // j 1394
0x61, // a 1395
0x76, // v 1396
0x61, // a 1397
0x01, // 1398
0x00, // 1399
0x09, // 1400
0x53, // S 1401
0x69, // i 1402
0x67, // g 1403
0x6e, // n 1404
0x61, // a 1405
0x74, // t 1406
0x75, // u 1407
0x72, // r 1408
0x65, // e 1409
0x01, // 1410
0x00, // 1411
0x55, // U 1412
0x4c, // L 1413
0x6a, // j 1414
0x61, // a 1415
0x76, // v 1416
0x61, // a 1417
0x2f, // / 1418
0x6c, // l 1419
0x61, // a 1420
0x6e, // n 1421
0x67, // g 1422
0x2f, // / 1423
0x4f, // O 1424
0x62, // b 1425
0x6a, // j 1426
0x65, // e 1427
0x63, // c 1428
0x74, // t 1429
0x3b, // ; 1430
0x4c, // L 1431
0x6a, // j 1432
0x61, // a 1433
0x76, // v 1434
0x61, // a 1435
0x2f, // / 1436
0x75, // u 1437
0x74, // t 1438
0x69, // i 1439
0x6c, // l 1440
0x2f, // / 1441
0x66, // f 1442
0x75, // u 1443
0x6e, // n 1444
0x63, // c 1445
0x74, // t 1446
0x69, // i 1447
0x6f, // o 1448
0x6e, // n 1449
0x2f, // / 1450
0x43, // C 1451
0x6f, // o 1452
0x6e, // n 1453
0x73, // s 1454
0x75, // u 1455
0x6d, // m 1456
0x65, // e 1457
0x72, // r 1458
0x3c, // < 1459
0x4c, // L 1460
0x6a, // j 1461
0x61, // a 1462
0x76, // v 1463
0x61, // a 1464
0x2f, // / 1465
0x6c, // l 1466
0x61, // a 1467
0x6e, // n 1468
0x67, // g 1469
0x2f, // / 1470
0x72, // r 1471
0x65, // e 1472
0x66, // f 1473
0x6c, // l 1474
0x65, // e 1475
0x63, // c 1476
0x74, // t 1477
0x2f, // / 1478
0x41, // A 1479
0x63, // c 1480
0x63, // c 1481
0x65, // e 1482
0x73, // s 1483
0x73, // s 1484
0x69, // i 1485
0x62, // b 1486
0x6c, // l 1487
0x65, // e 1488
0x4f, // O 1489
0x62, // b 1490
0x6a, // j 1491
0x65, // e 1492
0x63, // c 1493
0x74, // t 1494
0x3b, // ; 1495
0x3e, // > 1496
0x3b, // ; 1497
0x01, // 1498
0x00, // 1499
0x0c, // 1500
0x49, // I 1501
0x6e, // n 1502
0x6e, // n 1503
0x65, // e 1504
0x72, // r 1505
0x43, // C 1506
0x6c, // l 1507
0x61, // a 1508
0x73, // s 1509
0x73, // s 1510
0x65, // e 1511
0x73, // s 1512
0x01, // 1513
0x00, // 1514
0x06, // 1515
0x4c, // L 1516
0x6f, // o 1517
0x6f, // o 1518
0x6b, // k 1519
0x75, // u 1520
0x70, // p 1521
0x00, // 1522
0x20, // 1523
0x00, // 1524
0x01, // 1525
0x00, // 1526
0x03, // 1527
0x00, // 1528
0x01, // 1529
0x00, // 1530
0x05, // 1531
0x00, // 1532
0x01, // 1533
0x00, // 1534
0x1a, // 1535
0x00, // 1536
0x07, // 1537
0x00, // 1538
0x08, // 1539
0x00, // 1540
0x00, // 1541
0x00, // 1542
0x05, // 1543
0x00, // 1544
0x08, // 1545
0x00, // 1546
0x09, // 1547
0x00, // 1548
0x0a, // 1549
0x00, // 1550
0x01, // 1551
0x00, // 1552
0x0b, // 1553
0x00, // 1554
0x00, // 1555
0x00, // 1556
0x7e, // ~ 1557
0x00, // 1558
0x04, // 1559
0x00, // 1560
0x01, // 1561
0x00, // 1562
0x00, // 1563
0x00, // 1564
0x25, // % 1565
0x12, // 1566
0x0c, // 1567
(byte)0xb8, // 1568
0x00, // 1569
0x0e, // 1570
(byte)0xb8, // 1571
0x00, // 1572
0x14, // 1573
0x4b, // K 1574
0x2a, // * 1575
0x12, // 1576
0x0c, // 1577
0x12, // 1578
0x18, // 1579
(byte)0xb2, // 1580
0x00, // 1581
0x1a, // 1582
(byte)0xb6, // 1583
0x00, // 1584
0x20, // 1585
(byte)0xb3, // 1586
0x00, // 1587
0x26, // & 1588
(byte)0xa7, // 1589
0x00, // 1590
0x0d, // 1591
0x4b, // K 1592
(byte)0xbb, // 1593
0x00, // 1594
0x28, // ( 1595
0x59, // Y 1596
0x2a, // * 1597
(byte)0xb7, // 1598
0x00, // 1599
0x2a, // * 1600
(byte)0xbf, // 1601
(byte)0xb1, // 1602
0x00, // 1603
0x01, // 1604
0x00, // 1605
0x00, // 1606
0x00, // 1607
0x17, // 1608
0x00, // 1609
0x1a, // 1610
0x00, // 1611
0x2e, // . 1612
0x00, // 1613
0x03, // 1614
0x00, // 1615
0x30, // 0 1616
0x00, // 1617
0x00, // 1618
0x00, // 1619
0x16, // 1620
0x00, // 1621
0x05, // 1622
0x00, // 1623
0x00, // 1624
0x04, // 1625
(byte)0x85, // 1626
0x00, // 1627
0x09, // 1628
0x04, // 1629
(byte)0x86, // 1630
0x00, // 1631
0x17, // 1632
0x04, // 1633
(byte)0x87, // 1634
0x00, // 1635
0x1b, // 1636
0x04, // 1637
(byte)0x88, // 1638
0x00, // 1639
0x24, // $ 1640
0x04, // 1641
(byte)0x8a, // 1642
0x00, // 1643
0x31, // 1 1644
0x00, // 1645
0x00, // 1646
0x00, // 1647
0x16, // 1648
0x00, // 1649
0x02, // 1650
0x00, // 1651
0x09, // 1652
0x00, // 1653
0x0e, // 1654
0x00, // 1655
0x12, // 1656
0x00, // 1657
0x32, // 2 1658
0x00, // 1659
0x00, // 1660
0x00, // 1661
0x1b, // 1662
0x00, // 1663
0x09, // 1664
0x00, // 1665
0x33, // 3 1666
0x00, // 1667
0x34, // 4 1668
0x00, // 1669
0x00, // 1670
0x00, // 1671
0x35, // 5 1672
0x00, // 1673
0x00, // 1674
0x00, // 1675
0x07, // 1676
0x00, // 1677
0x02, // 1678
0x5a, // Z 1679
0x07, // 1680
0x00, // 1681
0x2e, // . 1682
0x09, // 1683
0x00, // 1684
0x00, // 1685
0x00, // 1686
0x2c, // , 1687
0x00, // 1688
0x0a, // 1689
0x00, // 1690
0x01, // 1691
0x00, // 1692
0x0b, // 1693
0x00, // 1694
0x00, // 1695
0x00, // 1696
0x2f, // / 1697
0x00, // 1698
0x01, // 1699
0x00, // 1700
0x01, // 1701
0x00, // 1702
0x00, // 1703
0x00, // 1704
0x05, // 1705
0x2a, // * 1706
(byte)0xb7, // 1707
0x00, // 1708
0x36, // 6 1709
(byte)0xb1, // 1710
0x00, // 1711
0x00, // 1712
0x00, // 1713
0x02, // 1714
0x00, // 1715
0x30, // 0 1716
0x00, // 1717
0x00, // 1718
0x00, // 1719
0x06, // 1720
0x00, // 1721
0x01, // 1722
0x00, // 1723
0x00, // 1724
0x04, // 1725
(byte)0x80, // 1726
0x00, // 1727
0x31, // 1 1728
0x00, // 1729
0x00, // 1730
0x00, // 1731
0x0c, // 1732
0x00, // 1733
0x01, // 1734
0x00, // 1735
0x00, // 1736
0x00, // 1737
0x05, // 1738
0x00, // 1739
0x38, // 8 1740
0x00, // 1741
0x39, // 9 1742
0x00, // 1743
0x00, // 1744
0x00, // 1745
0x09, // 1746
0x00, // 1747
0x3a, // : 1748
0x00, // 1749
0x3b, // ; 1750
0x00, // 1751
0x01, // 1752
0x00, // 1753
0x0b, // 1754
0x00, // 1755
0x00, // 1756
0x00, // 1757
0x64, // d 1758
0x00, // 1759
0x04, // 1760
0x00, // 1761
0x02, // 1762
0x00, // 1763
0x00, // 1764
0x00, // 1765
0x18, // 1766
0x2a, // * 1767
(byte)0xb6, // 1768
0x00, // 1769
0x3c, // < 1770
0x3c, // < 1771
0x1b, // 1772
(byte)0xb8, // 1773
0x00, // 1774
0x40, // @ 1775
(byte)0x99, // 1776
0x00, // 1777
0x0e, // 1778
(byte)0xb2, // 1779
0x00, // 1780
0x26, // & 1781
0x2a, // * 1782
0x1b, // 1783
0x10, // 1784
(byte)0xef, // 1785
0x7e, // ~ 1786
(byte)0xb6, // 1787
0x00, // 1788
0x46, // F 1789
(byte)0xb1, // 1790
0x00, // 1791
0x00, // 1792
0x00, // 1793
0x03, // 1794
0x00, // 1795
0x30, // 0 1796
0x00, // 1797
0x00, // 1798
0x00, // 1799
0x12, // 1800
0x00, // 1801
0x04, // 1802
0x00, // 1803
0x00, // 1804
0x04, // 1805
(byte)0x8d, // 1806
0x00, // 1807
0x05, // 1808
0x04, // 1809
(byte)0x8e, // 1810
0x00, // 1811
0x0c, // 1812
0x04, // 1813
(byte)0x8f, // 1814
0x00, // 1815
0x17, // 1816
0x04, // 1817
(byte)0x91, // 1818
0x00, // 1819
0x31, // 1 1820
0x00, // 1821
0x00, // 1822
0x00, // 1823
0x16, // 1824
0x00, // 1825
0x02, // 1826
0x00, // 1827
0x00, // 1828
0x00, // 1829
0x18, // 1830
0x00, // 1831
0x4c, // L 1832
0x00, // 1833
0x4d, // M 1834
0x00, // 1835
0x00, // 1836
0x00, // 1837
0x05, // 1838
0x00, // 1839
0x13, // 1840
0x00, // 1841
0x4e, // N 1842
0x00, // 1843
0x4f, // O 1844
0x00, // 1845
0x01, // 1846
0x00, // 1847
0x35, // 5 1848
0x00, // 1849
0x00, // 1850
0x00, // 1851
0x06, // 1852
0x00, // 1853
0x01, // 1854
(byte)0xfc, // 1855
0x00, // 1856
0x17, // 1857
0x01, // 1858
0x00, // 1859
0x01, // 1860
0x00, // 1861
0x50, // P 1862
0x00, // 1863
0x51, // Q 1864
0x00, // 1865
0x01, // 1866
0x00, // 1867
0x0b, // 1868
0x00, // 1869
0x00, // 1870
0x00, // 1871
0x5d, // ] 1872
0x00, // 1873
0x02, // 1874
0x00, // 1875
0x02, // 1876
0x00, // 1877
0x00, // 1878
0x00, // 1879
0x14, // 1880
0x2b, // + 1881
0x04, // 1882
(byte)0xb6, // 1883
0x00, // 1884
0x52, // R 1885
0x2b, // + 1886
(byte)0xc1, // 1887
0x00, // 1888
0x0c, // 1889
(byte)0x99, // 1890
0x00, // 1891
0x0a, // 1892
0x2b, // + 1893
(byte)0xc0, // 1894
0x00, // 1895
0x0c, // 1896
(byte)0xb8, // 1897
0x00, // 1898
0x58, // X 1899
(byte)0xb1, // 1900
0x00, // 1901
0x00, // 1902
0x00, // 1903
0x03, // 1904
0x00, // 1905
0x30, // 0 1906
0x00, // 1907
0x00, // 1908
0x00, // 1909
0x12, // 1910
0x00, // 1911
0x04, // 1912
0x00, // 1913
0x00, // 1914
0x04, // 1915
(byte)0x95, // 1916
0x00, // 1917
0x05, // 1918
0x04, // 1919
(byte)0x96, // 1920
0x00, // 1921
0x0c, // 1922
0x04, // 1923
(byte)0x97, // 1924
0x00, // 1925
0x13, // 1926
0x04, // 1927
(byte)0x99, // 1928
0x00, // 1929
0x31, // 1 1930
0x00, // 1931
0x00, // 1932
0x00, // 1933
0x16, // 1934
0x00, // 1935
0x02, // 1936
0x00, // 1937
0x00, // 1938
0x00, // 1939
0x14, // 1940
0x00, // 1941
0x38, // 8 1942
0x00, // 1943
0x39, // 9 1944
0x00, // 1945
0x00, // 1946
0x00, // 1947
0x00, // 1948
0x00, // 1949
0x14, // 1950
0x00, // 1951
0x5a, // Z 1952
0x00, // 1953
0x5b, // [ 1954
0x00, // 1955
0x01, // 1956
0x00, // 1957
0x35, // 5 1958
0x00, // 1959
0x00, // 1960
0x00, // 1961
0x03, // 1962
0x00, // 1963
0x01, // 1964
0x13, // 1965
0x10, // 1966
0x41, // A 1967
0x00, // 1968
0x50, // P 1969
0x00, // 1970
0x5c, // \ 1971
0x00, // 1972
0x01, // 1973
0x00, // 1974
0x0b, // 1975
0x00, // 1976
0x00, // 1977
0x00, // 1978
0x29, // ) 1979
0x00, // 1980
0x02, // 1981
0x00, // 1982
0x02, // 1983
0x00, // 1984
0x00, // 1985
0x00, // 1986
0x09, // 1987
0x2a, // * 1988
0x2b, // + 1989
(byte)0xc0, // 1990
0x00, // 1991
0x53, // S 1992
(byte)0xb6, // 1993
0x00, // 1994
0x5d, // ] 1995
(byte)0xb1, // 1996
0x00, // 1997
0x00, // 1998
0x00, // 1999
0x02, // 2000
0x00, // 2001
0x30, // 0 2002
0x00, // 2003
0x00, // 2004
0x00, // 2005
0x06, // 2006
0x00, // 2007
0x01, // 2008
0x00, // 2009
0x00, // 2010
0x00, // 2011
0x01, // 2012
0x00, // 2013
0x31, // 1 2014
0x00, // 2015
0x00, // 2016
0x00, // 2017
0x02, // 2018
0x00, // 2019
0x00, // 2020
0x00, // 2021
0x03, // 2022
0x00, // 2023
0x5f, // _ 2024
0x00, // 2025
0x00, // 2026
0x00, // 2027
0x02, // 2028
0x00, // 2029
0x60, // ` 2030
0x00, // 2031
0x61, // a 2032
0x00, // 2033
0x00, // 2034
0x00, // 2035
0x02, // 2036
0x00, // 2037
0x62, // b 2038
0x00, // 2039
0x63, // c 2040
0x00, // 2041
0x00, // 2042
0x00, // 2043
0x0a, // 2044
0x00, // 2045
0x01, // 2046
0x00, // 2047
0x21, // ! 2048
0x00, // 2049
0x0f, // 2050
0x00, // 2051
0x64, // d 2052
0x00, // 2053
0x19, // 2054
};
private static final Object UNSAFE_INSTANCE;
private static final Method DEFINE_ANONYMOUS_CLASS_METHOD;
private static final Method ALLOCATE_INSTANCE_METHOD;
private static final Method CONSUMER_ACCEPT_METHOD;
static
{
Object unsafeInstance = null;
Method defineAnonymousClassMethod = null;
Method allocateInstanceMethod = null;
Method consumerAcceptMethod = null;
try
{
// InaccessibleObjectException is new to Java 9.
// If it can't be loaded we don't need any special support so we will drop out of this block and initialize the
// fields to null.
Class.forName("java.lang.reflect.InaccessibleObjectException");
// Use reflection on Unsafe to avoid having to compile against it.
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
Field theUnsafeField = unsafeClass.getDeclaredField("theUnsafe");
// Deep reflection is allowed on sun.misc package even for java 9.
theUnsafeField.setAccessible(true);
// Get the singleton from the static field.
unsafeInstance = theUnsafeField.get(null);
// We will use the Unsafe.defineAnonymousClass method to a create class that will be able to make an
// AccessibleObject accessible.
defineAnonymousClassMethod = unsafeClass.getMethod("defineAnonymousClass", Class.class, byte[].class, Object[].class);
allocateInstanceMethod = unsafeClass.getDeclaredMethod("allocateInstance", Class.class);
// We'd like to use Consumer directly but that's not available in the current BREE.
consumerAcceptMethod = Class.forName("java.util.function.Consumer").getMethod("accept", Object.class);
}
catch (Throwable throwable)
{
//$FALL-THROUGH$
//
// If the Unsafe class can't be loaded, then it must be unsupported and we won't be able to do anything special to
// support making members accessible.
// The static final fields will be initialized to null.
}
UNSAFE_INSTANCE = unsafeInstance;
DEFINE_ANONYMOUS_CLASS_METHOD = defineAnonymousClassMethod;
ALLOCATE_INSTANCE_METHOD = allocateInstanceMethod;
CONSUMER_ACCEPT_METHOD = consumerAcceptMethod;
}
private static final Map<String, Object> PACKAGE_ACCESSIBILITY_CONTROL_MAP = Collections.synchronizedMap(new HashMap<String, Object>());
private AccessUtil()
{
}
public static void setNonFinal(Field field)
{
if (UNSAFE_INSTANCE == null || !interalSetAccessible(field, Field.class))
{
try
{
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.setAccessible(true);
}
catch (RuntimeException ex)
{
throw ex;
}
catch (Exception ex)
{
throw WrappedException.wrap(ex);
}
}
}
public static void setAccessible(Field field)
{
if (UNSAFE_INSTANCE == null || !interalSetAccessible(field))
{
field.setAccessible(true);
}
}
public static void setAccessible(Method method)
{
if (UNSAFE_INSTANCE == null || !interalSetAccessible(method))
{
method.setAccessible(true);
}
}
public static void setAccessible(Constructor<?> constructor)
{
if (UNSAFE_INSTANCE == null || !interalSetAccessible(constructor))
{
constructor.setAccessible(true);
}
}
private static boolean interalSetAccessible(Member member)
{
// Get the declaring class' name to determine the package name.
Class<?> declaringClass = member.getDeclaringClass();
return interalSetAccessible(member, declaringClass);
}
private static boolean interalSetAccessible(Member member, Class<?> declaringClass)
{
try
{
String name = declaringClass.getName();
int lastDotIndex = name.lastIndexOf('.');
if (lastDotIndex == -1)
{
// There is no package name, so no need for special support.
// Instruct the caller to set accessibility in the normal way.
return false;
}
// Extract the package name.
String packageName = name.substring(0, lastDotIndex);
// If there is already an access controller instance created for
// this package...
Object accessController = PACKAGE_ACCESSIBILITY_CONTROL_MAP.get(packageName);
if (accessController == null)
{
// Convert the package name to to a path.
String packageNamePath = packageName.replace('.', '/');
// Build the class' name path.
String classNamePath = packageNamePath + "/AccessController";
// Build the class' signature.
String classSignature = "L" + packageNamePath + "/AccessController;";
// Convert the class name path to its UTF 8 bytes.
byte[] classNamePathBytes = classNamePath.getBytes("UTF-8");
int classNamePathBytesLength = classNamePathBytes.length;
// Convert the class signature to it's UTF 8 bytes.
byte[] classSignatureBytes = classSignature.getBytes("UTF-8");
int classSignatureBytesLength = classSignatureBytes.length;
// Create a bytes array big enough to hold all the template
// bytes as well as the bytes for the class name path and the
// class signature,
// including the 2 bytes used for the length of each of those.
byte[] bytes = new byte[ACCESS_CONTROLLER_BYTES.length + classNamePathBytesLength + classSignatureBytesLength + 4];
// Copy the initial template bytes.
System.arraycopy(ACCESS_CONTROLLER_BYTES, 0, bytes, 0, NAME_PATH_INDEX);
// Copy the bytes for the class name path's length followed by
// the UTF 8 bytes for the class name path to be after initial
// template bytes.
bytes[NAME_PATH_INDEX] = (byte)(classNamePathBytesLength >> 8);
bytes[NAME_PATH_INDEX + 1] = (byte)(classNamePathBytesLength & 0xFF);
System.arraycopy(classNamePathBytes, 0, bytes, NAME_PATH_INDEX + 2, classNamePathBytesLength);
// Copy the intervening template bytes to be after the end of
// the class name path bytes.
int index = NAME_PATH_INDEX + classNamePathBytesLength + 2;
System.arraycopy(ACCESS_CONTROLLER_BYTES, NAME_PATH_INDEX, bytes, index, NAME_SIGNATURE_INDEX - NAME_PATH_INDEX);
// Compute the index for the point after the intervening
// template bytes.
index += NAME_SIGNATURE_INDEX - NAME_PATH_INDEX;
// Copy the bytes for the class signature's length followed by
// the UTF 8 bytes for the class signature.
bytes[index] = (byte)(classSignatureBytesLength >> 8);
bytes[++index] = (byte)(classSignatureBytesLength & 0xFF);
System.arraycopy(classSignatureBytes, 0, bytes, ++index, classSignatureBytesLength);
// Copy the trailing template bytes.
index += classSignatureBytesLength;
System.arraycopy(ACCESS_CONTROLLER_BYTES, NAME_SIGNATURE_INDEX, bytes, index, ACCESS_CONTROLLER_BYTES.length - NAME_SIGNATURE_INDEX);
// Define an anonymous class in the declaring class' package
// using the computed class bytes.
Class<?> theAnonymousClass = (Class<?>)DEFINE_ANONYMOUS_CLASS_METHOD.invoke(UNSAFE_INSTANCE, declaringClass, bytes, null);
// Because the template bytes were computed class local to this
// file, the class isn't public and we're not allowed by Java 9
// to create an instance in the normal way.
// So we create an instance without calling the constructor.
Object newAccessController = ALLOCATE_INSTANCE_METHOD.invoke(UNSAFE_INSTANCE, theAnonymousClass);
// Cache this access controller instance for subsequent reuse.
PACKAGE_ACCESSIBILITY_CONTROL_MAP.put(packageName, newAccessController);
// Set the access controller to use.
accessController = newAccessController;
}
// Use that instance to set the accessibility.
CONSUMER_ACCEPT_METHOD.invoke(accessController, member);
// We don't want the caller to set the accessibility in the normal way.
return true;
}
catch (IOException ex)
{
throw new RuntimeException(ex);
}
catch (IllegalAccessException ex)
{
throw new RuntimeException(ex);
}
catch (IllegalArgumentException ex)
{
throw new RuntimeException(ex);
}
catch (InvocationTargetException ex)
{
throw new RuntimeException(ex);
}
catch (SecurityException ex)
{
throw new RuntimeException(ex);
}
}
/**
* This method invokes the generator.
* You must uncomment the two classes in this file below for this method to find the generator class and to generate the declarations used at the start of this class.
* The results printed on the console can be copied to replace the three constants at the start of this class.
* This must be done by compiling against Java 9 or higher so you'll have to temporarily increase the Java version for this project.
*
* @see #NAME_PATH_INDEX
* @see #NAME_SIGNATURE_INDEX
* @see #ACCESS_CONTROLLER_BYTES
*/
public static void main(String[] args) throws Exception
{
Class<?> classBytesGeneratorClass = Class.forName(AccessUtil.class.getName().replace(AccessUtil.class.getSimpleName(), "ClassBytesGenerator"));
classBytesGeneratorClass.getMethod("generate").invoke(null);
}
}
// Disable the formatter for the remainder of this file.
// @formatter:off
/*
* class ClassBytesGenerator { public static void generate() { generate(AccessController.class); } private static void
* generate(Class<?> targetClass) { String name = targetClass.getName(); StringBuilder builder = new StringBuilder();
* java.net.URL resource = targetClass.getResource(name.substring(name.lastIndexOf('.') + 1) + ".class"); try {
* java.io.InputStream input = resource.openStream(); for (int value = input.read(); value != -1; value = input.read())
* { builder.append((char)value); } input.close(); String namePath = name.replace('.', '/'); String nameSignature = 'L'
* + namePath + ';'; int namePathIndex = builder.indexOf(namePath); int nameSignatureIndex =
* builder.indexOf(nameSignature); int namePathStart = namePathIndex - 2; int namePathEnd = namePathIndex +
* namePath.length(); int nameSignatureStart = nameSignatureIndex - 2; int nameSignatureEnd = nameSignatureIndex +
* +nameSignature.length(); System.out.println("private static final int NAME_PATH_INDEX = " + namePathStart + ";");
* System.out.println("private static final int NAME_SIGNATURE_INDEX = " + (nameSignatureStart - (namePathEnd -
* namePathStart)) + ";"); System.out.println("private static final byte[] ACCESS_CONTROLLER_BYTES = new byte[]");
* System.out.println(" { //"); for (int i = 0, length = builder.length(), count = 0; i < length; ++i) { int value =
* builder.charAt(i); System.out.print(" "); boolean exclude = i >= namePathStart && i < namePathEnd || i >=
* nameSignatureStart && i < nameSignatureEnd; if (exclude) { System.out.print("// 0x"); } else { ++count; if (value >
* 127) { System.out.print("(byte)"); } System.out.print("0x"); } String hexString =
* Integer.toHexString(Byte.toUnsignedInt((byte)value)); if (hexString.length() == 1) { System.out.print('0'); }
* System.out.print(hexString); System.out.print(", //"); if (value > 32 && value < 128) { System.out.print(' ');
* System.out.print((char)value); } if (!exclude) { System.out.print(" " + (count - 1)); } System.out.println(); }
* System.out.println(" };"); } catch (IOException ex) { ex.printStackTrace(); } } } class AccessController implements
* Consumer<AccessibleObject> { private static final VarHandle MODIFIERS; static { try { Lookup lookup =
* MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup()); MODIFIERS = lookup.findVarHandle(Field.class,
* "modifiers", int.class); } catch (Throwable ex) { throw new RuntimeException(ex); } } public static void
* makeNonFinal(Field field) { int mods = field.getModifiers(); if (Modifier.isFinal(mods)) { MODIFIERS.set(field, mods
* & ~Modifier.FINAL); } }
* @Override public void accept(AccessibleObject accessibleObject) { accessibleObject.setAccessible(true); if
* (accessibleObject instanceof Field) { makeNonFinal((Field)accessibleObject); } } } //
*/