Initial commit

This commit is contained in:
DataHoarder 2023-10-06 09:01:01 +02:00
commit ae683087bb
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
29 changed files with 2697 additions and 0 deletions

19
LICENSE Normal file
View file

@ -0,0 +1,19 @@
Copyright (c) 2023 WeebDataHoarder, PhytonUtils Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

38
README.md Normal file
View file

@ -0,0 +1,38 @@
# Phyton Utils
These are utilities and documentation for devices commonly released by [Phyton / Фитон](https://www.phyton.ru/), [AlmaCode](https://almacode.ru/), [AngioCode](https://angiocode.ru/), [RadiaCode](https://www.radiacode.com/);
a group of Russian companies that provide embedded devices for healthcare, industrial and military applications.
Most of their products, software or hardware, are undocumented and/or heavily obfuscated, encrypted, or worse.
These utilities allow researchers to inspect the devices and work with them directly, allowing, between others:
* Decoding of Firmware files, both `Phyton` format and `AlmaCode` format
* Decryption of Firmware Blocks
* Encryption of Firmware Blocks
* Decompression of Custom compressed data
* Compression to Custom compressed data
* Calculate custom CRC of data
* Decryption of device Memory dumps
* Custom Firmware files
* Device debugging, repair, unbricking
* Decode `RD_FLASH_AREA` messages
### Disclaimers
Note this repository does not include code to communicate with devices via either USB or Bluetooth.
Other projects are available for that purpose.
All information and data in this repository was produced without physical disassembly of devices,
using publicly available information, files and software.
### Tested devices and firmwares
* RadiaCode RC-102
## Documentation
Some items have been written in text form. For others, please refer to the source code.
* [Encryption notes](doc/ENCRYPTION.md)
* [Compression notes](doc/COMPRESSION.md)
* [Firmware notes](doc/FIRMWARE.md)
* [CRC notes](doc/CRC.md)

230
buffer/buffer.go Normal file
View file

@ -0,0 +1,230 @@
package buffer
import (
"encoding/binary"
"io"
"math"
)
type Buffer []byte
func (b *Buffer) ReadByte() (uint8, error) {
if len(*b) == 0 {
return 0, io.EOF
}
defer func() {
*b = (*b)[1:]
}()
return (*b)[0], nil
}
func (b *Buffer) Read(buf []byte) (int, error) {
if len(*b) == 0 {
return 0, io.EOF
}
if len(*b) < len(buf) {
defer func() {
*b = nil
}()
copy(buf, *b)
return len(*b), io.ErrUnexpectedEOF
}
defer func() {
*b = (*b)[len(buf):]
}()
copy(buf, *b)
return len(buf), nil
}
func (b *Buffer) Skip(n int) error {
if len(*b) == 0 {
return io.EOF
}
if len(*b) < n {
return io.ErrUnexpectedEOF
}
*b = (*b)[n:]
return nil
}
func (b *Buffer) ReadInt32() (int32, error) {
var buf [4]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return int32(binary.LittleEndian.Uint32(buf[:])), nil
}
func (b *Buffer) ReadUint32() (uint32, error) {
var buf [4]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return binary.LittleEndian.Uint32(buf[:]), nil
}
func (b *Buffer) ReadUint32BE() (uint32, error) {
var buf [4]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return binary.BigEndian.Uint32(buf[:]), nil
}
func (b *Buffer) ReadFloat32() (float32, error) {
var buf [4]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return math.Float32frombits(binary.LittleEndian.Uint32(buf[:])), nil
}
func (b *Buffer) ReadInt16() (int16, error) {
var buf [2]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return int16(binary.LittleEndian.Uint16(buf[:])), nil
}
func (b *Buffer) ReadUint16() (uint16, error) {
var buf [2]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return binary.LittleEndian.Uint16(buf[:]), nil
}
func (b *Buffer) ReadUint16BE() (uint16, error) {
var buf [2]byte
_, err := io.ReadFull(b, buf[:])
if err != nil {
return 0, err
}
return binary.BigEndian.Uint16(buf[:]), nil
}
func (b *Buffer) ReadBytes() ([]byte, error) {
l, err := b.ReadByte()
if err != nil {
return nil, err
}
buf := make([]byte, l)
_, err = io.ReadFull(b, buf[:])
if err != nil {
return nil, err
}
return buf, nil
}
func (b *Buffer) ReadString() (string, error) {
buf, err := b.ReadBytes()
if err != nil {
return "", err
}
return string(buf), nil
}
type PanicBuffer []byte
func (b *PanicBuffer) ReadByte() uint8 {
v, err := (*Buffer)(b).ReadByte()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) Read(buf []byte) int {
v, err := (*Buffer)(b).Read(buf)
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) Skip(n int) {
err := (*Buffer)(b).Skip(n)
if err != nil {
panic(err)
}
}
func (b *PanicBuffer) ReadInt32() int32 {
v, err := (*Buffer)(b).ReadInt32()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadUint32() uint32 {
v, err := (*Buffer)(b).ReadUint32()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadUint32BE() uint32 {
v, err := (*Buffer)(b).ReadUint32BE()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadFloat32() float32 {
v, err := (*Buffer)(b).ReadFloat32()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadInt16() int16 {
v, err := (*Buffer)(b).ReadInt16()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadUint16() uint16 {
v, err := (*Buffer)(b).ReadUint16()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadUint16BE() uint16 {
v, err := (*Buffer)(b).ReadUint16BE()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadBytes() []byte {
v, err := (*Buffer)(b).ReadBytes()
if err != nil {
panic(err)
}
return v
}
func (b *PanicBuffer) ReadString() string {
v, err := (*Buffer)(b).ReadString()
if err != nil {
panic(err)
}
return v
}

68
compression/compress.go Normal file
View file

@ -0,0 +1,68 @@
package compression
import (
"bytes"
"errors"
"github.com/icza/bitio"
)
func FirmwareBlockCompress(data []byte, exhaustive bool) (output []byte, err error) {
if len(data) == 0 {
return nil, nil
}
if len(data) > DataMaxSize {
return nil, errors.New("out of bounds input")
}
windowIndex := WindowInitialIndex
window := CreateWindow()
outputBuffer := bytes.NewBuffer(make([]byte, 0, DataMaxSize))
w := bitio.NewWriter(outputBuffer)
for len(data) > 0 {
// Find maximum pattern in window
offsetIndex, length := window.Find(windowIndex, data, exhaustive)
if offsetIndex != -1 {
// write false for not encoding a literal
if err = w.WriteBool(false); err != nil {
return nil, err
}
// write index in table
if err = w.WriteBits(uint64(offsetIndex), OffsetBits); err != nil {
return nil, err
}
// write size of match
if err = w.WriteBits(uint64(length-MaxUncoded), LengthBits); err != nil {
return nil, err
}
windowIndex = window.Set(windowIndex, data[:length])
data = data[length:]
} else {
// write true for encoding a literal
if err = w.WriteBool(true); err != nil {
return nil, err
}
literal := data[0]
data = data[1:]
windowIndex = window.SetByte(windowIndex, literal)
// Write literal value
if err = w.WriteBits(uint64(literal), LiteralBits); err != nil {
return nil, err
}
}
}
if err = w.Close(); err != nil {
return nil, err
}
return outputBuffer.Bytes(), nil
}

23
compression/constants.go Normal file
View file

@ -0,0 +1,23 @@
package compression
const DataMaxSize = 0x8000
const LiteralBits = 8
// OffsetBits Number of bits for the Window offset. From this the WindowSize will be calculated
// In other LZSS implementations, this is usually set to 12
const OffsetBits = 11
const LengthBits = 4
const WindowSize = 1 << OffsetBits
const MaxUncoded = 2
const MaxCoded = MaxUncoded + (1 << LengthBits)
// WindowInitialIndex The windowIndex needs to be set to this before compression/decompression
// In other LZSS implementations, this is usually set to 0
const WindowInitialIndex = WindowSize - 0x10 - 1
// WindowFillValue Initial value to fill Window[0 : WindowInitialIndex]
// In other LZSS implementations, this is usually set to 0x20, but Window[] is filled entirely
const WindowFillValue = 0x20

54
compression/decompress.go Normal file
View file

@ -0,0 +1,54 @@
package compression
import (
"bytes"
"errors"
"github.com/icza/bitio"
)
func FirmwareBlockDecompress(data []byte) (output []byte, err error) {
windowIndex := WindowInitialIndex
output = make([]byte, 0, DataMaxSize)
window := CreateWindow()
windowBuffer := make([]byte, len(window))
r := bitio.NewReader(bytes.NewReader(data))
var buf []byte
var isLiteral bool
var length, literal, offsetIndex uint64
for {
if isLiteral, err = r.ReadBool(); err != nil {
break
}
if !isLiteral {
if offsetIndex, err = r.ReadBits(OffsetBits); err != nil {
break
} else if length, err = r.ReadBits(LengthBits); err != nil {
return nil, err
} else if length += MaxUncoded; DataMaxSize < (length + uint64(len(output))) {
return nil, errors.New("out of bounds output")
}
windowIndex, buf = window.GetSet(int(offsetIndex), windowIndex, int(length), windowBuffer)
output = append(output, buf...)
} else {
if literal, err = r.ReadBits(LiteralBits); err != nil {
break
} else if (DataMaxSize - 1) < len(output) {
return nil, errors.New("out of bounds output")
}
output = append(output, byte(literal))
windowIndex = window.SetByte(windowIndex, byte(literal))
}
}
return output, nil
}

103
compression/window.go Normal file
View file

@ -0,0 +1,103 @@
package compression
type Window [WindowSize]byte
func CreateWindow() (t Window) {
_ = t[WindowInitialIndex-1]
// prefill lookup table
for i := 0; i < WindowInitialIndex; i++ {
t[i] = WindowFillValue
}
return t
}
func (t *Window) Find(windowIndex int, buf []byte, exhaustive bool) (offsetIndex, length int) {
_ = buf[0]
firstData := buf[0]
offsetIndex = -1
length = -1
var t2 Window
for i := range t {
// Applying this offset compresses better in non-exhaustive mode
currentOffsetIndex := t.Index(windowIndex + i - 1)
if t[currentOffsetIndex] == firstData {
t2 = *t
var data byte
lookupIndex2 := t2.SetByte(windowIndex, firstData)
matchSize := 1
for j := 1; j < len(buf) && j < (MaxCoded-1); j++ {
if lookupIndex2, data = t2.GetSetByte(currentOffsetIndex+j, lookupIndex2); data != buf[j] {
break
}
matchSize++
}
if matchSize > length && matchSize >= MaxUncoded {
offsetIndex = currentOffsetIndex
length = matchSize
if !exhaustive {
return
}
}
}
}
return
}
func (t *Window) Peek(offsetIndex, length int, buf []byte) []byte {
_ = buf[length-1]
for j := 0; j < length; j++ {
buf[j] = t[t.Index(offsetIndex+j)]
}
return buf[:length]
}
func (t *Window) GetSet(offsetIndex, windowIndex, length int, buf []byte) (int, []byte) {
_ = buf[length-1]
for j := 0; j < length; j++ {
buf[j] = t[t.Index(offsetIndex+j)]
t[t.Index(windowIndex+j)] = buf[j]
}
return t.Index(windowIndex + length), buf[:length]
}
func (t *Window) Set(windowIndex int, buf []byte) int {
for j := range buf {
t[t.Index(windowIndex+j)] = buf[j]
}
return t.Index(windowIndex + len(buf))
}
func (t *Window) GetSetByte(offsetIndex, windowIndex int) (int, byte) {
data := t[t.Index(offsetIndex)]
t[t.Index(windowIndex)] = data
return t.Index(windowIndex + 1), data
}
func (t *Window) GetByte(offsetIndex int) byte {
return t[t.Index(offsetIndex)]
}
func (t *Window) SetByte(windowIndex int, data byte) int {
t[t.Index(windowIndex)] = data
return t.Index(windowIndex + 1)
}
func (t *Window) Index(i int) int {
return i & (WindowSize - 1)
}

63
crc/crc.go Normal file
View file

@ -0,0 +1,63 @@
package crc
var CRCTable = func() [256]uint32 {
polynomialDivision := func(polynomial, input uint64, len uint) uint64 {
mask := uint64(1)<<len - 1
for i := uint(0); i < len; i++ {
bitOut := input>>(len-1) > 0
input <<= 1
if bitOut {
input ^= polynomial
}
input &= mask
}
return input
}
var table [256]uint32
for i := 0; i < 256; i++ {
table[i] = uint32(polynomialDivision(0x04C11DB7, uint64(i), 32))
}
return table
}()
type CRC struct {
crc uint32
}
func NewCRC() *CRC {
return &CRC{
crc: 0xFFFFFFFF,
}
}
func (c *CRC) Update(buf []byte) {
const chunkSize = 4
remainder := len(buf) % chunkSize
chunks := len(buf) / chunkSize
for chunksLeft := chunks; chunksLeft > 0; chunksLeft-- {
index := (chunks - chunksLeft) * chunkSize
c.crc = CRCTable[((buf[index+3]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
c.crc = CRCTable[((buf[index+2]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
c.crc = CRCTable[((buf[index+1]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
c.crc = CRCTable[((buf[index]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
}
if remainder != 0 {
var paddingBuffer [chunkSize]byte
copy(paddingBuffer[:], buf[chunks*chunkSize:])
c.Update(paddingBuffer[:])
}
}
func (c *CRC) Sum32() uint32 {
return c.crc
}
func CalculateCRC(buf []byte) uint32 {
crc := NewCRC()
crc.Update(buf)
return crc.Sum32()
}

31
doc/COMPRESSION.md Normal file
View file

@ -0,0 +1,31 @@
# Compression notes
The algorithm used is mainly [LZSS](https://en.wikipedia.org/wiki/LZSS) with the following constants:
```go
package compression
const DataMaxSize = 0x8000
const LiteralBits = 8
// OffsetBits Number of bits for the Window offset. From this the WindowSize will be calculated
// In other LZSS implementations, this is usually set to 12
const OffsetBits = 11
const LengthBits = 4
const WindowSize = 1 << OffsetBits
const MaxUncoded = 2
const MaxCoded = MaxUncoded + (1 << LengthBits)
// WindowInitialIndex The windowIndex needs to be set to this before compression/decompression
// In other LZSS implementations, this is usually set to 0
const WindowInitialIndex = WindowSize - 0x10 - 1
// WindowFillValue Initial value to fill Window[0 : WindowInitialIndex]
// In other LZSS implementations, this is usually set to 0x20, but Window[] is filled entirely
const WindowFillValue = 0x20
```
When initializing the _Window_, up to `WindowInitialIndex` are filled compared to the whole Window as usual.
Additionally, the initial _windowIndex_ needs to also be set to `WindowInitialIndex` instead of 0.

5
doc/CRC.md Normal file
View file

@ -0,0 +1,5 @@
# CRC notes
Uses 32-bit "MPEG2" polynomial 0x04C11DB7, data is fed in chunks of 4 bytes, little endian (swap order of each chunk bytes).
End chunk has to be padded with \x00 to fit into 4.

145
doc/ENCRYPTION.md Normal file
View file

@ -0,0 +1,145 @@
# Encryption notes
## Mangle Block Cipher
This cipher is used on encryption of firmware and memory data. The name Mangle has been arbitrarily chosen.
### Mangle Key
A mangle key is a 128-bit sequence of bytes, either fixed or dynamically generated.
Some of these keys are stored in Tables listed below.
Each Mangle Key is split in 4 `uint32` sub-keys. These are selected depending on the round number.
Some of these keys are organized in key tables. This is a collection of 8 128-bit keys in an addressable way.
### Design
Mangle is an iterative, 64-bit block cipher.
Directly, 128-bit keys are used, but several of these are combined in the full Mangle construct.
The round function is composed of two parts, that mix the data of the two halves.
For each block, 48 rounds are applied consecutively, with each round modifying one of the halves alternatively.
```go
package mangle
type Key [4]uint32
const Rounds = 48
func Encrypt(key Key, block uint64) uint64 {
dataA, dataB := uint32(block), uint32(block>>32)
for round := int32(0); round < Rounds; round++ {
// Swap dataA and dataB
dataB, dataA = encryptRound(key[(round&3)<<2], dataA, dataB, uint32(round))
}
return uint64(dataA) | (uint64(dataB) << 32)
}
func encryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
dataA = round + roundKey + ((dataB >> 8) ^ (dataB << 6)) + dataB + dataA
return dataA, dataB
}
func Decrypt(key Key, block uint64) uint64 {
dataA, dataB := uint32(block), uint32(block>>32)
// Rounds run inverse to Encrypt
for round := int32(Rounds - 1); round != -1; round-- {
// Swap dataA and dataB
dataA, dataB = decryptRound(key[(round&3)<<2], dataB, dataA, uint32(round))
}
return uint64(dataA) | (uint64(dataB) << 32)
}
func decryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
dataA = (dataA - dataB) - ((dataB >> 8) ^ (dataB << 6)) - roundKey - round
return dataA, dataB
}
```
### Mode of operation
The cipher operates in ECB mode. As such, blocks containing the same value will encrypt equally.
Attacking this cipher without knowledge of key material or algorithm is trivial,
given access to an Encryption Oracle and starting knowledge of a full 64-bit block in target material.
### Hardcoded Mangle Key Table
This table is hardcoded in firmware, and seems to be used across all devices known.
It gets used on the Outer Mangle and the Inner Mangle, depending on the selected Mangle Index.
| Offset | Identifier | Key Data |
|:------:|:----------:|:------------------------------------------------:|
| 0 | _Firmware_ | `0x0539c06f, 0x3a235801, 0x1bb4da80, 0x44916a65` |
| 1 | _DeviceId_ | `0x5b01cb35, 0xb498a4fb, 0xe9486d82, 0xf4945010` |
| 2 | | `0xe8babcec, 0x2aa73df8, 0x4cf9f79c, 0x886d73e7` |
| 3 | | `0x25483503, 0xb1a0a8af, 0x24a745b2, 0xf5e21339` |
| 4 | | `0x42d89088, 0x37a379af, 0x422689e0, 0x636239e9` |
| 5 | | `0xabd061f0, 0x7f710579, 0xbd626b51, 0x2af22c15` |
| 6 | _Memory_ | `0xb341bc06, 0x6e6e4674, 0xb3eb7b01, 0xf1965b32` |
| 7 | | `0x52f33e6f, 0x4d69a2f9, 0x77ab77c4, 0x468f4508` |
Several offsets from this table are used for either the outer mangle or other purposes.
* #0: _Firmware Outer Mangle Key_
* #1: _Device Id Outer Mangle Key_
* #6: _Memory Outer Mangle Key_
### Alternate Mangle Key Table
This table is hardcoded in firmware, however, seems to be set to all zeros. No usages in the wild have been found.
It gets used on the Inner Mangle, depending on the selected Mangle Index.
| Offset | Key Data |
|:------:|:------------------------------------------------:|
| 0 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 1 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 2 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 3 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 4 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 5 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 6 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
| 7 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
### Data Mangle Key
This key is randomly generated via various methods. It is 512 bytes long,
and includes the CRC of the original data being encrypted (before compression) twice.
Structure is as follows:
```
Mangle Index (2 bytes)
blob[0:2] = Mangle Index uint16
Mangle Key Block (24 bytes)
blob[2:18] = random() Data Mangle Key
blob[18:22] = CRC(data)
blob[22:26] = CRC(data)
Unused Key Block (486 bytes)
blob[26:512] = random() Unused
```
Although the blob generated is 512 bytes long, only `blob[2:18]` is used as the Key, which does not include the CRC.
### Device Id Specific Mangle Key
Data can be coded specifically to a given device id, which is local to the device.
It gets used on the Inner Mangle, depending on the selected Mangle Index.
Slot #1 from the _Hardcoded Mangle Key Table_ is used here.
```go
package mangle
type Key [4]uint32
var HardcodedKeyTable [8]Key
func DeviceKey(deviceId1, deviceId2, deviceId3 uint32) (key Key) {
outerKey := HardcodedKeyTable[1]
key[0] = outerKey[0] ^ deviceId1
key[1] = outerKey[1] ^ deviceId2
key[2] = outerKey[2] ^ deviceId3
key[3] = outerKey[3]
return key
}
```

74
doc/FIRMWARE.md Normal file
View file

@ -0,0 +1,74 @@
# Firmware notes
## ASFileHeader
| Field | Type | Size | Notes |
|:----------------------:|:----------:|:--------------------------:|:------------------------------------------------------------------------------------------------------------------------------------:|
| *Marker* | `[8]byte` | 8 | Can be either `Phyton\x00\x00` or `AlmaCode`. |
| *Header Size* | `uint32` | 4 | Size of whole Header struct. Fields may be omitted if they exceed the size. |
| *Date Time* | `uint32` | 4 | Release time in _FirmwareDateTime_ encoding. |
| *Buffer Size* | `uint32` | 4 | TBD |
| *Serial Number* | `[16]byte` | 16 | Firmware coded for a specific device S/N. Usually all zeros. |
| *Version Low* | `uint8` | 1 | |
| *Version High* | `uint8` | 1 | |
| *Version* | - | - | Derived from _Version Low_ and _Version High_.<br/>`fmt.Sprintf("%d.%02d", VersionHigh, VersionLow)` |
| *File Count* | `uint32` | 4 | TBD. Only used if _Marker_ == `AlmaCode` |
| *Firmware Header Size* | `uint32` | 4 | TBD |
| *Compressed* | `bool` | 1 | Set to `1` on files with compressed FirmwareBlock. |
| *Reserved* | `uint8` | 1 | Set to `0`. |
| *CRC32* | `uint32` | 4 | Contains the [CRC](CRC.md) of _Data_. |
| *Data* | `[]byte` | _len(buf)_ - _Buffer Size_ | In case of _Marker_ == `Phyton\x00\x00`, `[]FirmwareBlock` follows until EOF.<br/>Refer to source code to decode `AlmaCode` format. |
#### DateTime
```go
package radiacode
import "time"
func DateTimeToTime(dt uint32) time.Time {
high := uint16(dt >> 16)
low := uint16(dt)
year := ((high >> 9) & 127) + 1980
month := (high >> 5) & 15
day := high & 31
hours := (low >> 11) & 31
minutes := (low >> 5) & 63
seconds := (low & 31) * 2
return time.Date(int(year), time.Month(month), int(day), int(hours), int(minutes), int(seconds), 0, time.UTC)
}
```
## Block
| Field | Type | XOR Key | Size | Notes |
|:--------------:|:-----------:|:------------:|:--------------:|:------------------------------------------------------------------------------------------------------------------------:|
| *Header Size* | `uint32` | - | 4 | Denotes the size of the header.<br/>Should be 12, but some weird cases exist in firmware to pad it, 0 value, or 0xFFFF?. |
| *Size* | `uint32` | _0xCE27A932_ | 4 | |
| *Addr* | `uint32` | _0xB2D5A864_ | 4 | Denotes the location of _Data_ in Flash. |
| *Size Aligned* | - | - | - | Derived from _Size_, 8 byte alignment. See [Size Aligned derivation](#size-aligned-derivation) |
| *Key Data* | `[512]byte` | - | 512 | Encryption keys |
| *Data* | `[]byte` | - | _Size Aligned_ | |
After each _FirmwareBlock_ a new one follows, or EOF. So far each new one addresses the next memory block sequentially, without gaps.
Note that if _ASFileHeader_ has _Compressed_ field set, the Data will be smaller than the actual region.
#### Size Aligned derivation
```go
package radiacode
func AlignSize(size uint32) uint32 {
if (size % 8) != 0 {
size = (size & uint32(0xFFFFFFF8)) + 8
}
return size
}
```
## Encryption of Block Key + Data
See [Encryption notes](ENCRYPTION.md)
## Compression of FirmwareBlock Data
See [Compression notes](COMPRESSION.md)

171
encryption/block.go Normal file
View file

@ -0,0 +1,171 @@
package encryption
import (
"encoding/binary"
"errors"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
)
const EncryptedBlockKeySize = 512
const EncryptedBlockMangleIndexOffset = 0
const EncryptedBlockMangleKeyOffset = EncryptedBlockMangleIndexOffset + 2
const EncryptedBlockCRC1Offset = EncryptedBlockMangleKeyOffset + MangleKeyDataSize
const EncryptedBlockCRC2Offset = EncryptedBlockCRC1Offset + 4
const EncryptedBlockPaddingKeyOffset = EncryptedBlockCRC2Offset + 4
type EncryptedBlock []byte
func (b EncryptedBlock) MangleKey() MangleKeyData {
_ = b[EncryptedBlockKeySize-1]
return MangleKeyData(b[EncryptedBlockMangleKeyOffset:EncryptedBlockCRC1Offset])
}
// MangleKeyBlock Includes inner MangleKeyData and CRC1, CRC2
func (b EncryptedBlock) MangleKeyBlock() []byte {
_ = b[EncryptedBlockKeySize-1]
return b[EncryptedBlockMangleKeyOffset:EncryptedBlockPaddingKeyOffset]
}
func (b EncryptedBlock) KeyBlock() []byte {
_ = b[EncryptedBlockKeySize-1]
return b[:EncryptedBlockKeySize]
}
func (b EncryptedBlock) DataBlock() []byte {
return b[EncryptedBlockKeySize:]
}
func (b EncryptedBlock) MangleIndex() uint32 {
_ = b[EncryptedBlockKeySize-1]
return uint32(binary.LittleEndian.Uint16(b[EncryptedBlockMangleIndexOffset:]))
}
func (b EncryptedBlock) CRC() (crc1, crc2 uint32) {
_ = b[EncryptedBlockKeySize-1]
return binary.LittleEndian.Uint32(b[EncryptedBlockCRC1Offset:]), binary.LittleEndian.Uint32(b[EncryptedBlockCRC2Offset:])
}
func (b EncryptedBlock) Reset() {
clear(b)
}
func (b EncryptedBlock) generateKeyBlock(generator KeyGenerator) (mangleIndex uint32) {
_ = b[EncryptedBlockKeySize-1]
crcValue := crc.CalculateCRC(b.DataBlock())
binary.LittleEndian.PutUint32(b[EncryptedBlockCRC1Offset:], crcValue)
binary.LittleEndian.PutUint32(b[EncryptedBlockCRC2Offset:], crcValue)
generator.Fill(b[EncryptedBlockMangleKeyOffset:EncryptedBlockCRC1Offset])
generator.Fill(b[EncryptedBlockPaddingKeyOffset:EncryptedBlockKeySize])
return generator.MangleIndex()
}
const (
mangleIndexNormalKey0 = iota
mangleIndexNormalKey1
mangleIndexNormalKey2
mangleIndexNormalKey3
mangleIndexNormalKey4
mangleIndexNormalKey5
mangleIndexNormalKey6
mangleIndexNormalKey7
mangleIndexAlternateKey0
mangleIndexAlternateKey1
mangleIndexAlternateKey2
mangleIndexAlternateKey3
mangleIndexAlternateKey4
mangleIndexAlternateKey5
mangleIndexAlternateKey6
mangleIndexAlternateKey7
mangleIndexDeviceKey = 0xffff
)
func (b EncryptedBlock) Encrypt(material KeyMaterial) {
mangleIndex := b.generateKeyBlock(material.Generator)
// Mangle of data
b.MangleKey().Encrypt(b.DataBlock())
// Inner mangle of key
if material.AlternateMangleKey != nil {
material.AlternateMangleKey[mangleIndex].Encrypt(b.MangleKeyBlock())
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], uint16(mangleIndex+mangleIndexAlternateKey0))
} else if material.DeviceKey != nil {
material.DeviceKey.Encrypt(b.MangleKeyBlock())
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], mangleIndexDeviceKey)
} else {
HardcodedMangleTable[mangleIndex].Encrypt(b.MangleKeyBlock())
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], uint16(mangleIndex))
}
// Outer mangle of key
HardcodedMangleTable[material.OuterKeyOffset].Encrypt(b.KeyBlock())
}
func (b EncryptedBlock) Decrypt(material KeyMaterial, verifyCrc bool) (err error) {
// Outer unmangle of key
HardcodedMangleTable[material.OuterKeyOffset].Decrypt(b.KeyBlock())
mangleIndex := b.MangleIndex()
var keyData MangleKeyData
if mangleIndex <= mangleIndexNormalKey7 {
keyData = HardcodedMangleTable[mangleIndex]
} else if mangleIndex <= mangleIndexAlternateKey7 {
if material.AlternateMangleKey != nil {
keyData = material.AlternateMangleKey[mangleIndex-mangleIndexAlternateKey0]
} else {
keyData = AlternateMangleTable[mangleIndex-mangleIndexAlternateKey0]
}
} else {
if mangleIndex != mangleIndexDeviceKey {
return errors.New("invalid key number")
}
if material.DeviceKey == nil {
return errors.New("unsupported hardware key")
}
keyData = *material.DeviceKey
}
// Inner unmangle of key + CRC data
keyData.Decrypt(b.MangleKeyBlock())
// Unmangle of data
b.MangleKey().Decrypt(b.DataBlock())
crc1, crc2 := b.CRC()
if crc1 != crc2 {
return errors.New("invalid CRC pair")
}
if verifyCrc {
calculatedCrc := crc.CalculateCRC(b.DataBlock())
if calculatedCrc != crc1 {
return errors.New("data CRC invalid")
}
}
return nil
}
func NewEncryptedBlock(size int) EncryptedBlock {
if size%8 != 0 {
//TODO: auto adjust
panic("size must be % 8")
}
return make(EncryptedBlock, EncryptedBlockKeySize+size)
}

283
encryption/block_test.go Normal file
View file

@ -0,0 +1,283 @@
package encryption
import (
"bytes"
"crypto/rand"
"encoding/binary"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/compression"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
"io"
"slices"
"testing"
)
func TestEncryptedBlock_Decrypt_FirmwareUncompressed(t *testing.T) {
t.Parallel()
data := slices.Clone(sampleBlockFirmwareUncompressed)
err := data.Decrypt(NewFirmwareKeyMaterial(nil), true)
if err != nil {
t.Fatal(err)
}
}
func TestEncryptedBlock_Decrypt_FirmwareCompressed(t *testing.T) {
t.Parallel()
data := slices.Clone(sampleBlockFirmwareCompressed)
err := data.Decrypt(NewFirmwareKeyMaterial(nil), false)
if err != nil {
t.Fatal(err)
}
rawCompressedData := data.DataBlock()[:sampleBlockFirmwareCompressedSize]
decompressedData, err := compression.FirmwareBlockDecompress(rawCompressedData)
if err != nil {
t.Fatal(err)
}
crc1, _ := data.CRC()
if calculatedCrc := crc.CalculateCRC(decompressedData); calculatedCrc != crc1 {
t.Fatalf("decompressed data does not match, %08x != %08x", calculatedCrc, crc1)
}
compressedDataExhaustive, err := compression.FirmwareBlockCompress(decompressedData, true)
if err != nil {
t.Fatal(err)
}
decompressedData2, err := compression.FirmwareBlockDecompress(compressedDataExhaustive)
if err != nil {
t.Fatal(err)
}
if calculatedCrc := crc.CalculateCRC(decompressedData2); calculatedCrc != crc1 {
t.Fatalf("compressed and decompressed exhaustive data does not match, %08x != %08x", calculatedCrc, crc1)
}
compressedData, err := compression.FirmwareBlockCompress(decompressedData, false)
if err != nil {
t.Fatal(err)
}
decompressedData3, err := compression.FirmwareBlockDecompress(compressedData)
if err != nil {
t.Fatal(err)
}
if calculatedCrc := crc.CalculateCRC(decompressedData3); calculatedCrc != crc1 {
t.Fatalf("compressed and decompressed data does not match, %08x != %08x", calculatedCrc, crc1)
}
t.Logf("Decompressed size: %d", len(decompressedData))
t.Logf("Original compressed size: %d", len(rawCompressedData))
t.Logf("Custom compressed size: %d", len(compressedData))
t.Logf("Custom compressed size (exhaustive): %d", len(compressedDataExhaustive))
originalRatio := float64(len(rawCompressedData)) / float64(len(decompressedData))
customRatio := float64(len(compressedData)) / float64(len(decompressedData))
customRatioExhaustive := float64(len(compressedDataExhaustive)) / float64(len(decompressedData))
t.Logf("Original ratio: %.08f%%", originalRatio*100)
t.Logf("Custom ratio: %.08f%%", customRatio*100)
t.Logf("Custom ratio (exhaustive): %.08f%%", customRatioExhaustive*100)
t.Logf("Change: %.08f%%", (customRatio-originalRatio)*100)
t.Logf("Change (exhaustive): %.08f%%", (customRatioExhaustive-originalRatio)*100)
}
func TestEncryptedBlock_Decrypt_MemoryData(t *testing.T) {
t.Parallel()
data := slices.Clone(sampleBlockMemoryEmpty)
err := data.Decrypt(NewMemoryKeyMaterial(nil), true)
if err != nil {
t.Fatal(err)
}
}
func TestEncryptedBlock_EncryptDecrypt(t *testing.T) {
t.Parallel()
b := NewEncryptedBlock(64)
_, err := io.ReadFull(rand.Reader, b.DataBlock())
if err != nil {
t.Fatal(err)
}
data := slices.Clone(b.DataBlock())
var seedBuf [4]byte
_, err = io.ReadFull(rand.Reader, seedBuf[:])
material := NewMemoryKeyMaterial(&SecureRandomKeyGenerator{})
b.Encrypt(material)
dec := slices.Clone(b)
err = dec.Decrypt(material, true)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(data, dec.DataBlock()) != 0 {
t.Fatal("data does not match")
}
}
func TestEncryptedBlock_EncryptDecrypt_WithDeviceKey(t *testing.T) {
t.Parallel()
b := NewEncryptedBlock(64)
_, err := io.ReadFull(rand.Reader, b.DataBlock())
if err != nil {
t.Fatal(err)
}
data := slices.Clone(b.DataBlock())
var seedBuf [4]byte
_, err = io.ReadFull(rand.Reader, seedBuf[:])
generator := BorlandRandKeyGenerator(binary.LittleEndian.Uint32(seedBuf[:]))
material := NewFirmwareKeyMaterial(&generator)
material.DeviceKey = sampleDeviceMangleKey
b.Encrypt(material)
dec := slices.Clone(b)
err = dec.Decrypt(material, true)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(data, dec.DataBlock()) != 0 {
t.Fatal("data does not match")
}
}
func TestEncryptedBlock_Encrypt(t *testing.T) {
t.Parallel()
var err error
b := NewEncryptedBlock(0)
generator := BorlandRandKeyGenerator(0)
material := NewMemoryKeyMaterial(&generator)
b.Encrypt(material)
d1 := slices.Clone(b)
d2 := slices.Clone(sampleBlockMemoryEmpty)
err = d1.Decrypt(material, true)
if err != nil {
t.Fatal(err)
}
err = d2.Decrypt(material, true)
if err != nil {
t.Fatal(err)
}
if bytes.Compare(d1, d2) != 0 {
t.Logf("generated %x", d1)
t.Logf("expected %x", d2)
t.Fail()
}
if bytes.Compare(b, sampleBlockMemoryEmpty) != 0 {
t.Logf("generated %x", b)
t.Logf("expected %x", sampleBlockMemoryEmpty)
t.Fail()
}
}
func TestBruteforceSeed_Short(t *testing.T) {
data := slices.Clone(sampleBlockMemoryEmpty)
seeds, err := BruteforceBorlandSeed(data, NewMemoryKeyMaterial(nil))
if err != nil {
t.Fatal(err)
}
for _, seed := range seeds {
t.Logf("seed = 0x%08x", seed)
}
if len(seeds) != 2 {
t.Fatal("seeds not found")
}
}
/*
func TestBruteforceSeed_FirmwareUncompressed(t *testing.T) {
data := slices.Clone(sampleBlockFirmwareUncompressed)
seeds, err := BruteforceBorlandSeed(data, NewFirmwareKeyMaterial(nil))
if err != nil {
t.Fatal(err)
}
for _, seed := range seeds {
t.Logf("found seed = 0x%08x", seed)
}
if len(seeds) != 2 {
t.Fatal("seeds not found")
}
}
*/
func BenchmarkEncryptedBlock_Encrypt(b *testing.B) {
const dataSize = 64
const keyOffset = OuterMangleKeyOffsetMemory
data := make([]byte, dataSize)
_, err := io.ReadFull(rand.Reader, data)
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
buf := NewEncryptedBlock(len(data))
var material KeyMaterial
material.OuterKeyOffset = keyOffset
generator := BorlandRandKeyGenerator(0)
material.Generator = &generator
for pb.Next() {
buf.Reset()
copy(buf.DataBlock(), data)
buf.Encrypt(material)
}
})
}
func BenchmarkEncryptedBlock_Decrypt(b *testing.B) {
const dataSize = 64
const keyOffset = OuterMangleKeyOffsetMemory
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
encryptedBlock := NewEncryptedBlock(dataSize)
_, err := io.ReadFull(rand.Reader, encryptedBlock.DataBlock())
if err != nil {
b.Fatal(err)
}
var seedBuf [4]byte
_, err = io.ReadFull(rand.Reader, seedBuf[:])
var material KeyMaterial
material.OuterKeyOffset = keyOffset
generator := BorlandRandKeyGenerator(binary.LittleEndian.Uint32(seedBuf[:]))
material.Generator = &generator
encryptedBlock.Encrypt(material)
buf := NewEncryptedBlock(len(encryptedBlock.DataBlock()))
for pb.Next() {
buf.Reset()
copy(buf, encryptedBlock)
err = buf.Decrypt(material, true)
if err != nil {
panic(err)
}
}
})
}

View file

@ -0,0 +1,587 @@
package encryption
var sampleDeviceMangleKey = DeviceMangleKey(0x003B0056, 0x4D4B5002, 0x20323455)
var sampleBlockMemoryEmpty = EncryptedBlock{
0x2D, 0x01, 0x3E, 0x61, 0x52, 0x5A, 0xDF, 0xED, 0xF4, 0x1F, 0xA0, 0x40, 0xE3, 0xC2, 0x24, 0xDF, 0x4C, 0xD6, 0xF6, 0x98, 0x5B, 0xB7, 0x99, 0x27, 0xBE, 0x18, 0x88, 0xE8, 0xA5, 0x78, 0x29, 0xEB,
0x2C, 0x3F, 0xB6, 0x21, 0xD8, 0x62, 0x9A, 0x21, 0x1B, 0x42, 0xD0, 0xD9, 0x44, 0x04, 0xEB, 0xE3, 0x31, 0x7E, 0xBE, 0xD4, 0x47, 0x6D, 0xA8, 0xE1, 0x2F, 0xE4, 0x81, 0x84, 0x7B, 0x04, 0xC3, 0x60,
0x05, 0x83, 0xA1, 0x21, 0x3C, 0xBF, 0xD7, 0x2E, 0x4D, 0x0A, 0xAD, 0x0D, 0xBC, 0xDF, 0xBA, 0x61, 0x08, 0x6B, 0xDD, 0xDE, 0x7A, 0x4A, 0xC9, 0xC9, 0x38, 0x34, 0xDC, 0x4E, 0xD0, 0x10, 0x82, 0x45,
0x28, 0x6F, 0x7B, 0xDE, 0xB4, 0xB9, 0x2A, 0xDD, 0x63, 0x1A, 0x71, 0x91, 0x6F, 0x13, 0x59, 0x10, 0x7D, 0x21, 0xA5, 0xF4, 0x63, 0x31, 0x1B, 0xD7, 0xDB, 0x8C, 0x68, 0xEE, 0x2E, 0x28, 0x34, 0x4C,
0x99, 0xC3, 0xCC, 0x58, 0xCA, 0x22, 0x4D, 0xB3, 0x54, 0xD5, 0x64, 0x3B, 0x04, 0x5D, 0x94, 0x6C, 0x8E, 0x78, 0x80, 0x01, 0x25, 0x0E, 0x0F, 0xA2, 0xFE, 0xAA, 0x9D, 0xF9, 0xE1, 0x6C, 0x5E, 0x9E,
0x6E, 0xB1, 0xC5, 0x83, 0x6E, 0xDA, 0x5E, 0x58, 0xF9, 0xE1, 0x2D, 0x5D, 0xE4, 0x53, 0xAF, 0x4D, 0xCD, 0xCE, 0x4E, 0x8C, 0xD8, 0x6A, 0x7C, 0x24, 0x6D, 0xEC, 0x5C, 0xF6, 0x90, 0x32, 0xF7, 0x89,
0x43, 0x67, 0x09, 0xBB, 0xBB, 0x88, 0x28, 0xDB, 0xD1, 0xAB, 0x81, 0x22, 0xD3, 0x16, 0x5B, 0x5E, 0xEF, 0xBE, 0x9F, 0xAC, 0x6B, 0x7B, 0x97, 0x37, 0x48, 0x89, 0x9F, 0x09, 0x09, 0x88, 0x35, 0xCA,
0x28, 0x15, 0x25, 0xDA, 0xCF, 0xAE, 0xB0, 0x4D, 0xA3, 0x82, 0xD3, 0x70, 0x89, 0x35, 0x3C, 0x50, 0xB2, 0x05, 0x92, 0xF6, 0xCA, 0xF5, 0xC9, 0x08, 0xFB, 0xE8, 0x4E, 0x89, 0x1D, 0x06, 0x65, 0xE5,
0x7B, 0x36, 0x1C, 0x11, 0xA5, 0x63, 0x51, 0x99, 0x5D, 0x8C, 0x93, 0xAC, 0x22, 0x56, 0x2E, 0x56, 0x88, 0xE0, 0x6C, 0x85, 0x35, 0xEE, 0xA0, 0xDA, 0x2A, 0x1C, 0x66, 0xC8, 0x6B, 0x16, 0x87, 0xF9,
0x05, 0xB5, 0x1B, 0x3B, 0x8F, 0x92, 0xF6, 0xE4, 0xFD, 0x53, 0x23, 0xDA, 0x07, 0x1D, 0x4D, 0x7B, 0x06, 0x0F, 0x1E, 0xD1, 0x0B, 0x5C, 0x01, 0xA8, 0xB3, 0x79, 0x6F, 0x4D, 0x5B, 0xD6, 0xC5, 0x54,
0x70, 0x34, 0x24, 0xC6, 0x4F, 0x4D, 0x2B, 0x66, 0xBF, 0x01, 0x73, 0xF4, 0x01, 0x50, 0x5E, 0x8E, 0xE2, 0xD6, 0xBC, 0x68, 0x9B, 0xDB, 0xE2, 0xCB, 0x43, 0x26, 0x50, 0x1F, 0x2E, 0x2A, 0xA8, 0x4F,
0xAB, 0x42, 0x25, 0x0A, 0x5D, 0x0F, 0x8F, 0x8B, 0xDF, 0xBD, 0x01, 0x7C, 0x5D, 0x93, 0xFE, 0xA8, 0xA1, 0x9B, 0xEB, 0x5A, 0xCB, 0xE0, 0x01, 0x89, 0x0C, 0x42, 0x3B, 0x7A, 0x1B, 0x16, 0x5C, 0x9E,
0xB6, 0xD5, 0x4A, 0x96, 0x06, 0xC0, 0xCA, 0x19, 0xB2, 0x9B, 0x5C, 0x57, 0xBF, 0x01, 0x10, 0x7A, 0xC3, 0x1F, 0xF9, 0xFD, 0x18, 0xE1, 0x20, 0x3B, 0xCA, 0xF8, 0xC0, 0xCE, 0x59, 0x30, 0x15, 0xDA,
0x70, 0x62, 0x3E, 0x39, 0xE9, 0xCA, 0x90, 0xBE, 0xC1, 0x7F, 0x0A, 0x93, 0xF2, 0xD7, 0xCC, 0xAC, 0xA1, 0xF8, 0x7F, 0x31, 0xBA, 0xC4, 0x05, 0x69, 0xE3, 0x3C, 0x3F, 0x35, 0x33, 0x72, 0xBF, 0xAF,
0xE7, 0xC0, 0x99, 0x8D, 0xD7, 0xEF, 0x32, 0xB9, 0xDF, 0x77, 0x08, 0xD0, 0x77, 0x8B, 0x71, 0x4F, 0x05, 0x7F, 0x37, 0x5F, 0x55, 0x28, 0x2F, 0xC7, 0x8D, 0xAF, 0x79, 0xB3, 0x9A, 0xEF, 0x76, 0x65,
0x02, 0xBE, 0x06, 0xF7, 0x6E, 0xCB, 0x5B, 0x46, 0x45, 0xDD, 0x8A, 0x2D, 0xF1, 0xD3, 0x78, 0x92, 0x61, 0x03, 0x00, 0x40, 0x64, 0x72, 0xC4, 0xA5, 0x16, 0x25, 0x57, 0x75, 0x97, 0xF1, 0x07, 0x88,
}
var sampleBlockFirmwareCompressedSize = len(sampleBlockFirmwareCompressed) - EncryptedBlockKeySize - 3
var sampleBlockFirmwareCompressed = EncryptedBlock{
0x4E, 0xA1, 0x65, 0x14, 0xE4, 0xD8, 0xEE, 0xB6, 0x99, 0x58, 0xF3, 0x54, 0x81, 0x49, 0x15, 0x51, 0x0C, 0xD9, 0x88, 0xB8, 0x75, 0x00, 0x96, 0xAC, 0xC8, 0x11, 0x4C, 0x96, 0x12, 0x23, 0x5B, 0xAC,
0x07, 0x67, 0x5E, 0xEE, 0xC0, 0x05, 0x14, 0x15, 0xE0, 0x4A, 0x07, 0x34, 0x07, 0xC5, 0xBA, 0xD5, 0xDC, 0x6C, 0xE8, 0x58, 0x39, 0x27, 0x5F, 0x0C, 0x79, 0x58, 0x27, 0x62, 0x95, 0xAF, 0x3C, 0xF9,
0x91, 0xA1, 0xD5, 0x6B, 0x9F, 0xE5, 0xE8, 0xB0, 0x73, 0x55, 0xBE, 0xFC, 0xC3, 0x7B, 0x88, 0x9B, 0x6F, 0xED, 0x4A, 0x3D, 0x99, 0x98, 0xF0, 0x11, 0xCB, 0x9B, 0xB1, 0xC1, 0x52, 0x8C, 0xB3, 0x0A,
0x18, 0xBE, 0x90, 0xE4, 0x26, 0x0A, 0x89, 0xE0, 0xE6, 0xA0, 0xB4, 0xC6, 0xFA, 0x64, 0xED, 0x3A, 0x49, 0x28, 0xC5, 0x2D, 0xB6, 0xB1, 0x74, 0x03, 0x0F, 0x4D, 0xF1, 0x68, 0xDC, 0x72, 0xEB, 0xC0,
0x8F, 0x41, 0x6F, 0xD4, 0x31, 0x86, 0x21, 0x79, 0x59, 0x9C, 0x3C, 0x2A, 0x86, 0xAD, 0x48, 0xB7, 0xFC, 0x5E, 0xEF, 0xCC, 0xF3, 0x06, 0x70, 0x73, 0x34, 0x0E, 0x83, 0xF7, 0x74, 0xB5, 0x25, 0x76,
0x08, 0x5F, 0x8C, 0x2B, 0xD4, 0x8E, 0x83, 0xE4, 0xFB, 0xCC, 0xC6, 0x08, 0x6B, 0x8A, 0xFD, 0x88, 0xCD, 0x05, 0x4E, 0xEA, 0x86, 0xA4, 0xAA, 0x05, 0x10, 0x19, 0xDB, 0x83, 0x9B, 0xB4, 0x97, 0xBD,
0x3A, 0x82, 0x58, 0x8C, 0xF0, 0x96, 0xF2, 0xB8, 0xD1, 0xA6, 0xA9, 0x5A, 0xBE, 0xA0, 0x54, 0x5F, 0x64, 0x21, 0xE9, 0x1A, 0x87, 0x2D, 0xCF, 0x3F, 0xD4, 0xD5, 0x02, 0xE3, 0x1F, 0x54, 0xC7, 0x41,
0x4F, 0xF7, 0x0C, 0x98, 0x4B, 0x58, 0xAE, 0xAB, 0x15, 0x1B, 0x4B, 0x8E, 0xD7, 0x1E, 0x2F, 0xDB, 0x4E, 0xF3, 0x60, 0xC7, 0x4A, 0xC8, 0x4E, 0x4A, 0x15, 0xF4, 0xAB, 0x06, 0x71, 0xBE, 0x2C, 0x71,
0xF7, 0x9E, 0x47, 0x13, 0x4A, 0x5C, 0xAD, 0xE7, 0xD3, 0x30, 0xB4, 0x8A, 0x10, 0x2C, 0xCF, 0x4D, 0x7D, 0x5F, 0x74, 0xC4, 0x87, 0xD5, 0x0C, 0xF0, 0x7D, 0x05, 0x3A, 0x0F, 0x8F, 0xB9, 0xBB, 0xC6,
0x06, 0x80, 0x84, 0x80, 0xBC, 0x95, 0xEB, 0x2A, 0xE9, 0x23, 0xEC, 0xE8, 0xC2, 0xF8, 0xE5, 0xC7, 0x50, 0xAE, 0x8C, 0x49, 0x3D, 0x9D, 0x13, 0x9A, 0x62, 0x75, 0xC4, 0x3D, 0x45, 0x3A, 0xED, 0x33,
0x11, 0xCE, 0x53, 0x9D, 0x44, 0x2D, 0x82, 0x14, 0xA1, 0x86, 0x1A, 0x38, 0xF2, 0xA3, 0x89, 0xC3, 0x1E, 0xC9, 0xFE, 0x8D, 0xFC, 0xE2, 0x1D, 0xEE, 0xE8, 0xD1, 0x9D, 0xA7, 0xC7, 0x2D, 0x34, 0x8A,
0x07, 0xD4, 0xA3, 0xFF, 0x37, 0xFD, 0xAD, 0x81, 0x79, 0x8B, 0x8B, 0x76, 0x40, 0xDC, 0xF3, 0x91, 0xC8, 0x19, 0x84, 0x4F, 0x9E, 0xBF, 0xED, 0xFC, 0x1B, 0xB3, 0x0C, 0x8A, 0x19, 0xBC, 0x7F, 0x5C,
0xD9, 0xE9, 0x4A, 0x24, 0x5D, 0xB8, 0x4B, 0xB0, 0x25, 0xC6, 0xFC, 0xF8, 0x83, 0xB1, 0xB0, 0x39, 0x43, 0x7A, 0xA6, 0x15, 0xDA, 0x9D, 0xC8, 0xD5, 0x4F, 0x59, 0x3D, 0xC9, 0x50, 0xDB, 0x7E, 0xF5,
0x1C, 0x2C, 0x9C, 0xEB, 0x49, 0xBA, 0xF0, 0xCB, 0x2F, 0x38, 0x95, 0x59, 0x52, 0xEB, 0x76, 0x59, 0x6E, 0xB9, 0x17, 0xFE, 0x73, 0x65, 0x74, 0x63, 0x5C, 0x15, 0x27, 0x8D, 0xA1, 0x39, 0xEA, 0xF2,
0xD8, 0xB3, 0x16, 0x19, 0x2C, 0xC3, 0xFC, 0xD5, 0xEA, 0xB3, 0x1E, 0xC6, 0x1B, 0x21, 0xCD, 0x45, 0x03, 0x69, 0x0B, 0xAD, 0x3D, 0xE5, 0xA3, 0xBA, 0xD8, 0x4C, 0x8A, 0xE3, 0x1B, 0x40, 0x5E, 0x11,
0xF4, 0xFE, 0xFB, 0x35, 0x3B, 0xDF, 0x34, 0x26, 0x6F, 0xF9, 0xD7, 0xE5, 0xEA, 0xF1, 0x97, 0x99, 0x45, 0xA8, 0x1A, 0xD3, 0x5B, 0x61, 0x58, 0x22, 0x85, 0xCE, 0xBF, 0xC4, 0x6F, 0x49, 0x60, 0xEF,
0xFA, 0x6E, 0xA7, 0x25, 0xE4, 0x88, 0xB5, 0x9D, 0x21, 0x1B, 0x93, 0x33, 0xBB, 0x62, 0x0C, 0x9D, 0x70, 0x46, 0x00, 0xFE, 0xA8, 0x74, 0x4F, 0x44, 0xA0, 0xF8, 0x73, 0xD8, 0x95, 0xA0, 0x0D, 0xEE,
0xD0, 0x25, 0x6B, 0xE8, 0xDB, 0x62, 0x8B, 0xE2, 0x8C, 0x4F, 0x04, 0xC8, 0x56, 0xC2, 0xED, 0x25, 0x17, 0x5A, 0xAE, 0xE6, 0x07, 0x03, 0x84, 0x1B, 0xED, 0x0E, 0xBA, 0x12, 0x3B, 0xCC, 0x9B, 0x95,
0xC0, 0xF7, 0x9A, 0xF5, 0xA5, 0x14, 0xC2, 0x44, 0x97, 0x8A, 0x03, 0x9B, 0x22, 0x53, 0x5B, 0x74, 0xE7, 0x66, 0xA5, 0xBC, 0x12, 0xB7, 0x94, 0x41, 0x45, 0x34, 0x9F, 0x97, 0x70, 0x83, 0x53, 0x7F,
0x2B, 0x62, 0x5E, 0xB7, 0xF3, 0xF0, 0x41, 0x23, 0x87, 0x69, 0xAF, 0xF5, 0x05, 0xD5, 0x23, 0xA4, 0xCF, 0xAF, 0xDD, 0x18, 0x8E, 0x0B, 0x13, 0x07, 0x35, 0x6E, 0x89, 0x25, 0xE7, 0x69, 0xA0, 0x15,
0xA4, 0xD3, 0xB2, 0x32, 0xA9, 0xF2, 0xD3, 0xAB, 0x46, 0x11, 0x8D, 0xBA, 0x07, 0x95, 0x64, 0xA7, 0x5F, 0x36, 0xCE, 0x33, 0xF0, 0x7B, 0xAF, 0x88, 0x13, 0x35, 0x85, 0xA6, 0x1F, 0xA9, 0x62, 0xA1,
0x82, 0x96, 0x56, 0xD3, 0x99, 0x77, 0x95, 0xFA, 0xC3, 0xED, 0x9F, 0x7D, 0x73, 0x90, 0x3E, 0x82, 0x4D, 0xBC, 0x37, 0xA6, 0xF2, 0x6E, 0x56, 0x34, 0xAF, 0xD8, 0x90, 0x38, 0x33, 0xCD, 0xF9, 0xDD,
0x2E, 0x01, 0xDC, 0x14, 0x5C, 0x7A, 0x6D, 0x2F, 0xD8, 0x1A, 0x39, 0x95, 0x33, 0xA5, 0xEC, 0x91, 0x37, 0xA1, 0x8F, 0x22, 0x12, 0x87, 0xA4, 0xED, 0x2E, 0x92, 0x98, 0x73, 0x7D, 0xA4, 0xB9, 0xFA,
0x5D, 0x27, 0xA8, 0xF9, 0xCD, 0x5E, 0xF9, 0xF5, 0x64, 0xF1, 0xC8, 0x02, 0xEB, 0xBC, 0x14, 0xA8, 0x00, 0x2D, 0x55, 0xDE, 0xDA, 0xA4, 0x76, 0x35, 0x58, 0xA3, 0x32, 0xB9, 0xAB, 0xD7, 0x48, 0x2F,
0xD4, 0xF7, 0x5A, 0xCA, 0x72, 0x88, 0x58, 0x7C, 0xCF, 0x2C, 0x64, 0x10, 0x5E, 0xCB, 0xE4, 0x59, 0x6F, 0x18, 0x6D, 0x78, 0xFA, 0x78, 0xB1, 0x31, 0xDF, 0xBD, 0x9A, 0x05, 0x33, 0x84, 0x9C, 0x66,
0xFA, 0x4C, 0xE1, 0xF3, 0x5B, 0x83, 0xAD, 0x56, 0x9E, 0x42, 0x1C, 0xFC, 0x3D, 0xBD, 0xDA, 0x33, 0xDE, 0x90, 0x5B, 0x70, 0x80, 0xFD, 0x9B, 0x89, 0xEB, 0x62, 0x20, 0xAF, 0xAD, 0x8D, 0x70, 0xEC,
0x2D, 0x99, 0xE5, 0x54, 0xE6, 0x66, 0xA2, 0xE5, 0x0C, 0x5D, 0x18, 0x40, 0x97, 0x13, 0x77, 0x8E, 0x48, 0xED, 0x69, 0xD3, 0x5A, 0x3A, 0x34, 0xB5, 0x31, 0x56, 0x6D, 0x7D, 0x57, 0x58, 0xE5, 0x7E,
0xE9, 0xB0, 0x45, 0x3F, 0xB8, 0x24, 0x63, 0x9C, 0xD4, 0x73, 0x2B, 0x12, 0x54, 0x07, 0xDB, 0xEF, 0xC3, 0x0A, 0xC0, 0x17, 0xCE, 0x09, 0x9B, 0x3D, 0xA3, 0xA1, 0x04, 0xE5, 0xC1, 0x5B, 0x8D, 0xD0,
0x6D, 0x2F, 0xEB, 0xDD, 0x79, 0x8B, 0x46, 0xB1, 0x38, 0x4F, 0xFB, 0x11, 0x08, 0x4E, 0x4D, 0x60, 0x04, 0x3F, 0xF5, 0x19, 0x5C, 0x81, 0x6D, 0x8B, 0x34, 0x61, 0x72, 0xD3, 0x59, 0x15, 0x55, 0xA1,
0x42, 0xBD, 0xF2, 0xBD, 0x74, 0x6A, 0x39, 0xBF, 0xEB, 0x31, 0x95, 0xE2, 0x2A, 0x4F, 0x31, 0xC8, 0x51, 0x57, 0x2C, 0x5E, 0x3E, 0xD7, 0x8B, 0xEF, 0xA9, 0xEB, 0x1D, 0x22, 0x13, 0x19, 0x54, 0x18,
0x5D, 0xB6, 0xD8, 0x56, 0x8C, 0x72, 0xC5, 0xF6, 0xB1, 0x6B, 0xD6, 0x85, 0xCB, 0x94, 0x30, 0x00, 0x6A, 0x31, 0x54, 0x2E, 0xCE, 0x40, 0xA3, 0x40, 0xA1, 0x17, 0xAF, 0x8E, 0x5E, 0x4D, 0xDF, 0x47,
0xA2, 0x9F, 0xC2, 0xF3, 0x50, 0x76, 0xEF, 0x1D, 0xB3, 0xA2, 0x7B, 0x0A, 0x1C, 0x01, 0x71, 0x65, 0x0C, 0xAB, 0x13, 0xD5, 0x46, 0x7F, 0xDA, 0x95, 0x1C, 0x82, 0xF8, 0xF2, 0x06, 0xE7, 0x66, 0x34,
0xAA, 0x6A, 0xEC, 0x61, 0x86, 0xE3, 0x5C, 0xB1, 0xAB, 0x76, 0x43, 0x29, 0x1A, 0x09, 0x4B, 0xE5, 0xBA, 0x9D, 0xD1, 0x25, 0x35, 0xC9, 0xB6, 0xF3, 0x87, 0xB7, 0x29, 0xF0, 0x83, 0x29, 0x61, 0x9C,
0x52, 0x95, 0xF4, 0x8D, 0xFD, 0x47, 0xFD, 0x06, 0x7C, 0x6B, 0xB7, 0x2A, 0x21, 0xB3, 0x0F, 0xEB, 0xEC, 0x3D, 0x9C, 0x3F, 0x0B, 0xFD, 0xC4, 0x1E, 0x9B, 0x50, 0xB7, 0xFF, 0x69, 0x91, 0xB2, 0xD0,
0xBB, 0x4D, 0x7D, 0x88, 0x7A, 0x49, 0x77, 0x31, 0xEE, 0xAA, 0x6C, 0x63, 0x62, 0x1B, 0x33, 0xA5, 0x46, 0xB3, 0x6D, 0x8C, 0x75, 0x25, 0x01, 0xE7, 0xEF, 0x4E, 0x3E, 0x0E, 0x90, 0x64, 0x08, 0x44,
0x8A, 0xAC, 0x0C, 0x94, 0xDD, 0xBD, 0xE8, 0xD1, 0x2F, 0xF1, 0x8A, 0x50, 0xF0, 0x50, 0xF6, 0x00, 0xC9, 0x9F, 0x39, 0x72, 0x24, 0xD2, 0xFB, 0x45, 0x74, 0xFB, 0xC6, 0xE1, 0x9F, 0x19, 0xFC, 0x69,
0xA9, 0x3A, 0x70, 0x1A, 0x0F, 0x10, 0xBA, 0x81, 0xE4, 0x79, 0x5D, 0x0C, 0x23, 0xAD, 0x65, 0x8D, 0x25, 0xED, 0x7F, 0x5B, 0x6A, 0xA0, 0xCA, 0x78, 0xA7, 0x23, 0x2D, 0xB1, 0xA2, 0x63, 0xBD, 0x14,
0x87, 0x56, 0x47, 0x88, 0x3C, 0x0D, 0x73, 0xE1, 0xCA, 0xE6, 0x2A, 0x66, 0x02, 0x17, 0x2A, 0x98, 0x44, 0x0A, 0x3F, 0x0B, 0x55, 0xE3, 0xE7, 0xF6, 0x05, 0xE5, 0xAF, 0xA9, 0xE6, 0x6D, 0x85, 0x69,
0xDA, 0x93, 0x29, 0x60, 0x3B, 0xB9, 0x62, 0x6E, 0x65, 0xB3, 0x3C, 0x34, 0x5E, 0xCF, 0xFF, 0x24, 0xC4, 0xF0, 0xDF, 0xFA, 0x8B, 0x7F, 0xBC, 0x04, 0x25, 0x6C, 0xEF, 0xBE, 0xDD, 0x48, 0x2A, 0x97,
0x73, 0x95, 0x48, 0xA6, 0xA8, 0x1A, 0x76, 0x36, 0xCF, 0xB0, 0x1A, 0x72, 0x54, 0x00, 0x85, 0x1E, 0x2A, 0xAC, 0x9D, 0x1C, 0xAC, 0xA1, 0xC5, 0x41, 0x33, 0x58, 0xD3, 0x2D, 0x6C, 0xFB, 0xDA, 0x4A,
0x76, 0x5E, 0x11, 0x95, 0xE8, 0x4E, 0x14, 0xAE, 0x83, 0x72, 0xB3, 0xA1, 0x8E, 0xC6, 0x25, 0xF3, 0x33, 0x2F, 0x66, 0xAE, 0x47, 0xA0, 0xEE, 0xDB, 0x26, 0x9E, 0xC9, 0x20, 0x0F, 0x9A, 0x79, 0xDE,
0xB9, 0x60, 0x9C, 0xBF, 0x6E, 0xD9, 0xF1, 0x58, 0xB1, 0x90, 0x4A, 0x1B, 0xE7, 0x6A, 0x3B, 0x97, 0xD6, 0x6D, 0xF1, 0x31, 0x0C, 0x6C, 0x96, 0xDC, 0x4F, 0x1C, 0xF8, 0x54, 0xC5, 0xA0, 0x89, 0xB8,
0xB8, 0xC2, 0x0D, 0xC3, 0xA3, 0xB8, 0xA6, 0x52, 0x3B, 0xAB, 0x12, 0x3B, 0x72, 0xB3, 0x3F, 0x52, 0xB9, 0x6B, 0x6D, 0x1D, 0xCB, 0x2A, 0xD3, 0x41, 0xD8, 0x56, 0xF0, 0xF2, 0x27, 0x32, 0x92, 0x70,
0x3C, 0x0F, 0x4D, 0x0A, 0x10, 0x4E, 0xFA, 0x40, 0x6E, 0xBC, 0xF5, 0x7F, 0xD3, 0x88, 0x8A, 0x86, 0x6E, 0xFC, 0x6F, 0x4B, 0xF2, 0xA3, 0x10, 0xE5, 0xD9, 0xC2, 0x7B, 0x19, 0x62, 0xA4, 0x88, 0x04,
0xD0, 0x11, 0x28, 0xFB, 0xC8, 0xFF, 0xD2, 0x02, 0x39, 0x9F, 0x8A, 0x5D, 0x00, 0x0E, 0xE7, 0xA0, 0x14, 0xB5, 0x11, 0x7B, 0x81, 0x81, 0x8F, 0xFC, 0xAC, 0x8A, 0xBF, 0x7D, 0xE8, 0x49, 0x11, 0x0F,
0xB7, 0x66, 0x73, 0x77, 0x82, 0x5F, 0x49, 0x55, 0xBE, 0x01, 0xFE, 0x87, 0x66, 0x17, 0x4F, 0x27, 0xA1, 0xC4, 0x09, 0xC6, 0xCE, 0xC8, 0xA2, 0x5D, 0xFF, 0x4B, 0x9B, 0x10, 0xB2, 0x0D, 0xD7, 0x1C,
0x86, 0x45, 0x32, 0x04, 0x16, 0xCB, 0x54, 0x34, 0x31, 0x64, 0x26, 0xB3, 0xE2, 0x6D, 0x58, 0x1A, 0xA1, 0xB6, 0xE1, 0x48, 0x16, 0x3D, 0x04, 0xFD, 0x3E, 0x61, 0x31, 0xB5, 0xE5, 0xDC, 0x57, 0x06,
0xC8, 0x3D, 0xFE, 0xFD, 0xF0, 0xCA, 0x4F, 0x93, 0x75, 0x93, 0xF8, 0xEA, 0x19, 0xF3, 0x56, 0xCA, 0x25, 0x39, 0x0B, 0xC0, 0xC2, 0xB8, 0x93, 0xF9, 0xBA, 0xEC, 0x5E, 0x1F, 0xD0, 0x52, 0xA4, 0x55,
0xF7, 0x97, 0xDD, 0xC8, 0xF5, 0x08, 0x93, 0x31, 0x60, 0x7A, 0xAD, 0xE6, 0xFB, 0x25, 0xA3, 0xDF, 0x85, 0x79, 0xEF, 0xC2, 0xA6, 0x44, 0x98, 0x7F, 0xD7, 0xF5, 0xB1, 0x0F, 0x0B, 0xA6, 0x95, 0x78,
0x61, 0x6B, 0xEC, 0xE7, 0x60, 0xA1, 0x82, 0xFA, 0x2D, 0xD0, 0x60, 0x42, 0xAF, 0x3D, 0x6D, 0x21, 0x2C, 0x40, 0x11, 0xF6, 0x3D, 0x5C, 0x7A, 0x43, 0xEC, 0x62, 0xE0, 0x4E, 0x63, 0x41, 0x73, 0xB7,
0x03, 0xDA, 0xB9, 0x64, 0xFC, 0x5D, 0x11, 0x6B, 0x31, 0x99, 0x32, 0x03, 0x1D, 0x74, 0x52, 0xCE, 0x4E, 0x27, 0x7A, 0x45, 0x51, 0xF5, 0x52, 0xFB, 0xC8, 0x1C, 0xB5, 0x6C, 0x9A, 0x18, 0x9F, 0xAD,
0x71, 0x53, 0x70, 0x6A, 0xEB, 0x76, 0xCA, 0x30, 0x22, 0x62, 0xF5, 0x84, 0xEF, 0x4B, 0x94, 0x7D, 0x7D, 0xC6, 0xF1, 0x36, 0xF3, 0x05, 0x0D, 0x8E, 0x9E, 0x01, 0x9B, 0x26, 0x56, 0x01, 0xEF, 0x4E,
0x7E, 0xE0, 0xF2, 0x73, 0x88, 0x8A, 0xA9, 0xF2, 0x73, 0xCC, 0x7B, 0xCA, 0x29, 0x1B, 0x1D, 0x5B, 0x73, 0x82, 0xC6, 0x23, 0x48, 0xFE, 0xB0, 0x03, 0xA6, 0xAF, 0x30, 0x51, 0xB1, 0xAE, 0xB1, 0x1C,
0x57, 0xA6, 0x74, 0x3F, 0xFC, 0xD8, 0x13, 0xC9, 0xD8, 0x96, 0x13, 0x24, 0xE5, 0x7E, 0x5F, 0x3E, 0x2C, 0x62, 0xE5, 0xAB, 0x48, 0x5C, 0xE3, 0xD3, 0x22, 0x16, 0x93, 0xDD, 0xD7, 0x12, 0xE3, 0x15,
0x11, 0x95, 0x10, 0x19, 0xF2, 0xB6, 0x6E, 0xEF, 0xBB, 0x70, 0x2E, 0x59, 0xF2, 0x10, 0x91, 0x81, 0xF0, 0x58, 0xFE, 0x95, 0xBC, 0x6F, 0x1E, 0x1E, 0x73, 0x00, 0xC8, 0xD2, 0x84, 0x68, 0xE5, 0x89,
0xEF, 0xE0, 0x76, 0x78, 0x22, 0x5B, 0x68, 0x8D, 0xE9, 0x83, 0xBF, 0xE3, 0x5C, 0xF6, 0xBA, 0xF4, 0x4C, 0x68, 0x78, 0xC6, 0x5B, 0xD6, 0x0F, 0xE9, 0x85, 0xFE, 0x6B, 0x99, 0x60, 0xBF, 0x15, 0x04,
0x6A, 0xD7, 0x30, 0x1F, 0x87, 0x48, 0x5E, 0xA9, 0xF3, 0x19, 0xD5, 0xD1, 0xE1, 0xFE, 0xC3, 0xC8, 0x05, 0x61, 0xE9, 0xC1, 0x03, 0x9B, 0x83, 0x63, 0x7C, 0x7E, 0x6D, 0x83, 0x71, 0x03, 0x23, 0x12,
0x1F, 0x97, 0x7A, 0xE0, 0x87, 0x75, 0xED, 0xDB, 0x06, 0xD1, 0x8F, 0xC8, 0x4F, 0x7E, 0x93, 0x93, 0xF5, 0x3E, 0x37, 0x56, 0x8F, 0x29, 0x7E, 0xCB, 0xA6, 0xAB, 0xB6, 0xA3, 0x7E, 0xFD, 0xE4, 0x60,
0x31, 0x86, 0x1A, 0x9A, 0x26, 0x53, 0x3C, 0x32, 0x3B, 0xAB, 0xB2, 0x7A, 0xF5, 0x7D, 0xE6, 0x88, 0x48, 0x8A, 0x5A, 0xCA, 0x42, 0x50, 0x56, 0x6B, 0x2B, 0xBB, 0xBA, 0x94, 0x9A, 0x0F, 0xDF, 0x76,
0xAD, 0x4F, 0x3C, 0xA2, 0x29, 0xB2, 0xBA, 0x0D, 0xFD, 0x95, 0x0E, 0xB6, 0x1F, 0xC3, 0x4E, 0xA2, 0x59, 0x9E, 0x37, 0x66, 0x22, 0x22, 0x88, 0x7F, 0xA9, 0x78, 0x21, 0xE7, 0x7F, 0xFC, 0x17, 0x0D,
0x18, 0x5E, 0x9C, 0x7C, 0x06, 0xDA, 0x7A, 0x52, 0x77, 0x5C, 0xD3, 0xE8, 0x85, 0xF0, 0x2D, 0xF7, 0xBA, 0x8C, 0x95, 0xAC, 0xC9, 0xCF, 0x64, 0x2C, 0x35, 0xEA, 0xF7, 0x70, 0x9D, 0x3F, 0xE0, 0x3C,
0x98, 0x64, 0x33, 0xF1, 0xD9, 0xCE, 0x18, 0x60, 0xB5, 0x83, 0xE9, 0x16, 0xAC, 0x1F, 0xF0, 0x54, 0xAB, 0x38, 0x3B, 0x7E, 0x25, 0x30, 0xCA, 0x91, 0x71, 0xDB, 0xD7, 0x12, 0xF9, 0xDF, 0x2E, 0xEC,
0xB7, 0x0F, 0x1D, 0xBF, 0xE7, 0x08, 0x12, 0x44, 0xCE, 0xDA, 0xEE, 0xDA, 0x22, 0x9A, 0x1B, 0x52, 0x8E, 0x8D, 0x5F, 0x68, 0x7B, 0x73, 0xCC, 0x99, 0xB3, 0x8F, 0x2B, 0x9F, 0x0F, 0xA2, 0x5F, 0x8A,
0xF5, 0xB2, 0xC4, 0x85, 0x05, 0x73, 0xFE, 0xB5, 0x72, 0x1B, 0x94, 0x34, 0xDB, 0x5D, 0xAF, 0xA2, 0xB8, 0x7F, 0x89, 0x4B, 0x37, 0x22, 0x56, 0x35, 0xCC, 0x75, 0xE7, 0x21, 0x8B, 0x9A, 0x6D, 0xEB,
0x9B, 0x63, 0xDE, 0x1C, 0x00, 0xA9, 0x53, 0x58, 0x4A, 0x0E, 0x35, 0x80, 0x59, 0x2A, 0xD6, 0x37, 0x4C, 0xD4, 0x73, 0xCE, 0x41, 0x6F, 0xEA, 0x83, 0xAD, 0x6A, 0xFD, 0xB2, 0x07, 0x5A, 0x46, 0xC3,
0x1E, 0xC1, 0x45, 0x15, 0x1E, 0xB7, 0xBE, 0x2E, 0xF8, 0x2C, 0x44, 0xA4, 0x54, 0x42, 0x2A, 0xF8, 0x51, 0xDA, 0x3B, 0x1F, 0x91, 0x8B, 0xCB, 0x32, 0x5D, 0xD8, 0x0A, 0x60, 0x16, 0xEE, 0xB8, 0x2E,
0x8E, 0x3D, 0xA9, 0xFC, 0xCC, 0x0A, 0xE0, 0x68, 0x73, 0xB3, 0x72, 0x1E, 0x7F, 0x5C, 0xD3, 0x1C, 0xAC, 0x86, 0xF0, 0x8C, 0x8A, 0x19, 0xC7, 0x0A, 0x45, 0x31, 0x4C, 0xD5, 0x45, 0x4E, 0xC4, 0x91,
0x27, 0x94, 0x52, 0xF5, 0x55, 0xD3, 0xC6, 0x18, 0xB0, 0xF4, 0x61, 0xAD, 0x5B, 0xFF, 0xA3, 0xCE, 0x26, 0xB9, 0x9E, 0x59, 0x77, 0x0B, 0x40, 0x3E, 0x67, 0xBA, 0x69, 0xA7, 0x00, 0x16, 0x41, 0x3B,
0x06, 0x24, 0xB2, 0x01, 0x64, 0xF0, 0xC4, 0x7C, 0xC9, 0xD8, 0x44, 0x6A, 0x60, 0xCC, 0x0F, 0x4C, 0x1E, 0x46, 0xA9, 0x94, 0x7D, 0xF1, 0xAA, 0xE4, 0x3E, 0x50, 0xBA, 0xA7, 0x9C, 0x27, 0x9A, 0x2A,
0x51, 0x29, 0x50, 0xC3, 0x02, 0x00, 0x29, 0xD4, 0xA2, 0x2E, 0xFC, 0xA1, 0x6D, 0xF3, 0x8A, 0x4A, 0x0E, 0x25, 0x1F, 0x64, 0x90, 0x01, 0x96, 0xFE, 0x50, 0x72, 0x35, 0xB9, 0xB3, 0xE0, 0xBE, 0xF2,
0xE6, 0xC4, 0x1C, 0x33, 0xBD, 0xEC, 0x64, 0x11, 0x49, 0xE8, 0xEA, 0xBE, 0xD4, 0xEE, 0xAF, 0x9B, 0xBE, 0xCC, 0x43, 0xCB, 0x50, 0xC5, 0xEF, 0x06, 0x83, 0x63, 0x9E, 0x9C, 0xDE, 0xD9, 0x39, 0x19,
0x20, 0x44, 0xFF, 0x08, 0x02, 0x52, 0x9C, 0xCC, 0xC1, 0x66, 0xFC, 0x94, 0xB4, 0x03, 0x7F, 0x9E, 0xF3, 0xC0, 0x5C, 0x12, 0x56, 0xF0, 0xDE, 0x6A, 0xC1, 0x5D, 0x38, 0x59, 0x59, 0xA8, 0x02, 0xDD,
0xE2, 0xCE, 0x62, 0x7E, 0xA0, 0x53, 0x5C, 0x43, 0x31, 0x4D, 0x1A, 0xB2, 0x9C, 0x02, 0x79, 0x6D, 0x41, 0x4E, 0x5E, 0xD4, 0x43, 0x1C, 0x54, 0x80, 0x15, 0x2D, 0xD8, 0xCE, 0x38, 0xA1, 0x56, 0xF0,
0x4D, 0xCB, 0x57, 0x09, 0x21, 0x8F, 0xD7, 0x06, 0xD6, 0x8E, 0x71, 0x22, 0xB2, 0x19, 0xD5, 0x57, 0xB9, 0xB2, 0xB4, 0xA6, 0x7F, 0xC4, 0x7A, 0x80, 0x7E, 0x78, 0xCD, 0xD2, 0xCC, 0xC0, 0x43, 0x7C,
0x1D, 0x61, 0x26, 0xB7, 0x57, 0xFC, 0xA6, 0x9D, 0x67, 0xA2, 0xE2, 0x51, 0x9A, 0x18, 0x0A, 0xF4, 0xD7, 0x67, 0x73, 0x27, 0x27, 0x66, 0xFB, 0x42, 0x30, 0x20, 0x56, 0x23, 0x96, 0x2D, 0x85, 0x34,
0x0C, 0x71, 0x6E, 0xF4, 0xC8, 0x40, 0x40, 0x34, 0x8B, 0x78, 0x9D, 0xB0, 0x34, 0x0D, 0x24, 0x86, 0x19, 0x85, 0xED, 0xC5, 0xBF, 0xEC, 0xD4, 0xAD, 0xC5, 0xFC, 0x03, 0xCF, 0x55, 0x37, 0x98, 0x94,
0x8B, 0x6E, 0x00, 0xD9, 0xF4, 0x3D, 0x76, 0xDB, 0x44, 0x4A, 0xCB, 0x7B, 0xD5, 0xA1, 0x7C, 0x00, 0xFF, 0x80, 0x02, 0xF6, 0xE8, 0x28, 0x21, 0x00, 0xB4, 0x48, 0xEA, 0xFC, 0x26, 0x07, 0xFE, 0xE0,
0x57, 0xC1, 0x66, 0x38, 0x63, 0x31, 0xA1, 0xE8, 0x61, 0x39, 0x1B, 0x28, 0xDC, 0xCB, 0xE9, 0x99, 0x84, 0x84, 0xA2, 0xC9, 0xEE, 0xF3, 0x70, 0xD3, 0xE2, 0x83, 0x7E, 0x77, 0xCD, 0x95, 0x5A, 0xF7,
0x1A, 0x18, 0x77, 0x9A, 0x29, 0xCA, 0xBA, 0xA8, 0x5B, 0xF4, 0x28, 0xA8, 0x43, 0x61, 0xE0, 0x03, 0x23, 0xE8, 0x90, 0x86, 0xC7, 0x78, 0xB4, 0xC9, 0x43, 0x16, 0x09, 0x07, 0x50, 0x66, 0x60, 0x8F,
0x45, 0xA9, 0x7D, 0x86, 0xF8, 0x14, 0xA9, 0xCC, 0x42, 0x27, 0xF7, 0xED, 0x57, 0x10, 0x50, 0x66, 0xA8, 0xAB, 0xBC, 0x20, 0x1E, 0x69, 0xBF, 0x4E, 0xA9, 0x4E, 0xBC, 0x4B, 0xBB, 0x4F, 0x10, 0x5D,
0x61, 0x09, 0xB0, 0x3A, 0x0C, 0x09, 0x37, 0x5F, 0x43, 0x2C, 0x33, 0x9C, 0x08, 0x12, 0x54, 0x1B, 0x58, 0x4B, 0x2B, 0x2C, 0x78, 0x4E, 0x52, 0x40, 0xEF, 0x34, 0x22, 0x1C, 0xD4, 0x32, 0xE5, 0x80,
0x72, 0x6E, 0x4D, 0x00, 0xB1, 0x53, 0x51, 0xCC, 0xE3, 0xB7, 0xE7, 0x98, 0x14, 0x3D, 0x91, 0x91, 0x88, 0x9F, 0xDA, 0x06, 0xE6, 0x6D, 0x25, 0x2A, 0x6D, 0xA6, 0xFF, 0x98, 0xD7, 0x2C, 0xBF, 0xC9,
0xB2, 0x0E, 0xF0, 0x79, 0x3E, 0x01, 0x7C, 0x86, 0x09, 0x9A, 0xA5, 0x22, 0x75, 0x0D, 0xB8, 0xB2, 0x11, 0x9B, 0xE3, 0xF9, 0x45, 0x7F, 0x8C, 0x31, 0x09, 0xEC, 0xC1, 0xAE, 0xBF, 0x09, 0x68, 0x8C,
0x95, 0xDF, 0x48, 0x4E, 0x8A, 0xBE, 0x26, 0xC3, 0xE9, 0x97, 0x54, 0x9B, 0xCC, 0x1B, 0xA9, 0xD3, 0x90, 0x4C, 0x27, 0x85, 0xB4, 0x8F, 0x65, 0x01, 0xD4, 0xA8, 0x69, 0xE3, 0x07, 0x39, 0xA3, 0x23,
0xC4, 0x85, 0x64, 0x6E, 0x17, 0x72, 0x9E, 0x76, 0x4D, 0x07, 0x06, 0x68, 0xE4, 0xEF, 0x14, 0x41, 0x5A, 0x96, 0xFA, 0xC3, 0xF9, 0x8F, 0x9A, 0xA1, 0xD5, 0xB6, 0x39, 0x82, 0xEC, 0xB2, 0xD8, 0x9E,
0xDA, 0x4D, 0x0A, 0x77, 0xD9, 0x9F, 0x25, 0xBF, 0xDB, 0xFE, 0x9B, 0x62, 0x0E, 0x20, 0x81, 0x06, 0x4F, 0x24, 0xAA, 0xDA, 0x6D, 0x51, 0x16, 0xCF, 0x4A, 0x8A, 0x8C, 0x0E, 0xE7, 0x6D, 0xF3, 0x35,
0x9B, 0x4B, 0x91, 0x9F, 0xB6, 0x2B, 0x7C, 0xB3, 0x4F, 0x56, 0xF8, 0x95, 0xD0, 0x56, 0x12, 0x51, 0x6F, 0x26, 0x30, 0x13, 0x78, 0xC0, 0xA1, 0x9F, 0x9B, 0x30, 0x7F, 0x7C, 0x84, 0x9B, 0xEE, 0xD6,
0x17, 0x64, 0x73, 0xDA, 0x2C, 0x82, 0x01, 0xFF, 0x40, 0xC6, 0x44, 0x78, 0xED, 0x90, 0xED, 0x24, 0xA0, 0x89, 0xC7, 0x7F, 0xDB, 0x34, 0x4F, 0x9A, 0xB6, 0xA8, 0x33, 0x22, 0xA1, 0xF5, 0x4C, 0x2F,
0xC2, 0x57, 0x87, 0x4C, 0xA6, 0x72, 0x52, 0x41, 0xE4, 0x5D, 0x3C, 0xF6, 0xA0, 0x67, 0x08, 0xD5, 0xC2, 0x17, 0x92, 0xBF, 0x90, 0xE3, 0x65, 0xA3, 0x1D, 0x7F, 0xDB, 0xE0, 0x0B, 0x47, 0x2B, 0xC2,
0xDD, 0xF8, 0xCE, 0x7E, 0x8F, 0x78, 0xFD, 0x77, 0x07, 0xF8, 0xBE, 0x83, 0x18, 0x8F, 0xFA, 0xB3, 0x53, 0xEC, 0xD6, 0x0B, 0xFD, 0x55, 0x93, 0x5C, 0x26, 0xB5, 0x31, 0x8B, 0x19, 0xDB, 0x20, 0xFD,
0xFC, 0xC3, 0x1C, 0xC3, 0x3A, 0x82, 0xC4, 0xB1, 0xBE, 0x90, 0x9F, 0x30, 0x21, 0x3B, 0x10, 0xEA, 0xFE, 0xA8, 0xD6, 0x3A, 0x3C, 0xC4, 0x63, 0x36, 0x69, 0x23, 0x5E, 0x3E, 0xF1, 0x19, 0xD0, 0x8C,
0x82, 0x7E, 0x0E, 0x60, 0xE7, 0xFF, 0x6E, 0x09, 0x90, 0xBF, 0xD4, 0xE5, 0xDB, 0x3E, 0x0B, 0x64, 0xD6, 0x83, 0xDE, 0x05, 0xC5, 0x18, 0xE2, 0x52, 0x79, 0x2D, 0x7E, 0x49, 0x17, 0xBF, 0x35, 0x22,
0x62, 0x07, 0x10, 0x59, 0x3D, 0xAB, 0x80, 0x09, 0xFC, 0xB6, 0xA8, 0x99, 0x81, 0xEF, 0xFE, 0x8F, 0xDE, 0x4D, 0xF5, 0xB9, 0xD4, 0xD1, 0x00, 0xE4, 0x31, 0x5D, 0x1E, 0x3A, 0x4B, 0xDC, 0xCF, 0x58,
0x77, 0xC2, 0x4A, 0xD8, 0x0A, 0xBA, 0xDC, 0xB7, 0x6F, 0x60, 0x53, 0xA7, 0x42, 0x3B, 0x3C, 0xE5, 0xE5, 0x3E, 0x1F, 0xF1, 0xA8, 0x40, 0x21, 0xED, 0x2B, 0x10, 0x55, 0x8C, 0x2F, 0x2F, 0x3E, 0xE5,
0x46, 0x5B, 0xA5, 0x9D, 0x0E, 0x5C, 0x38, 0x33, 0x10, 0x90, 0x1F, 0x2E, 0x5C, 0x08, 0xA2, 0x2B, 0x70, 0x8B, 0x45, 0x33, 0x11, 0x5C, 0xA7, 0x74, 0xBC, 0xA4, 0x79, 0xC8, 0xC0, 0x7D, 0x53, 0xF4,
0xBF, 0xAE, 0xA5, 0xDA, 0x11, 0x90, 0x2B, 0x06, 0x1C, 0x28, 0x54, 0xE6, 0x0D, 0x5D, 0x27, 0x33, 0xDD, 0xB5, 0xB4, 0x2D, 0x44, 0x73, 0xA8, 0xE9, 0x2E, 0x71, 0x56, 0x77, 0x0E, 0x59, 0xCA, 0xFB,
0xC0, 0xDF, 0x43, 0x74, 0xAE, 0x9C, 0xA0, 0x62, 0x77, 0x47, 0x24, 0xA3, 0x99, 0x16, 0x47, 0xD8, 0xCD, 0xDE, 0xBA, 0xF4, 0x1A, 0x78, 0xDB, 0x59, 0xEC, 0x96, 0x4B, 0xC6, 0x56, 0x7D, 0xE1, 0xF8,
0x58, 0x05, 0x37, 0xA9, 0xCC, 0x00, 0xAD, 0x84, 0xE8, 0x11, 0x2C, 0x75, 0xF8, 0xBF, 0xC8, 0xCA, 0x15, 0x18, 0xB2, 0xDE, 0xF5, 0xD4, 0xA6, 0x90, 0xE9, 0x11, 0xAD, 0x8E, 0x0F, 0x6A, 0x9B, 0x20,
0x8E, 0x45, 0xD7, 0x69, 0xBF, 0x7C, 0x0D, 0x3F, 0x90, 0xDD, 0xFC, 0x0B, 0x70, 0x45, 0x5C, 0x40, 0xD3, 0x55, 0x10, 0x57, 0x25, 0x58, 0x82, 0xD0, 0x3C, 0xD4, 0x5C, 0xB0, 0x02, 0x62, 0x36, 0x07,
0xE4, 0x83, 0xEF, 0x79, 0xCA, 0x24, 0xD9, 0x3E, 0x2C, 0x3A, 0xA2, 0x39, 0xC3, 0x14, 0x7C, 0x69, 0xD4, 0xB7, 0xF7, 0xCA, 0x02, 0x4F, 0x8E, 0x88, 0x78, 0x77, 0xE0, 0x11, 0x9D, 0x9F, 0xEB, 0xF0,
0x4D, 0xA7, 0xC8, 0x1C, 0x92, 0x98, 0x8C, 0xDA, 0xEA, 0x30, 0x98, 0x68, 0x77, 0x26, 0x3E, 0x18, 0x61, 0xAA, 0xC8, 0xEA, 0xD6, 0x5F, 0x88, 0x8C, 0x8B, 0xE8, 0x5F, 0x6D, 0xB8, 0x3D, 0x61, 0x01,
0xEF, 0x0B, 0x99, 0x66, 0x5A, 0x0B, 0xBC, 0xA3, 0x0B, 0xF1, 0x81, 0x18, 0xF1, 0xE7, 0xDC, 0xFB, 0x69, 0x0E, 0x60, 0xE9, 0x82, 0x82, 0x5E, 0xAA, 0x88, 0x2E, 0xD2, 0x5B, 0x60, 0xA0, 0x48, 0xF6,
0x48, 0x18, 0x61, 0x09, 0x69, 0x52, 0x5E, 0x11, 0x88, 0x65, 0x02, 0xF2, 0xCE, 0xF0, 0x55, 0xF3, 0xC8, 0x8E, 0x4C, 0x1D, 0xEE, 0x47, 0x40, 0xC8, 0xE5, 0x62, 0x87, 0xF3, 0x5E, 0xEB, 0x6D, 0xB6,
0x20, 0x82, 0x3B, 0x1F, 0x35, 0x12, 0x69, 0xC1, 0x26, 0xDC, 0x19, 0xAA, 0x2F, 0x9B, 0xEE, 0x77, 0xF0, 0x88, 0xF2, 0x46, 0x64, 0xFB, 0xA4, 0x88, 0x72, 0x79, 0x27, 0xA6, 0xD1, 0x20, 0xE6, 0x62,
0xA5, 0x74, 0xF8, 0x0D, 0xE4, 0xE4, 0x8E, 0x9D, 0x31, 0xDA, 0x05, 0x1E, 0x75, 0xE3, 0xD4, 0x09, 0x21, 0xE3, 0x03, 0xD8, 0x0C, 0x97, 0x75, 0xB9, 0x3B, 0x91, 0xEB, 0xFA, 0x77, 0x7E, 0x35, 0x21,
0xFA, 0x22, 0xA3, 0x70, 0x84, 0xCC, 0x5A, 0xE2, 0xA5, 0x2B, 0xB3, 0x39, 0x05, 0x78, 0xB0, 0x47, 0x23, 0xF5, 0xB4, 0xB2, 0x1A, 0x77, 0xB8, 0x90, 0x2D, 0x93, 0xF3, 0xF9, 0xB0, 0xDF, 0x39, 0x59,
0x7E, 0xAF, 0x14, 0x5E, 0xE5, 0xAE, 0x0B, 0x87, 0x60, 0x36, 0x2E, 0xFE, 0xC9, 0x73, 0x98, 0x1E, 0xC4, 0xAB, 0x49, 0x77, 0xDD, 0x80, 0x0E, 0xBC, 0xF6, 0x2D, 0x3D, 0xA3, 0xDB, 0x4C, 0xE5, 0x25,
0x64, 0xC2, 0xED, 0x06, 0xD6, 0x09, 0xFF, 0x09, 0x5F, 0x83, 0xBF, 0xA8, 0x62, 0x84, 0x44, 0xC7, 0xEE, 0xB0, 0x72, 0xBF, 0x5D, 0x0E, 0x94, 0x1A, 0xBF, 0x7C, 0x18, 0x9B, 0x95, 0x58, 0xE6, 0x19,
0x7A, 0x74, 0x5C, 0xD7, 0x4D, 0x87, 0x18, 0x11, 0x39, 0xE2, 0x75, 0x2B, 0x5E, 0xEB, 0xCC, 0x9F, 0x41, 0x60, 0x20, 0xD1, 0x7B, 0x90, 0xF7, 0x98, 0x80, 0x47, 0x95, 0xF7, 0x3F, 0x7E, 0x67, 0xF1,
0xC9, 0x11, 0x8D, 0x37, 0xBF, 0xF5, 0x10, 0xD9, 0x5E, 0x03, 0xA2, 0x26, 0x3A, 0xA1, 0x68, 0x35, 0xEA, 0x61, 0x5A, 0xBF, 0xAB, 0x5B, 0x81, 0x65, 0xA2, 0x8A, 0x85, 0x75, 0x78, 0xA8, 0x49, 0x46,
0x39, 0xF8, 0x76, 0xC5, 0xDD, 0x4D, 0x28, 0x7D, 0x9D, 0x7B, 0x08, 0x5B, 0x66, 0x06, 0x3C, 0x1C, 0x76, 0xDC, 0x78, 0xAA, 0x09, 0x87, 0xFF, 0x1C, 0xC8, 0xD9, 0x49, 0xD8, 0xF4, 0x93, 0x1D, 0x03,
0x29, 0xA9, 0x5B, 0x9E, 0x5A, 0xBF, 0x3C, 0x38, 0x35, 0x5A, 0xE9, 0x55, 0x91, 0xA6, 0x78, 0xA7, 0xC8, 0x62, 0xDD, 0xDE, 0x3F, 0x43, 0xEF, 0xD5, 0x9F, 0xF5, 0xFD, 0x5C, 0x01, 0x17, 0xC4, 0xE5,
0x5E, 0x0F, 0x17, 0xBF, 0xFE, 0xF6, 0x9A, 0x68, 0xD6, 0x0B, 0xFF, 0x96, 0x34, 0x25, 0xBA, 0xD7, 0xBC, 0x27, 0x98, 0x20, 0xA1, 0x8A, 0x4B, 0x7C, 0x8C, 0x96, 0xCF, 0xA9, 0x6C, 0x9A, 0x82, 0x47,
0xF6, 0xFC, 0xD6, 0x3B, 0x0B, 0xD4, 0xCE, 0x45, 0xFB, 0xBB, 0x89, 0xC4, 0xF3, 0x8F, 0x26, 0x14, 0xD0, 0x70, 0x62, 0xF5, 0x97, 0x4B, 0x9C, 0xC7, 0xF7, 0x95, 0x60, 0x07, 0xF5, 0xF1, 0x3A, 0xCF,
0x1C, 0x5D, 0x4D, 0xF3, 0xA3, 0x07, 0x9B, 0x1E, 0x5E, 0xCA, 0xDB, 0x73, 0xBD, 0x35, 0x70, 0x92, 0xB7, 0x07, 0x18, 0xBE, 0xF5, 0xD7, 0x1B, 0x85, 0x2A, 0x02, 0x9E, 0xE5, 0x13, 0xA3, 0x4F, 0x79,
0xFC, 0xA4, 0x95, 0x64, 0xB3, 0x91, 0xE9, 0xE5, 0x89, 0x26, 0xE0, 0x41, 0x6F, 0x14, 0xAD, 0xF3, 0x6B, 0x08, 0x32, 0xE4, 0x20, 0x65, 0x7C, 0x93, 0x61, 0xDB, 0x33, 0x15, 0xAE, 0xA2, 0x56, 0x9D,
}
var sampleBlockFirmwareUncompressed = EncryptedBlock{
0x53, 0xAC, 0x9C, 0x3E, 0x05, 0xC1, 0xAF, 0x8A, 0x74, 0xE1, 0xDE, 0x10, 0xE8, 0x96, 0xCB, 0xD4, 0x04, 0x6F, 0xF1, 0x49, 0x32, 0x1D, 0x5A, 0x04, 0x2D, 0xB7, 0xBA, 0xEA, 0x83, 0x8A, 0xA7, 0x3F,
0x9B, 0x59, 0x54, 0xFB, 0x9F, 0xC5, 0x3C, 0x6A, 0x87, 0xC9, 0x2C, 0xBE, 0x33, 0x9F, 0x6D, 0x2B, 0xA5, 0x79, 0x0B, 0x16, 0x7A, 0xF1, 0xC0, 0x01, 0x53, 0x23, 0xC2, 0x53, 0x91, 0x98, 0x28, 0xD8,
0x56, 0xBA, 0x4D, 0xBE, 0x45, 0x7E, 0x7C, 0xD6, 0xA4, 0x0E, 0xCE, 0xC0, 0x9E, 0xAD, 0xFD, 0x62, 0xF7, 0x88, 0xA7, 0x61, 0x22, 0x54, 0x79, 0x09, 0x0A, 0xE1, 0x23, 0x3B, 0xFA, 0xB6, 0x7C, 0x5D,
0xDD, 0x8E, 0x56, 0xA6, 0x27, 0xC9, 0x66, 0x2D, 0x96, 0x13, 0x1F, 0x9F, 0x50, 0x75, 0xF4, 0xBA, 0xC1, 0xE6, 0xEB, 0x7A, 0xEC, 0x05, 0x35, 0x4D, 0x12, 0x24, 0x67, 0xC6, 0xB6, 0xF7, 0x81, 0x02,
0x5E, 0xB9, 0xC6, 0x7F, 0x37, 0x63, 0x94, 0x82, 0x92, 0x02, 0xD5, 0xBB, 0x76, 0x1D, 0x88, 0x0B, 0xC3, 0xC0, 0x36, 0x18, 0x9E, 0x0E, 0xFB, 0x8B, 0x94, 0xC1, 0x76, 0xFB, 0x2F, 0x5B, 0xCC, 0xEF,
0xA9, 0xD7, 0x44, 0xF2, 0xCF, 0x18, 0xF8, 0xB7, 0xBA, 0xD4, 0x69, 0x74, 0x7D, 0xBD, 0x9D, 0xA8, 0x62, 0xAF, 0x00, 0xDF, 0xDE, 0xD6, 0x5C, 0xAC, 0x2E, 0x4F, 0xA0, 0x4A, 0x83, 0x2D, 0x4F, 0x7C,
0x92, 0xDB, 0xE5, 0xA8, 0x81, 0xA9, 0xBA, 0x1E, 0xAF, 0x29, 0x89, 0x76, 0xFD, 0xF4, 0x3B, 0x38, 0x97, 0xB7, 0x2D, 0x60, 0x34, 0xEC, 0x30, 0x97, 0xA4, 0x78, 0xC8, 0x58, 0x4A, 0x0B, 0x4B, 0xB0,
0xCF, 0x02, 0xD6, 0x86, 0x9C, 0x92, 0x29, 0x15, 0xFA, 0x91, 0x11, 0xE1, 0x06, 0x5A, 0xCC, 0x4C, 0x42, 0x38, 0x4E, 0x80, 0xF8, 0x03, 0x5C, 0xBA, 0xD4, 0x72, 0x80, 0xFA, 0x82, 0xA3, 0xF7, 0x36,
0xF6, 0x0F, 0x09, 0x71, 0x10, 0x1D, 0x2F, 0x1D, 0x56, 0xAD, 0x21, 0xD2, 0x87, 0x66, 0xF4, 0xB0, 0x89, 0x16, 0xB8, 0x7D, 0xCF, 0xBF, 0x85, 0x4E, 0xBA, 0xC6, 0x50, 0x53, 0x91, 0x09, 0x31, 0x96,
0x7E, 0x7A, 0x50, 0x60, 0x90, 0xC1, 0xD1, 0x53, 0x29, 0x9B, 0x74, 0x0C, 0x2A, 0xFB, 0x0E, 0x6E, 0xDF, 0xC9, 0xC1, 0xF7, 0x5A, 0x88, 0x2C, 0x46, 0x4F, 0xBF, 0xF4, 0x2A, 0x62, 0x63, 0x39, 0x52,
0xB2, 0xD3, 0xCA, 0x8C, 0xDA, 0xFB, 0x7F, 0xFF, 0x1C, 0xDC, 0x0E, 0x8C, 0xCB, 0xA9, 0x3E, 0x00, 0x0A, 0x1C, 0xE3, 0x23, 0xD6, 0x74, 0x8C, 0xA7, 0x8D, 0x83, 0x0D, 0x34, 0x9D, 0xA7, 0xA7, 0xBA,
0x4F, 0xEC, 0x18, 0x15, 0xF8, 0x1F, 0xEC, 0xB2, 0xBE, 0xE5, 0xF7, 0x58, 0x72, 0xEA, 0x48, 0xDD, 0x2C, 0x4A, 0xD4, 0x25, 0x99, 0x53, 0x16, 0xF5, 0xA4, 0x28, 0x7E, 0x1C, 0x83, 0xA8, 0x83, 0x20,
0x3C, 0x88, 0x96, 0x1F, 0x4B, 0xEF, 0x74, 0xE1, 0xB7, 0xA9, 0x8E, 0xFD, 0x85, 0x23, 0x57, 0x7D, 0x80, 0x57, 0xC6, 0x47, 0x8B, 0xFE, 0xF4, 0xB7, 0xD4, 0x7E, 0x24, 0xC0, 0x61, 0xEA, 0x79, 0xAD,
0x52, 0xE9, 0x9A, 0x33, 0x30, 0x3B, 0x89, 0xDA, 0x9C, 0x97, 0xB5, 0xD0, 0xA8, 0x15, 0x38, 0x58, 0xDD, 0x36, 0xE2, 0x10, 0xAE, 0x0E, 0x28, 0xB1, 0xC1, 0x23, 0x80, 0xD7, 0xFF, 0xED, 0xB5, 0x75,
0x78, 0x3B, 0x25, 0x7E, 0x4C, 0xD9, 0x61, 0x6C, 0x39, 0x20, 0xB5, 0x71, 0xA2, 0x49, 0xBC, 0xA7, 0xA7, 0x7A, 0x4A, 0x4D, 0xC4, 0x5A, 0xFC, 0xC9, 0x59, 0x4E, 0x3F, 0x54, 0x66, 0xC4, 0x76, 0xA5,
0x87, 0xEA, 0xCE, 0xA8, 0xC8, 0x03, 0x88, 0x49, 0x0C, 0x68, 0xD0, 0xA9, 0xC2, 0x56, 0x5C, 0x0D, 0x4E, 0xC8, 0xC6, 0xBB, 0x66, 0x68, 0xF7, 0x65, 0x7B, 0xDC, 0x90, 0x69, 0xFB, 0xD0, 0xA3, 0xA2,
0x76, 0x36, 0xF5, 0x63, 0x28, 0x10, 0x5A, 0x82, 0x0B, 0x80, 0x6D, 0x70, 0xA1, 0x05, 0x4F, 0xA2, 0x7B, 0xFD, 0xC3, 0xBA, 0xFE, 0x38, 0x87, 0x7A, 0xBE, 0x9A, 0xA6, 0x41, 0x19, 0xFB, 0xC4, 0x31,
0x98, 0x55, 0x69, 0x50, 0xF2, 0x78, 0x9A, 0xF4, 0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08,
0x1B, 0x44, 0x47, 0xA1, 0xC0, 0x47, 0x22, 0x7F, 0x6D, 0x99, 0x05, 0xB0, 0x36, 0x3E, 0xD8, 0x45, 0xB7, 0x76, 0x23, 0xDF, 0x73, 0x79, 0x87, 0x6F, 0x39, 0x85, 0x08, 0xAE, 0xC4, 0xCB, 0xAF, 0x1B,
0x48, 0xA8, 0xFD, 0xF1, 0x8D, 0xD0, 0xE7, 0xF1, 0x4A, 0x96, 0x82, 0xDA, 0xA4, 0xB9, 0xEC, 0x11, 0x5F, 0xD4, 0x47, 0x39, 0xA8, 0xB8, 0x93, 0x31, 0x58, 0x1A, 0x17, 0x1A, 0x89, 0x27, 0xB0, 0xF7,
0x28, 0x1F, 0x7D, 0x91, 0x74, 0x92, 0x35, 0x00, 0x11, 0x19, 0xDB, 0xCB, 0x2C, 0x40, 0x00, 0xA8, 0xDA, 0xF0, 0xF5, 0xE9, 0x04, 0x2A, 0x68, 0xF7, 0xB4, 0x22, 0x3F, 0x91, 0x32, 0xB5, 0xFA, 0x8D,
0x74, 0x75, 0x01, 0x10, 0xF3, 0xAB, 0xC2, 0xAC, 0x3C, 0x30, 0x5E, 0x83, 0xFC, 0xAC, 0x5A, 0x64, 0x6E, 0xDB, 0x6F, 0x79, 0x1A, 0xA6, 0x10, 0x3F, 0xB3, 0x67, 0x94, 0x86, 0x24, 0x39, 0xCD, 0x68,
0xB9, 0x9A, 0xF0, 0x84, 0x20, 0xE4, 0x4B, 0x0F, 0x36, 0x0D, 0xB4, 0x86, 0x98, 0x1E, 0x00, 0x98, 0x0E, 0x9E, 0x2E, 0x67, 0x94, 0x9F, 0xB0, 0x0F, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0,
0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x07, 0x9B, 0xD1, 0xF5, 0x0E, 0xBF, 0x3D, 0x55, 0xE5, 0x57, 0x6E, 0x05, 0xAF, 0x70, 0x80, 0x1C, 0x8C, 0x8D, 0xFC, 0x7A, 0x1B, 0x58, 0x09, 0xA1,
0x0E, 0x9E, 0x2E, 0x67, 0x94, 0x9F, 0xB0, 0x0F, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x07, 0x9B, 0xD1, 0xF5, 0x0E, 0xBF, 0x3D, 0x55,
0x58, 0xCE, 0x00, 0x61, 0x9F, 0xAA, 0x41, 0xE6, 0x86, 0x39, 0xA0, 0x89, 0x07, 0x9C, 0x6D, 0x18, 0xD8, 0x2D, 0x3C, 0x66, 0x6E, 0x60, 0x61, 0xB9, 0x52, 0x6B, 0xFD, 0x2C, 0x7D, 0x60, 0x31, 0xC0,
0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93, 0xCE, 0xCB, 0x77, 0x3E, 0x85, 0x85, 0x70, 0x1F, 0x52, 0x21, 0x7C, 0xD9, 0xB8, 0x5A, 0x18, 0x34,
0xE2, 0xF1, 0x11, 0x11, 0xB1, 0x74, 0xF3, 0x27, 0x2D, 0x10, 0x22, 0x64, 0x03, 0x29, 0xCD, 0x67, 0x36, 0xCD, 0x90, 0x10, 0x1B, 0x47, 0xF9, 0x25, 0xB6, 0x04, 0x0A, 0x6A, 0x5C, 0x63, 0x4B, 0x8F,
0x3F, 0xFB, 0xA4, 0x36, 0xCD, 0xF2, 0xB5, 0x5F, 0xAF, 0x2C, 0xBF, 0x25, 0x5D, 0x31, 0x44, 0x29, 0x29, 0x09, 0x21, 0x9B, 0x28, 0x32, 0x1D, 0x4D, 0xE7, 0xC5, 0xE1, 0x9E, 0x67, 0xF9, 0x9D, 0x4F,
0x29, 0x09, 0x21, 0x9B, 0x28, 0x32, 0x1D, 0x4D, 0xE7, 0xC5, 0xE1, 0x9E, 0x67, 0xF9, 0x9D, 0x4F, 0xAF, 0x9E, 0x5D, 0x61, 0x55, 0x49, 0x78, 0x3D, 0xA1, 0xE8, 0x80, 0xB2, 0x69, 0x0A, 0x5F, 0xB3,
0xD0, 0x5E, 0x06, 0x23, 0xAE, 0xA6, 0x7D, 0x78, 0xF9, 0xCC, 0x3E, 0x64, 0x70, 0x1E, 0xB5, 0x90, 0x20, 0x8A, 0x69, 0x70, 0x01, 0x3A, 0xF5, 0x2F, 0x81, 0x3D, 0x47, 0x57, 0x19, 0x6A, 0x77, 0xF5,
0x8B, 0x06, 0x83, 0x0E, 0x17, 0x8D, 0x51, 0x86, 0x98, 0x55, 0xF8, 0x3F, 0x5B, 0x34, 0x53, 0x63, 0x8D, 0xA4, 0xE3, 0x37, 0x44, 0x2D, 0xC6, 0xA3, 0x97, 0xC5, 0x9B, 0xFE, 0xCF, 0x93, 0x75, 0xC5,
0xDD, 0x6C, 0xF3, 0xD5, 0x7D, 0x3A, 0xCC, 0xF0, 0x6F, 0x42, 0x99, 0xF6, 0xF6, 0x05, 0x65, 0x07, 0x0A, 0xD1, 0x8C, 0x04, 0xA2, 0x38, 0x4C, 0xDA, 0xA9, 0xB7, 0xAD, 0x54, 0x02, 0xEA, 0x54, 0xB4,
0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08, 0xDE, 0x48, 0x0D, 0x83, 0x77, 0xB3, 0x3C, 0xBA, 0x86, 0xBE, 0x42, 0xCC, 0xDF, 0xCE, 0x44, 0x7E, 0x16, 0x69, 0x28, 0xFF, 0x40, 0xA8, 0x5E, 0xEA,
0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08, 0xDE, 0x48, 0x0D, 0x83, 0x77, 0xB3, 0x3C, 0xBA,
0x86, 0xBE, 0x42, 0xCC, 0xDF, 0xCE, 0x44, 0x7E, 0x34, 0xB0, 0x5A, 0xBB, 0x9A, 0x8F, 0x74, 0xB6, 0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x12, 0x5F, 0xBD, 0x25, 0x97, 0x21, 0x41, 0x3B,
0x00, 0x2A, 0xC6, 0x7F, 0x2E, 0xBC, 0xD9, 0x69, 0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x8B, 0xDC, 0xC4, 0xFD, 0xE0, 0x0F, 0x5B, 0x48, 0xCE, 0xAA, 0xC3, 0xD8, 0xCF, 0x59, 0xBA, 0x47,
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x51, 0x6A, 0xD7, 0x7A, 0x35, 0xD4, 0x0E, 0x7F, 0x60, 0x01, 0xFC, 0x25, 0xF3, 0xAF, 0xEE, 0xEF, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93,
0x93, 0x18, 0xBB, 0x2F, 0x04, 0x3D, 0xA2, 0xE1, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x02, 0xAE, 0xAC, 0xFE, 0xBC, 0x6C, 0x63, 0x0E,
0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B, 0x0B, 0x93, 0x17, 0x72, 0x90, 0x90, 0x14, 0xBA, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF,
0xC2, 0xEE, 0xBC, 0x4B, 0xD3, 0xAC, 0xB7, 0xF6, 0xDA, 0x5D, 0xA3, 0x8A, 0x52, 0x63, 0xFD, 0x09, 0x71, 0x7F, 0x16, 0x45, 0x90, 0x7C, 0x9D, 0x24, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E,
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B, 0x13, 0xF7, 0x6D, 0x51, 0x1F, 0x7A, 0xD5, 0x2D, 0xA9, 0xE5, 0x91, 0x0A, 0x3E, 0xB6, 0x41, 0x67,
0x65, 0x19, 0xBD, 0xEB, 0x2F, 0x10, 0x7F, 0x2F, 0xBD, 0x4B, 0x9B, 0xFF, 0x81, 0xCC, 0xAD, 0x6E, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26, 0x3D, 0x83, 0xA2, 0x2F, 0x83, 0x45, 0xE7, 0x84,
0xA7, 0xF9, 0xA6, 0x2C, 0x9E, 0xC2, 0x7B, 0x8E, 0xB2, 0xFE, 0xCB, 0xF5, 0x82, 0xFF, 0x47, 0xD4, 0xC2, 0xC6, 0xF9, 0xFE, 0x46, 0x6B, 0x27, 0xC6, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60,
0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F, 0xDE, 0xC4, 0xB1, 0x0F, 0xFC, 0xC2, 0xE1, 0x4C, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x4A, 0x62, 0x95, 0x04, 0xD5, 0xCD, 0x72, 0xFF,
0xD9, 0xED, 0xB8, 0x81, 0x9D, 0xDC, 0xEC, 0x8B, 0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0xDA, 0x53, 0x3F, 0x37, 0x25, 0x83, 0x84, 0x94, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51,
0x8D, 0x9A, 0x5D, 0xEB, 0x31, 0x26, 0x16, 0xF4, 0x3B, 0x65, 0x3B, 0xCD, 0xCC, 0xF3, 0x32, 0xBE, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2,
0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50, 0x52, 0x8F, 0xBD, 0xEE, 0xAB, 0xB4, 0xA6, 0x3F, 0x1D, 0x0D, 0x41, 0x73, 0xAD, 0x14, 0x0E, 0x52, 0x3B, 0x65, 0x3B, 0xCD, 0xCC, 0xF3, 0x32, 0xBE,
0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB,
0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xEC, 0xB5, 0x61, 0x02, 0x55, 0x5B, 0x92, 0x52, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xE1, 0x0B, 0xEA, 0xDC, 0xD7, 0x80, 0x55, 0x15, 0x92, 0xB3, 0x18, 0xD9, 0xBD, 0x1F, 0xC0, 0xCC, 0x03, 0x9C, 0x05, 0x3B, 0x9D, 0xFA, 0x59, 0xD2, 0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x52, 0x30, 0x8A, 0x52, 0x81, 0xD5, 0x09, 0x38, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x57, 0x7F, 0xF9, 0x07, 0x3A, 0x64, 0xBE, 0x46,
0xB3, 0x39, 0xA1, 0xB6, 0xFC, 0xD9, 0x17, 0x26, 0xE5, 0xE9, 0x75, 0x6C, 0x4E, 0x1B, 0x03, 0x1A, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x20, 0x02, 0x06, 0xED, 0xBB, 0x83, 0x76, 0x35, 0x86, 0x5E, 0x24, 0xFB, 0xFB, 0xA9, 0x8A, 0x96, 0xAE, 0xB4, 0x34, 0x07, 0x06, 0xB5, 0xC1, 0x3C,
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0A, 0xB8, 0xF4, 0x86, 0x8C, 0xEB, 0x07, 0x9F, 0x43, 0x00, 0x53, 0x82, 0xA6, 0x6F, 0x03, 0xF1,
0xD5, 0x86, 0x8F, 0x7E, 0x0A, 0xF9, 0xB1, 0x0A, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
0xD0, 0xDB, 0x30, 0xF5, 0xC1, 0xB6, 0xE3, 0x31, 0xFA, 0xDD, 0xB4, 0x9B, 0x9C, 0x4B, 0x52, 0xAA, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xDD, 0xF6, 0xFB, 0x53, 0x91, 0x67, 0xD1, 0x78, 0x3E, 0xE8, 0x0D, 0x6F, 0x3B, 0x08, 0x22, 0x81, 0x5F, 0x56, 0xF5, 0xEF, 0x76, 0xC7, 0x94, 0x13,
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0xA7, 0x6B, 0x81, 0x83, 0x2B, 0xDA, 0xC6, 0x38,
0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF9, 0x9B, 0x03, 0xD0, 0xE4, 0x08, 0xA1, 0xF2, 0x0B, 0x99, 0xB4, 0xFE, 0x86, 0xE9, 0xFA, 0xD3, 0xE3, 0x60, 0x90, 0x6F, 0x90, 0xE4, 0xC4, 0xF8, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0xBD, 0x94, 0x4F, 0x6C, 0xA1, 0x9A, 0xEB, 0x0A, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2B, 0xC7, 0xBC, 0x8D, 0x58, 0x1D, 0xBA, 0xB9,
0xEE, 0x86, 0x71, 0x2E, 0x64, 0x9F, 0x05, 0x15, 0x66, 0xF2, 0xC3, 0x90, 0xF9, 0x29, 0x8E, 0x2D, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xCF, 0x3A, 0x4C, 0x24, 0x49, 0xD8, 0x03, 0x6B, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6,
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x09, 0x9A, 0x4E, 0x8C, 0x99, 0xCF, 0xAA, 0xCB, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B,
0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
0x81, 0xF2, 0xA7, 0xF6, 0xD4, 0x52, 0x7C, 0xA7, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0F, 0xE3, 0x20, 0xEA, 0xAA, 0x6C, 0x0C, 0xFC, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40,
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xF5, 0xD1, 0xF9, 0x1E, 0xAD, 0x80, 0x8E, 0x78,
0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xD4, 0x42, 0xBD, 0x30, 0xF6, 0x19, 0x69, 0x74, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x1A, 0x3E, 0xA4, 0x74, 0x07, 0xFC, 0x04, 0x97, 0x3D, 0x2A, 0x55, 0x30, 0xE2, 0x7E, 0x40, 0xA5,
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x7B, 0xE6, 0x68, 0x59, 0x30, 0x08, 0x3D, 0xED,
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x22, 0x40, 0x27, 0xDE, 0x76, 0x9C, 0x1E, 0x08, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38,
0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x28, 0x18, 0x6B, 0x5D, 0x89, 0x17, 0x61, 0x32, 0xA4, 0x7C, 0xCD, 0x30, 0x06, 0x7C, 0xBB, 0xBA,
0x24, 0xA7, 0x17, 0xE8, 0xF1, 0xD1, 0x02, 0x31, 0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C,
0xFB, 0xB9, 0x86, 0x16, 0x24, 0x03, 0xD6, 0x8F, 0x20, 0xDF, 0xB5, 0x62, 0xFC, 0x1A, 0xF5, 0x71, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x04, 0x33, 0x50, 0xF8, 0xC6, 0x53, 0x38, 0x3F, 0xCA, 0xB6, 0xA8, 0xF0, 0xEA, 0x72, 0x90, 0x23, 0x18, 0x05, 0x08, 0x4C, 0x18, 0x6B, 0x4E, 0x33,
0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x0C, 0x98, 0x39, 0x25, 0x02, 0xCF, 0x6D, 0x6D,
0x59, 0x25, 0xB9, 0xB2, 0x99, 0x99, 0x3B, 0x04, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xAA, 0x9C, 0x55, 0xB1, 0xCD, 0x65, 0xF6, 0xE1, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x68, 0x4C, 0x2D, 0x38, 0x47, 0x29, 0xC5, 0x64, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11,
0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x7E, 0x59, 0x60, 0x8C, 0x42, 0x3B, 0xD8, 0x5B,
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x62, 0x4F, 0xC6, 0x8E, 0x51, 0xEF, 0x68, 0x6F, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6,
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE7, 0xA2, 0x47, 0x18, 0x21, 0x48, 0xD2, 0x78, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B,
0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
0x99, 0x51, 0x22, 0xA7, 0x50, 0xFF, 0x39, 0x4B, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x37, 0xCA, 0x91, 0x80, 0x3B, 0xB8, 0xB9, 0x6B, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40,
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xBC, 0x71, 0x73, 0xF7, 0x0E, 0x82, 0x9C, 0xD6,
0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x05, 0x6F, 0xF4, 0xC7, 0x38, 0x64, 0x11, 0x72, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xA4, 0x0E, 0xA6, 0x08, 0x9B, 0x4A, 0x99, 0xF1, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11,
0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xDB, 0x4D, 0x60, 0xC6, 0xA6, 0xA3, 0xD6, 0x54,
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17,
0xBC, 0x2A, 0x59, 0x20, 0x11, 0x10, 0xEA, 0xF8, 0xEA, 0x24, 0x72, 0x67, 0xF9, 0xB2, 0x86, 0xE6, 0x8A, 0x0C, 0x73, 0xF9, 0x29, 0xD3, 0xF6, 0x95, 0xBE, 0x44, 0xBD, 0x6C, 0xF2, 0xCA, 0x2E, 0x39,
0xA4, 0xF4, 0x71, 0xE7, 0x4D, 0x67, 0xED, 0xC0, 0x62, 0xED, 0xD7, 0xA0, 0x87, 0xFD, 0xF3, 0x2F, 0xD4, 0xA4, 0x42, 0x61, 0x7A, 0x38, 0x32, 0x43, 0xBD, 0x03, 0x6E, 0x22, 0xF8, 0x10, 0xEE, 0x58,
0xF2, 0x82, 0x34, 0x03, 0x21, 0xB6, 0xDD, 0x24, 0x49, 0x1A, 0xD4, 0x00, 0x1E, 0x71, 0xE3, 0x0F, 0x84, 0x27, 0x00, 0x24, 0xCF, 0x8C, 0xB7, 0xF0, 0xB2, 0xFE, 0xCB, 0xF5, 0x82, 0xFF, 0x47, 0xD4,
0x80, 0xEF, 0xC1, 0xF5, 0x17, 0x39, 0xC5, 0x91, 0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x2E, 0x35, 0x75, 0x1E, 0x18, 0x5E, 0x8A, 0xCC,
0x20, 0xEA, 0x0F, 0x9B, 0x28, 0xE0, 0xD1, 0xF1, 0x58, 0x0C, 0xEB, 0x2B, 0x1F, 0x13, 0x67, 0x28, 0xC5, 0x2A, 0xD3, 0xBF, 0x75, 0x15, 0x3E, 0x21, 0x86, 0x39, 0xA0, 0x89, 0x07, 0x9C, 0x6D, 0x18,
0x00, 0x2A, 0xC6, 0x7F, 0x2E, 0xBC, 0xD9, 0x69, 0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x32, 0x3F, 0x2C, 0x5A, 0x15, 0x6B, 0x91, 0x0E, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82,
0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0xDB, 0xB7, 0x65, 0x2C, 0xFE, 0xBA, 0x49, 0x01, 0x14, 0x75, 0xB4, 0x77, 0x15, 0x11, 0x72, 0xE9, 0x90, 0xD9, 0x8D, 0x5E, 0xEB, 0xA1, 0x2A, 0x09,
0x55, 0x00, 0xCF, 0x26, 0x63, 0x26, 0x31, 0x90, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x84, 0xA9, 0xB6, 0xBB, 0x15, 0xC6, 0x8F, 0x6C, 0x9D, 0x6C, 0x4D, 0x45, 0xED, 0xEB, 0xD3, 0x10,
0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8,
0x01, 0xB5, 0x14, 0x89, 0x4F, 0x54, 0x03, 0x9C, 0x94, 0x5E, 0x3C, 0xE5, 0x71, 0xD1, 0xB7, 0xB7, 0xE0, 0x7D, 0x14, 0xFB, 0x1D, 0xBE, 0xB5, 0x58, 0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F,
0x93, 0x52, 0x84, 0xAA, 0x76, 0xA5, 0x45, 0x6D, 0xA2, 0x35, 0xDE, 0x5C, 0x53, 0xE2, 0x3C, 0x67, 0xF1, 0x4D, 0xD8, 0xA9, 0xB6, 0x2C, 0x97, 0x43, 0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD,
0x47, 0x9C, 0x47, 0xF2, 0x33, 0x1D, 0xD7, 0x98, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46, 0x15, 0xDE, 0xA4, 0x74, 0xA5, 0x30, 0xC5, 0x7B,
0xE5, 0x57, 0x6E, 0x05, 0xAF, 0x70, 0x80, 0x1C, 0x47, 0x9C, 0x47, 0xF2, 0x33, 0x1D, 0xD7, 0x98, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
0x15, 0xDE, 0xA4, 0x74, 0xA5, 0x30, 0xC5, 0x7B, 0x58, 0xCE, 0x00, 0x61, 0x9F, 0xAA, 0x41, 0xE6, 0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0xB3, 0x3B, 0x70, 0x57, 0x6F, 0xED, 0xC4, 0xCF,
0xAD, 0xAE, 0x25, 0x58, 0xF1, 0x06, 0x0A, 0x1D, 0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0xB2, 0x1E, 0xC0, 0x1C, 0x92, 0xA0, 0x63, 0x3C, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35,
0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13, 0xD0, 0x25, 0xCB, 0x89, 0x00, 0x8E, 0x7B, 0xFF, 0xDD, 0x41, 0xE5, 0x3C, 0xFD, 0x39, 0xA3, 0x9F, 0x1F, 0xA7, 0x32, 0xB5, 0x10, 0x81, 0x02, 0xC7,
0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0x08, 0x9E, 0xDA, 0x6D, 0x8C, 0x74, 0x16, 0xA7, 0x00, 0xED, 0x4D, 0x76, 0x76, 0x06, 0x3E, 0x3A, 0x79, 0x16, 0x38, 0xFA, 0x23, 0x17, 0x92, 0x8B,
0xA6, 0x3E, 0x1C, 0xE0, 0xDB, 0xC3, 0x30, 0xE3, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2, 0x82, 0xFF, 0x09, 0x71, 0x5F, 0x0E, 0x95, 0x12, 0x6D, 0x16, 0x29, 0xEE, 0xE4, 0x8B, 0x2B, 0x91,
0x7A, 0xA4, 0x0E, 0x99, 0x04, 0x87, 0x3E, 0xD2, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x5F, 0xF3, 0x2B, 0xC2, 0xAA, 0x4C, 0x38, 0x6B,
0xCE, 0xEF, 0xA6, 0x10, 0x51, 0xED, 0xB9, 0x7E, 0x7C, 0x20, 0x39, 0x8A, 0xBF, 0x1D, 0xA3, 0x86, 0x3D, 0x83, 0x17, 0x68, 0xFF, 0x60, 0xDB, 0xE3, 0xA1, 0xE8, 0x80, 0xB2, 0x69, 0x0A, 0x5F, 0xB3,
0x97, 0x6D, 0x24, 0x32, 0x40, 0xC5, 0xDD, 0x7B, 0x87, 0xAF, 0xFA, 0x1C, 0x45, 0x05, 0x09, 0xF1, 0x0B, 0xAF, 0x9C, 0x67, 0xF7, 0x37, 0x44, 0x83, 0xD2, 0xA6, 0x95, 0x61, 0xA7, 0x79, 0x2A, 0x50,
0x98, 0x3A, 0x00, 0x54, 0xA4, 0x1A, 0x6F, 0x1B, 0x9F, 0xCC, 0xE2, 0x06, 0x55, 0x73, 0x3E, 0xDF, 0xD9, 0x8B, 0xAD, 0xA5, 0x4A, 0xEB, 0x8D, 0x40, 0xAA, 0xD7, 0x26, 0xDC, 0xD5, 0x42, 0x3A, 0xD9,
0x4D, 0xA3, 0x2D, 0xE0, 0xD7, 0xB5, 0xFA, 0x5B, 0x3D, 0x43, 0x05, 0x7C, 0x3B, 0xB6, 0x01, 0x20, 0x5D, 0xAC, 0xBE, 0xEE, 0xCF, 0xD4, 0x33, 0x50, 0xD9, 0x8B, 0xAD, 0xA5, 0x4A, 0xEB, 0x8D, 0x40,
0xAA, 0xD7, 0x26, 0xDC, 0xD5, 0x42, 0x3A, 0xD9, 0xC7, 0x1E, 0x1E, 0x69, 0xE4, 0x92, 0x2E, 0x9F, 0xE0, 0x89, 0x34, 0x7F, 0x4E, 0x66, 0x69, 0x72, 0x9B, 0x73, 0x8D, 0xB6, 0x4D, 0x9D, 0x8A, 0x6F,
0x1E, 0xB2, 0x8F, 0x87, 0x53, 0x26, 0xF4, 0x36, 0xA5, 0xEC, 0xCA, 0xB2, 0xFA, 0x71, 0x44, 0xC1, 0x8E, 0x02, 0x14, 0x21, 0xCC, 0xB8, 0x00, 0xB6, 0x34, 0xA8, 0xA2, 0x6C, 0xCB, 0x32, 0x44, 0x4C,
0x37, 0x77, 0xB6, 0xBB, 0xBD, 0x78, 0x6D, 0xF6, 0x63, 0x39, 0x14, 0xCC, 0x61, 0xD7, 0x66, 0x7B, 0x26, 0x34, 0x3C, 0xEB, 0xB8, 0x7B, 0x04, 0x7A, 0xEC, 0x63, 0xBC, 0xC1, 0x11, 0x6F, 0xD3, 0x1B,
0x82, 0xF0, 0x70, 0xFD, 0x07, 0x65, 0xC8, 0x73, 0xDC, 0x12, 0xE9, 0x25, 0xB2, 0xEC, 0x78, 0xE1, 0x1B, 0x46, 0x06, 0xE3, 0xED, 0x27, 0x69, 0x04, 0xDC, 0x14, 0xA9, 0xC2, 0xA2, 0x93, 0xD5, 0xB3,
0x2E, 0xFF, 0x18, 0x57, 0x1C, 0xC2, 0x02, 0xEC, 0xC9, 0x98, 0x22, 0x18, 0x92, 0xDE, 0x72, 0xD0, 0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93,
0x10, 0x7F, 0xFF, 0xDD, 0x0E, 0x0B, 0xF7, 0xDD, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0xDC, 0x73, 0x06, 0x9E, 0x18, 0xA3, 0x96, 0xAB, 0x61, 0x13, 0xAC, 0x59, 0x29, 0x28, 0xC9, 0x81,
0xBD, 0x9E, 0x16, 0xA7, 0x72, 0xB0, 0x21, 0x3B, 0x85, 0xE5, 0x94, 0x97, 0x8D, 0x2C, 0xFD, 0x09, 0x0E, 0xEA, 0x82, 0xD3, 0xFC, 0x08, 0x99, 0x81, 0x41, 0x17, 0x0D, 0x51, 0xE6, 0xCF, 0xAE, 0xA2,
0x1B, 0x7A, 0x09, 0xDB, 0x56, 0x1C, 0xDA, 0xB7, 0xF7, 0x4B, 0x7A, 0xB6, 0x2A, 0xDF, 0x43, 0x58, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31, 0x6C, 0x5A, 0xF6, 0x57, 0x79, 0x4D, 0xC3, 0x87,
0x5D, 0x38, 0x2F, 0x96, 0x16, 0xF9, 0x32, 0xD4, 0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x95, 0x67, 0x7F, 0x23, 0xA7, 0x5A, 0x08, 0x99,
0xA6, 0xFF, 0x34, 0x02, 0xD1, 0xD3, 0x67, 0x17, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E, 0x71, 0xF3, 0x8B, 0xBC, 0x8D, 0x16, 0xDF, 0xF4, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26,
0x51, 0x6A, 0xD7, 0x7A, 0x35, 0xD4, 0x0E, 0x7F, 0x60, 0x01, 0xFC, 0x25, 0xF3, 0xAF, 0xEE, 0xEF, 0x80, 0xEF, 0xC1, 0xF5, 0x17, 0x39, 0xC5, 0x91, 0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89,
0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x71, 0x7D, 0x81, 0x2C, 0x67, 0x53, 0x76, 0xA8, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED, 0x65, 0x43, 0xB4, 0x98, 0x25, 0xFE, 0x6F, 0x40,
0xAD, 0xF6, 0xF1, 0x24, 0xB0, 0x7E, 0x5C, 0x2D, 0xAA, 0x16, 0xD9, 0x79, 0x45, 0x0B, 0x9D, 0x78, 0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0x5C, 0x8E, 0x67, 0x3D, 0xFB, 0x4D, 0x94, 0x4E,
0xF5, 0x03, 0x3B, 0x26, 0xE5, 0x8A, 0xAE, 0x36, 0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7, 0x9F, 0x2F, 0x30, 0x24, 0xA4, 0x30, 0x74, 0xE3,
0xEF, 0x19, 0x26, 0x91, 0xE3, 0xB2, 0x31, 0xC6, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x58, 0x8E, 0x81, 0x02, 0xCA, 0x8A, 0xF5, 0x42, 0x62, 0xAC, 0x55, 0x90, 0xE8, 0xD2, 0xD6, 0x2A,
0x58, 0x3C, 0xAC, 0x66, 0x4B, 0x32, 0x7D, 0x39, 0x6C, 0x36, 0xCA, 0x2C, 0x5C, 0xF7, 0xE1, 0xAD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x6B, 0xC1, 0xEC, 0x43, 0x30, 0x7D, 0x03, 0xEA, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0xC3, 0xF6, 0x7B, 0xA3, 0x09, 0x25, 0x3E, 0xAE, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2, 0x76, 0x64, 0xA3, 0x3B, 0x4D, 0xE3, 0xB4, 0x04, 0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0x7D, 0xB9, 0xE1, 0xED, 0x51, 0x22, 0x9F, 0x8D,
0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2, 0x02, 0x56, 0xFF, 0x61, 0x89, 0xBC, 0xF3, 0xA8,
0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42,
0xB2, 0x21, 0x3E, 0x94, 0xC6, 0x74, 0x86, 0xC3, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2,
0xC4, 0xB3, 0x15, 0x7A, 0xBA, 0x7E, 0xFF, 0x64, 0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0xF5, 0xC7, 0x2A, 0xA9, 0x0B, 0xD5, 0x62, 0x89, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x4F, 0x58, 0x01, 0x0B, 0xFF, 0xC4, 0xF7, 0xC0, 0xDC, 0x8B, 0xAF, 0x18, 0xA6, 0x8E, 0x73, 0xB1, 0x89, 0x58, 0xBC, 0x0D, 0xF9, 0x34, 0x14, 0x8D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x9F, 0x4E, 0x0B, 0x84, 0xFE, 0x0F, 0x86, 0x7C, 0xB0, 0x14, 0x6B, 0xBD, 0x99, 0xDF, 0x66, 0x17, 0xCD, 0x95, 0x8A, 0x69, 0x4F, 0xAA, 0x0D, 0x7C,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xBB, 0x21, 0xD4, 0x73, 0x34, 0xDB, 0x5B, 0x74, 0x08, 0x71, 0xF7, 0x69, 0x9A, 0x12, 0xB6, 0x4C, 0x6A, 0x11, 0x51, 0x56, 0xDA, 0x0E, 0x0E, 0x25,
0xC4, 0x4B, 0x1B, 0x64, 0x2F, 0x84, 0x24, 0x94, 0x87, 0x67, 0x20, 0xD9, 0x39, 0x78, 0xE8, 0xA0, 0x09, 0x1D, 0x6B, 0x1C, 0x70, 0x82, 0xB9, 0xA2, 0xDE, 0x3E, 0x01, 0xAB, 0xAB, 0xD4, 0xF7, 0x68,
0xF1, 0xE0, 0x11, 0x7F, 0x19, 0x96, 0x0B, 0xDC, 0x2A, 0x46, 0x80, 0x53, 0x80, 0x0C, 0x80, 0xCC, 0xB8, 0xCA, 0xC0, 0xCF, 0xD0, 0xFA, 0x3D, 0x26, 0x61, 0xB1, 0xC6, 0x2C, 0xA6, 0xE5, 0xF0, 0x66,
0x96, 0x39, 0x1B, 0xA0, 0xE9, 0x0C, 0x23, 0x4B, 0xA1, 0x41, 0x57, 0x84, 0x0D, 0xEB, 0x9E, 0x40, 0xB4, 0xC0, 0xE7, 0xC8, 0xEA, 0x64, 0xAB, 0x24, 0x8B, 0xDA, 0xBC, 0x3C, 0xA3, 0x8B, 0xF6, 0xCB,
0x03, 0x08, 0x1C, 0xFF, 0x24, 0x27, 0xF4, 0xF9, 0xF1, 0xE0, 0x11, 0x7F, 0x19, 0x96, 0x0B, 0xDC, 0x2E, 0xD5, 0x8A, 0xFD, 0xAE, 0x60, 0xA5, 0x2B, 0x2E, 0x6E, 0x8E, 0xCC, 0x52, 0x3D, 0x29, 0xA2,
0xE7, 0xCF, 0xC0, 0x75, 0x7F, 0xDB, 0x4A, 0x06, 0x28, 0x92, 0x67, 0xAC, 0x56, 0x4E, 0xD2, 0xA3, 0xEA, 0x60, 0x6C, 0xD6, 0xAF, 0xF3, 0x2E, 0xB2, 0x41, 0xFD, 0x38, 0x11, 0xD2, 0xB9, 0xF5, 0x8B,
0x6B, 0xF7, 0x04, 0x53, 0xC2, 0x1F, 0x18, 0xD5, 0xF5, 0xE1, 0x7F, 0xD3, 0x7D, 0x4E, 0x0F, 0xF3, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0x35, 0xE7, 0x8D, 0xD8, 0x1B, 0xF0, 0xFE, 0xBF,
0x22, 0x1D, 0xEC, 0xC6, 0x1C, 0x27, 0x06, 0xCB, 0xF3, 0xDF, 0xB5, 0x3E, 0xE2, 0xBB, 0xB8, 0x6D, 0x1A, 0xD5, 0x48, 0xBC, 0x8F, 0xD7, 0xE5, 0x63, 0xAA, 0xBC, 0x16, 0x10, 0x87, 0xD1, 0x6F, 0x89,
0xCD, 0xC0, 0x8B, 0x81, 0x76, 0x30, 0xF1, 0x84, 0x23, 0x20, 0xE6, 0x28, 0x40, 0xC0, 0xF3, 0xA9, 0x2F, 0xB2, 0xE4, 0x57, 0x38, 0x8D, 0x4F, 0x75, 0x48, 0x7B, 0x82, 0xA4, 0xF4, 0xE5, 0x9F, 0xBC,
0x41, 0x31, 0xF5, 0x00, 0x43, 0xE6, 0x07, 0xE5, 0x03, 0xE9, 0x3B, 0xBA, 0xCB, 0x63, 0xBD, 0xAF, 0x6F, 0x32, 0xF3, 0xEB, 0xB2, 0x03, 0x20, 0x89, 0x46, 0xC8, 0x0C, 0xA2, 0x6F, 0xDE, 0x68, 0xC0,
0x24, 0xCB, 0xCE, 0x94, 0x92, 0x39, 0x6F, 0x8C, 0x4E, 0xAC, 0xAE, 0xD4, 0x28, 0x15, 0x19, 0x7A, 0x5E, 0x10, 0x75, 0x30, 0x8D, 0x30, 0x48, 0x8B, 0xD1, 0x63, 0xCF, 0xBB, 0xBA, 0x09, 0x5C, 0x39,
0x8F, 0x9C, 0xDB, 0xEA, 0xC7, 0xD4, 0x10, 0x2D, 0x90, 0x47, 0x15, 0xB6, 0x4D, 0x58, 0x87, 0x36, 0x46, 0xA6, 0xD6, 0x4F, 0x6E, 0x8F, 0x2C, 0x4B, 0x78, 0xCD, 0x9B, 0x7F, 0x97, 0x6D, 0x28, 0xFE,
0xBB, 0x4F, 0x3B, 0xA7, 0x78, 0xD2, 0x30, 0x1D, 0x3E, 0xB8, 0x01, 0x74, 0x9F, 0xE1, 0x3A, 0x9F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xC9, 0xE2, 0xDE, 0x72, 0x20, 0x65, 0x9A, 0x74, 0x94, 0xCD, 0x8B, 0x8A, 0x90, 0x00, 0x8B, 0xF7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x58, 0xE7, 0xF3, 0x69, 0xC9, 0x47, 0x0E, 0x80, 0xA4, 0x54, 0x1D, 0x7C, 0xB8, 0xC5, 0x65, 0xFA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF4, 0xFA, 0x70, 0xDC, 0x2F, 0x79, 0x0B, 0x1D, 0x2A, 0xAE, 0x5B, 0xAC, 0xD8, 0x27, 0x95, 0xE0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xF6, 0x69, 0x33, 0xAA, 0xD9, 0x1C, 0x58, 0x8F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x1E, 0x2D, 0x4C, 0x13, 0x7B, 0x17, 0x38, 0x7D, 0x15, 0xD1, 0x2B, 0xEF, 0x7B, 0x97, 0xA5, 0xB6, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x21, 0xD3, 0x0D, 0x30, 0xB2, 0x4A, 0x72, 0xC1, 0xED, 0x05, 0x00, 0xBB, 0xF3, 0xDE, 0xF1, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xAA, 0x13, 0x3B, 0x49, 0x73, 0x8D, 0xFD, 0xC0, 0x73, 0xEC, 0x7A, 0x3C, 0xB5, 0xC6, 0x17, 0x8F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x98, 0x9C, 0x67, 0x25, 0xD0, 0xB3, 0x53, 0xB7, 0xCB, 0x9D, 0xBE, 0xA9, 0x57, 0xA1, 0xD7, 0xE0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x06, 0xAB, 0x1E, 0xE4, 0xE0, 0xDD, 0xAD, 0x2F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x6B, 0x3F, 0xD5, 0x48, 0x93, 0xAE, 0x12, 0x65, 0x78, 0xC7, 0x94, 0xE2, 0x13, 0x22, 0x66, 0x3F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xB6, 0x97, 0x11, 0x2F, 0x00, 0x6A, 0x23, 0x7D, 0x5F, 0xE9, 0x1C, 0xE9, 0xF6, 0x67, 0xC5, 0xDB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x0B, 0x25, 0xD6, 0x93, 0x3A, 0x97, 0x29, 0x0F, 0xF6, 0x0F, 0x5E, 0x87, 0x9F, 0x61, 0x53, 0x49, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x4F, 0xD7, 0x70, 0x13, 0xD7, 0xEC, 0xE0, 0xA8, 0x9E, 0x02, 0xB0, 0x48, 0xBF, 0x86, 0x37, 0x44, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x1D, 0xAD, 0x58, 0xD4, 0x95, 0xDE, 0x0C, 0x30, 0x23, 0x33, 0xCE, 0xD7, 0xED, 0x3F, 0x40, 0x22, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xD0, 0x1F, 0xB3, 0x76, 0x55, 0xD0, 0x99, 0x97, 0x94, 0xCD, 0x8B, 0x8A, 0x90, 0x00, 0x8B, 0xF7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x35, 0x9B, 0xE4, 0xDF, 0x94, 0x8C, 0x67, 0x7F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x87, 0x8C, 0xE5, 0xC4, 0x7C, 0x45, 0xD9, 0xA3, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x71, 0x94, 0x10, 0x7A, 0x94, 0x7D, 0x1E, 0x32, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x12, 0x7D, 0x63, 0x93, 0x33, 0x62, 0x4C, 0x18, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xE1, 0x39, 0xE5, 0xE3, 0x21, 0x66, 0xF1, 0x95, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x1E, 0xD0, 0xF0, 0x4D, 0xAA, 0xD2, 0xD5, 0xB2, 0x18, 0x2E, 0x12, 0x4A, 0x8E, 0xF5, 0xF9, 0x78, 0x32, 0x39, 0x91, 0xFC, 0x9B, 0x8E, 0x87, 0x35, 0x22, 0x59, 0xA1, 0x0B, 0x52, 0xFC, 0x89, 0x71,
0xF9, 0x80, 0x55, 0x43, 0x6E, 0x40, 0x4A, 0x74, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53, 0xD6, 0x0A, 0x65, 0x93, 0xDB, 0xE9, 0xC3, 0xC7, 0xBA, 0x60, 0x11, 0x1E, 0xFE, 0xC8, 0x64, 0x45,
0x37, 0xCA, 0xEE, 0xC5, 0xDF, 0xC8, 0x35, 0x53, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81, 0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85,
0xE6, 0x42, 0x04, 0x06, 0x08, 0x60, 0x50, 0x08, 0x7F, 0xB4, 0x9E, 0x33, 0xEA, 0x63, 0xE0, 0x18, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81, 0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85,
0xE6, 0x42, 0x04, 0x06, 0x08, 0x60, 0x50, 0x08, 0xBF, 0x2D, 0xF1, 0x2B, 0x3D, 0xA7, 0xE4, 0x35, 0x9A, 0x78, 0x20, 0xA9, 0x70, 0x3A, 0xC6, 0x79, 0x13, 0xDC, 0xF0, 0x6E, 0x51, 0x2B, 0x87, 0x44,
0x28, 0xCB, 0x60, 0x01, 0xDD, 0xE5, 0x04, 0x69, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0xD3, 0x4B, 0x9F, 0x21, 0x18, 0xB2, 0x75, 0x46, 0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82,
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F,
0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0xD6, 0x25, 0x0C, 0x4A, 0xE7, 0x84, 0x05, 0xBB, 0x07, 0xD5, 0x8F, 0xEF, 0x79, 0x29, 0x8B, 0x4E,
0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50, 0xE5, 0xCD, 0x9D, 0xB2, 0x4D, 0x45, 0xFD, 0x3F, 0x3C, 0x38, 0x5C, 0x1F, 0x01, 0xBB, 0x32, 0x91, 0x6B, 0x99, 0x04, 0x83, 0xE0, 0xEC, 0x30, 0xBD,
0xE3, 0xE5, 0x8F, 0x05, 0x3A, 0xFF, 0x6A, 0x1F, 0x97, 0xDC, 0x50, 0xD6, 0x08, 0x82, 0x18, 0x45, 0x27, 0x9C, 0xD0, 0x27, 0xAA, 0x9E, 0x3A, 0xCC, 0x86, 0x62, 0x90, 0xB2, 0x3A, 0xB4, 0x87, 0x92,
0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD, 0x77, 0x9B, 0xDE, 0xB3, 0x74, 0xC6, 0xA7, 0x17, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7,
0x9C, 0x71, 0xC7, 0xCB, 0x0C, 0x2D, 0xED, 0x3B, 0x7F, 0xB4, 0x9E, 0x33, 0xEA, 0x63, 0xE0, 0x18, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7,
0x9C, 0x71, 0xC7, 0xCB, 0x0C, 0x2D, 0xED, 0x3B, 0xBF, 0x2D, 0xF1, 0x2B, 0x3D, 0xA7, 0xE4, 0x35, 0xEA, 0x6F, 0x7E, 0x90, 0x6A, 0x88, 0x71, 0x20, 0x18, 0x1F, 0x1B, 0x4B, 0xEA, 0xEF, 0xD7, 0x12,
0x68, 0x05, 0x0A, 0x9C, 0x3F, 0x12, 0x20, 0xCE, 0x77, 0x9B, 0xDE, 0xB3, 0x74, 0xC6, 0xA7, 0x17, 0xBE, 0xAF, 0x61, 0xC0, 0xA6, 0x3E, 0xDE, 0xC2, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED,
0x35, 0x24, 0xED, 0x5F, 0xBC, 0xF3, 0x3E, 0x40, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x82, 0x45, 0xF3, 0x16, 0xEA, 0x07, 0x43, 0x85, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED,
0xAF, 0xFB, 0x9B, 0xC7, 0xCE, 0xD5, 0x55, 0xA1, 0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7, 0x6E, 0x86, 0xF4, 0x38, 0xAB, 0x51, 0xA6, 0x9A, 0x23, 0x75, 0x03, 0x83, 0x2C, 0xF3, 0x7C, 0x30, 0x62, 0x75, 0xD4, 0xC2, 0x9B, 0xCB, 0x16, 0xDE,
0xE7, 0xA2, 0x47, 0x22, 0x7E, 0xBC, 0x71, 0x59, 0x88, 0x4C, 0x47, 0xE9, 0x6D, 0xB7, 0xD1, 0x28, 0x20, 0x68, 0xC2, 0x62, 0x39, 0x04, 0x50, 0x12, 0x5C, 0x68, 0x66, 0x7D, 0xE9, 0x42, 0x77, 0x39,
0x07, 0xD5, 0x8F, 0xEF, 0x79, 0x29, 0x8B, 0x4E, 0xAD, 0xF6, 0xF1, 0x24, 0xB0, 0x7E, 0x5C, 0x2D, 0x97, 0xF2, 0xAA, 0x08, 0x13, 0x6E, 0xF8, 0x74, 0xE1, 0x4D, 0x7B, 0x34, 0x5E, 0x59, 0x90, 0x4B,
0x41, 0x3B, 0x07, 0x60, 0x56, 0xDD, 0x95, 0x8A, 0x7E, 0x3F, 0xB0, 0x40, 0x2C, 0xBA, 0xEB, 0x2C, 0x02, 0xFD, 0x19, 0xAB, 0x2E, 0xDF, 0x26, 0xF8, 0xFB, 0xF4, 0xB3, 0x8A, 0x80, 0x94, 0x39, 0x29,
0x4E, 0x06, 0x10, 0x14, 0x17, 0x3A, 0xEA, 0x61, 0xA2, 0x1B, 0xEE, 0x71, 0x41, 0xC6, 0xD3, 0x91, 0x02, 0xFD, 0x19, 0xAB, 0x2E, 0xDF, 0x26, 0xF8, 0x71, 0xD5, 0x2F, 0xD7, 0x69, 0xA5, 0x3C, 0xD4,
0x4E, 0x06, 0x10, 0x14, 0x17, 0x3A, 0xEA, 0x61, 0xAC, 0x36, 0x65, 0xB7, 0xBF, 0x7B, 0xBE, 0xCB, 0xD5, 0xB5, 0xA9, 0x1C, 0xC5, 0xCE, 0xB3, 0x06, 0xC5, 0xED, 0x96, 0x2B, 0x39, 0x21, 0x9D, 0xDE,
0xA2, 0x63, 0xF8, 0x3F, 0x16, 0xA2, 0x0D, 0xCD, 0xF7, 0xFF, 0x28, 0x77, 0x57, 0x27, 0x8E, 0x0A, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
0x07, 0x94, 0xD8, 0x1D, 0x8A, 0x74, 0xD4, 0x40, 0xBD, 0x78, 0x41, 0x7C, 0xBD, 0x63, 0x23, 0x71, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
0x6D, 0xB9, 0x7D, 0x98, 0x90, 0x73, 0x77, 0xA0, 0x0D, 0xD8, 0x82, 0x1B, 0x1B, 0xD6, 0xF1, 0x96, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
0x4F, 0xD3, 0x44, 0x8A, 0xC0, 0x1A, 0x58, 0x80, 0x78, 0xC7, 0xE8, 0x5F, 0x59, 0x90, 0x38, 0x03, 0xA9, 0xC0, 0x03, 0xB7, 0x18, 0x50, 0x4C, 0x9E, 0x86, 0x0D, 0xB8, 0x53, 0x19, 0x27, 0x33, 0x14,
0x1F, 0x30, 0x05, 0x90, 0x1F, 0xAF, 0x9F, 0x0A, 0xF2, 0xA6, 0x5F, 0x84, 0xE6, 0xCA, 0xCE, 0x57, 0x89, 0x2F, 0x2A, 0x9B, 0x38, 0xCE, 0xEE, 0x1A, 0xFD, 0x0F, 0xF8, 0x46, 0xA1, 0x13, 0x31, 0x38,
0x03, 0x32, 0xE1, 0x44, 0x84, 0xA5, 0xE1, 0xF6, 0xC5, 0xB4, 0x22, 0xA4, 0xC0, 0xF7, 0xFB, 0x1E, 0x98, 0x61, 0xFF, 0xC2, 0x61, 0x4D, 0x5B, 0x7E, 0xD0, 0x2E, 0xD0, 0xFE, 0xBD, 0x12, 0xA1, 0xEE,
0xFF, 0x9E, 0xAC, 0x62, 0x4E, 0x0A, 0x02, 0x64, 0x81, 0xA5, 0x2B, 0xC9, 0x16, 0xB3, 0x6A, 0x8F, 0xDA, 0x9C, 0xC4, 0xF4, 0x97, 0xED, 0x0F, 0x04, 0xFF, 0x1B, 0xC8, 0x6A, 0xAC, 0xD6, 0x50, 0xCE,
0xE4, 0x3D, 0x9C, 0xF8, 0xE5, 0xAF, 0x9D, 0xD1, 0xBC, 0x3D, 0x44, 0xF9, 0x2B, 0x12, 0x22, 0x8A, 0x44, 0x62, 0xDE, 0x91, 0x54, 0x56, 0xAC, 0x1D, 0xFB, 0x33, 0x11, 0x96, 0x23, 0x2C, 0x9A, 0x01,
0x22, 0xAD, 0x74, 0xC4, 0xE7, 0x3F, 0x56, 0x16, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x36, 0xCF, 0x6F, 0xE9, 0x00, 0x0F, 0xB5, 0xF2, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x4F, 0x86, 0xF1, 0xBC, 0xA0, 0x64, 0xA2, 0xAD, 0x64, 0xC9, 0xF2, 0x3B, 0x5C, 0xFB, 0x7E, 0x92,
0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x3C, 0x38, 0x5C, 0x1F, 0x01, 0xBB, 0x32, 0x91, 0x18, 0xA0, 0xB3, 0xB3, 0x21, 0x1E, 0x81, 0xFB, 0xE0, 0x4F, 0x91, 0x65, 0xE9, 0xD4, 0xCB, 0x83,
0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x7D, 0xDF, 0x22, 0xF2, 0xF6, 0xBD, 0x71, 0x7C, 0xD8, 0x26, 0x5A, 0x1D, 0x93, 0xE1, 0xC3, 0xC5, 0xF4, 0xE2, 0x26, 0x45, 0x7E, 0xDD, 0x56, 0xBB,
0x39, 0xE1, 0xCB, 0x8F, 0xB7, 0xF7, 0x05, 0xD5, 0x1C, 0xB3, 0xB9, 0x44, 0x69, 0x67, 0xD2, 0x9A, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
0xAB, 0xB9, 0x52, 0x8E, 0x69, 0x19, 0x2C, 0x10, 0xE0, 0x4F, 0x91, 0x65, 0xE9, 0xD4, 0xCB, 0x83, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81,
0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85, 0x52, 0xEF, 0xA6, 0xB4, 0xA4, 0x16, 0x46, 0xF5, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F,
0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83,
0x96, 0x6F, 0xA4, 0x1D, 0xFF, 0xE1, 0x53, 0x1A, 0x2E, 0x69, 0x3D, 0xD7, 0xBE, 0x94, 0x9E, 0xC9, 0x9C, 0xF4, 0x43, 0x49, 0xC2, 0x4F, 0xF8, 0x52, 0x75, 0xBC, 0x1C, 0x14, 0x4E, 0x09, 0x7F, 0xB3,
0xE5, 0xCD, 0x9D, 0xB2, 0x4D, 0x45, 0xFD, 0x3F, 0x0A, 0xD0, 0xE1, 0x48, 0x1E, 0x8D, 0x2F, 0xA4, 0x33, 0x9B, 0x4D, 0xE7, 0x61, 0x3B, 0x0B, 0xF8, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
0x5B, 0xB1, 0xCB, 0x92, 0x78, 0x1D, 0xC6, 0x1F, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0xFA, 0x60, 0xDA, 0x80, 0x7F, 0xE8, 0x5F, 0x04, 0x7E, 0x3F, 0xB0, 0x40, 0x2C, 0xBA, 0xEB, 0x2C,
0xAF, 0x00, 0x1C, 0x80, 0xFF, 0x0B, 0x48, 0xAE, 0xA0, 0xD4, 0x73, 0xE5, 0xA9, 0x52, 0x41, 0xF4, 0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2,
0x07, 0x46, 0xC7, 0x2F, 0xEB, 0x5C, 0x59, 0x5E, 0xDD, 0x41, 0xE5, 0x3C, 0xFD, 0x39, 0xA3, 0x9F, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x07, 0xF6, 0xD8, 0x21, 0x44, 0x92, 0xAF, 0x68,
0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0x87, 0xDF, 0x99, 0x04, 0x0B, 0x2B, 0xAD, 0x31, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x8F, 0xDC, 0x8E, 0x8D, 0x3A, 0x74, 0x59, 0xA6, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4,
0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x9F, 0x75, 0xE6, 0x23, 0x89, 0xB7, 0xEA, 0x87, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB,
0xE8, 0xDE, 0x9A, 0xD8, 0x7B, 0xBB, 0x10, 0x95, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
0xC2, 0xD6, 0xB7, 0xF9, 0x09, 0xD2, 0x82, 0x21, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB, 0xE1, 0x32, 0x28, 0x68, 0xA7, 0xDF, 0x8C, 0x8A,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x94, 0x5E, 0x6D, 0x3A, 0x49, 0xE6, 0x2A, 0x73,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB, 0xFB, 0x75, 0x2F, 0x4F, 0xD1, 0x53, 0x52, 0xB5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8, 0xD0, 0x75, 0xAA, 0xD8, 0x56, 0x0D, 0x22, 0xFA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88, 0x5E, 0xDA, 0x4F, 0xB7, 0x9E, 0x38, 0xBE, 0x0A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8, 0x2C, 0x69, 0x6A, 0x77, 0x85, 0x49, 0x73, 0x64, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88,
0xDE, 0x02, 0x53, 0x7F, 0x93, 0xAB, 0x73, 0x16, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8,
0xFA, 0x68, 0x8C, 0xE0, 0x94, 0x8B, 0x9F, 0x12, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88, 0x80, 0x7C, 0x09, 0xF8, 0x03, 0x34, 0x44, 0x9D,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xD9, 0xC0, 0x6D, 0x75, 0x84, 0x74, 0xA4, 0x05, 0x2A, 0x36, 0x44, 0x77, 0x2E, 0xED, 0x85, 0xD0,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xFA, 0xC0, 0x93, 0x68, 0x08, 0xD4, 0x1F, 0x68, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xBE, 0xE9, 0xA2, 0xA7, 0x8E, 0x7A, 0x39, 0x96, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xAD, 0xC5, 0x36, 0x13, 0x06, 0x4D, 0x31, 0x9E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x19, 0x56, 0xB8, 0x09, 0xF1, 0xAA, 0x61, 0x8E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0,
0x82, 0xD6, 0xF4, 0xF4, 0xB4, 0x8D, 0xED, 0x32, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x45, 0xD4, 0xC0, 0x2D, 0xA2, 0x9B, 0x7C, 0xF3,
0x64, 0x87, 0x53, 0x8E, 0x7E, 0x21, 0x07, 0x77, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0x0B, 0xF2, 0xE6, 0x41, 0x7D, 0x23, 0x6E, 0xEC, 0x7E, 0x6A, 0xCA, 0xC8, 0x48, 0x34, 0x3B,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xF3, 0xEB, 0xAF, 0x9B, 0x54, 0xC5, 0x97, 0x9E,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x51, 0x50, 0x12, 0x35, 0xFE, 0xCD, 0xF3, 0xF0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x7F, 0x31, 0xDC, 0xE9, 0xD7, 0x26, 0x13, 0x8B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x4E, 0x69, 0x50, 0x49, 0x63, 0x11, 0x06, 0x80, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xB4, 0x06, 0xDB, 0x24, 0x4B, 0x9A, 0x01, 0x17, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xB9, 0xDF, 0x71, 0xEF, 0x2C, 0xFB, 0xA1, 0x8B,
0xEF, 0xD9, 0x3D, 0x17, 0xF3, 0xDB, 0xCC, 0x84, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x87, 0xC1, 0x74, 0x10, 0xAC, 0x54, 0x89, 0x58,
0xD0, 0x88, 0xE0, 0x52, 0xC7, 0x3E, 0x5A, 0xBD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x15, 0x7D, 0x74, 0x92, 0xB9, 0xC3, 0x0A, 0x55, 0x1C, 0x65, 0x2C, 0x63, 0x37, 0xA7, 0xC1, 0xD1,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x36, 0xAE, 0xD7, 0x50, 0x87, 0xDC, 0x1B, 0x8D, 0x27, 0x40, 0xF2, 0x11, 0xEA, 0x95, 0xE5, 0xE3,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x5A, 0xE7, 0x7E, 0x10, 0x60, 0x1D, 0x76, 0xCB, 0xED, 0x8B, 0x85, 0x50, 0x4B, 0x49, 0xFB, 0x53, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xEA, 0x3E, 0x72, 0x4E, 0x9E, 0x2A, 0x37, 0x20, 0x6D, 0x6F, 0x8A, 0x3D, 0x47, 0xCA, 0xBB, 0xD3, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xC6, 0x19, 0xEE, 0x93, 0xDD, 0x45, 0x3B, 0x05, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x8D, 0x31, 0xC2, 0x06, 0xBC, 0x8C, 0xEA, 0x3A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xB5, 0xC2, 0x88, 0xDD, 0xFF, 0xC7, 0x2B, 0x59,
0x1F, 0x16, 0x96, 0x53, 0x7D, 0x27, 0x94, 0xD4, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA0, 0x01, 0x3B, 0x01, 0x8C, 0x57, 0xF7, 0x67,
0xAC, 0x55, 0xA1, 0x9F, 0x5A, 0x3C, 0xD8, 0xC8, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1D, 0xD8, 0xC5, 0xF1, 0x85, 0xDC, 0xCC, 0x9D, 0xEE, 0x08, 0x10, 0x08, 0x18, 0x55, 0x64, 0xEE,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x38, 0x1C, 0x8B, 0xCF, 0xED, 0x48, 0x0A, 0x99, 0xE5, 0x68, 0x0A, 0xA1, 0x02, 0xE2, 0xCF, 0x21,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE3, 0x6E, 0x95, 0x4D, 0xE2, 0x0C, 0xE8, 0x31, 0x9B, 0x08, 0x0A, 0x3F, 0xCE, 0xB2, 0xC8, 0x5C, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xD2, 0x9C, 0x90, 0x59, 0xCE, 0x63, 0xEF, 0xEB, 0x49, 0xF9, 0x04, 0x4F, 0xBC, 0x9B, 0x7A, 0x3B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x36, 0x3B, 0x63, 0x97, 0xC5, 0x14, 0x3D, 0xA8, 0x4E, 0x8D, 0x6E, 0xFF, 0x1F, 0xE1, 0x49, 0xC5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0xFB, 0x86, 0x87, 0x5D, 0x96, 0xDA, 0x3A, 0x39, 0x3A, 0x0B, 0xF2, 0xEA, 0xEF, 0x13, 0x2E, 0xD9, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x39, 0x2B, 0x99, 0x13, 0x61, 0x39, 0xF9, 0xF8,
0xFA, 0xBE, 0x2E, 0xA0, 0x97, 0x36, 0x75, 0x53, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x64, 0x9E, 0xFF, 0xE0, 0x9B, 0xC6, 0x0B, 0xD6,
0xFA, 0x1D, 0x8E, 0x5D, 0xD6, 0x23, 0x11, 0xCD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x18, 0x56, 0x09, 0xDC, 0x7A, 0x6B, 0xD1, 0x0D,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x3E, 0xAB, 0x30, 0xC7, 0x00, 0xFE, 0xDD, 0xF0,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x53, 0x42, 0xF8, 0x3D, 0x9C, 0xF7, 0x36, 0x12, 0x97, 0xDF, 0x02, 0x89, 0xD9, 0xC4, 0xF1, 0x6F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x80, 0xAB, 0xCE, 0x51, 0x01, 0xEA, 0xBA, 0x14, 0x26, 0x14, 0xBD, 0x1D, 0xF1, 0xF2, 0x0C, 0x70, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xE1, 0x5F, 0xE4, 0xF7, 0x86, 0x78, 0x58, 0xAE, 0xD0, 0x5B, 0x13, 0x70, 0x78, 0x2F, 0xEB, 0x8A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xDC, 0x34, 0x6F, 0xE4, 0x48, 0x89, 0x06, 0x29, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0,
0x3A, 0x1A, 0x65, 0x5E, 0xDE, 0x64, 0xD9, 0xB2, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07,
0x50, 0xB9, 0xBC, 0x30, 0xCC, 0xD5, 0xE2, 0xB7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x9B, 0x92, 0x05, 0x34, 0xD7, 0x44, 0x56, 0x2B,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x52, 0xCE, 0x21, 0x4B, 0xAB, 0x25, 0xD1, 0x96,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC1, 0xB4, 0x11, 0x2E, 0x3B, 0x14, 0x9E, 0x8D, 0xA9, 0x56, 0x97, 0x94, 0xAC, 0x99, 0xCB, 0xCB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9D, 0x8F, 0x04, 0x03, 0x25, 0xA4, 0x4D, 0x1F, 0x85, 0x1D, 0x53, 0x14, 0xD3, 0xFD, 0x7A, 0x94, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xA7, 0xBE, 0xDE, 0x23, 0x9F, 0x58, 0xE2, 0xFD, 0x58, 0x39, 0x72, 0xD1, 0xE7, 0x32, 0x26, 0xCE, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0xD0, 0x15, 0x5C, 0x5F, 0x61, 0xFA, 0x2F, 0x94, 0xE8, 0x0F, 0x97, 0x09, 0xBB, 0x3D, 0x69, 0x05, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x5A, 0x18, 0x74, 0x09, 0x15, 0x4B, 0x11, 0x28,
0xC1, 0x0A, 0x3E, 0xFF, 0x06, 0xC6, 0x85, 0x60, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x22, 0x52, 0xBD, 0x8F, 0xFD, 0x98, 0xCC, 0x77,
0x1F, 0x37, 0x34, 0x3F, 0xFE, 0x6E, 0x84, 0x70, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x76, 0x51, 0x1B, 0x58, 0x20, 0x75, 0xD0, 0x8B,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x93, 0x33, 0xE8, 0x3B, 0x76, 0x3A, 0xB7, 0x4F,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x87, 0x04, 0x9B, 0x43, 0xB2, 0xEF, 0xB6, 0x63, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x57, 0x97, 0xA1, 0xE1, 0x4D, 0xF3, 0x6E, 0x53, 0x4C, 0x9F, 0xBE, 0x72, 0x7F, 0x96, 0x08, 0x1A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x84, 0x6F, 0x06, 0xB1, 0x2F, 0xA8, 0xE0, 0xED, 0xF7, 0x0B, 0x1D, 0xAD, 0x4A, 0xFB, 0xFD, 0x67, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
0xE9, 0xE2, 0x29, 0x71, 0x68, 0x43, 0x13, 0xF7, 0xC1, 0xC5, 0xE2, 0x31, 0xC4, 0xFE, 0x05, 0xF4, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xCA, 0xF8, 0xFB, 0xFE, 0xB3, 0x98, 0xD5, 0x23,
0x7E, 0xB8, 0x61, 0x62, 0xFB, 0xAD, 0x34, 0x0A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xB5, 0x8C, 0x6B, 0x00, 0xF7, 0x73, 0xB7, 0x60,
0x56, 0x00, 0xAA, 0x14, 0x05, 0xFA, 0x0A, 0x33, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE7, 0xB2, 0xA4, 0x91, 0x67, 0xA7, 0x4F, 0x56, 0xFD, 0xB8, 0x18, 0x09, 0xCC, 0x67, 0x94, 0x80,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x2D, 0x15, 0x36, 0x0D, 0xB2, 0xCE, 0x0F, 0x52, 0x06, 0xED, 0x5A, 0xDB, 0x7F, 0xEA, 0x41, 0xD1,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xA9, 0x6E, 0xBF, 0x42, 0x81, 0x8F, 0xCA, 0x9F, 0xDF, 0x59, 0x70, 0x73, 0xD4, 0x3B, 0x16, 0xE7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xCE, 0x32, 0x26, 0x61, 0xF4, 0xEC, 0x05, 0xDE, 0xA7, 0x47, 0x8C, 0xD3, 0x8F, 0xEB, 0x16, 0xC9, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x09, 0x04, 0xC8, 0x38, 0xA9, 0xE1, 0x18, 0xF3, 0x2D, 0xA3, 0xC2, 0xAD, 0x52, 0x67, 0x2A, 0x26, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x46, 0x77, 0x47, 0xD3, 0x2F, 0x0B, 0x95, 0x86,
0x04, 0x4D, 0xBC, 0x98, 0xDE, 0xBB, 0x39, 0x16, 0x0F, 0x3F, 0xA0, 0x12, 0xC4, 0x49, 0x14, 0x3A, 0xFE, 0x0B, 0xDD, 0x44, 0xE7, 0x9D, 0x2A, 0x4B, 0x46, 0x22, 0x6D, 0xDA, 0x9C, 0x73, 0x3D, 0x44,
0x0D, 0x97, 0x9E, 0x08, 0xF1, 0x5B, 0xC2, 0x0C, 0x8A, 0x63, 0x77, 0x3B, 0x49, 0xCC, 0xE0, 0x8F, 0xEC, 0x4F, 0xD6, 0xED, 0x6D, 0xCF, 0x52, 0xCB, 0xF1, 0x0E, 0x32, 0xB5, 0x67, 0x5A, 0xFB, 0xA6,
0xCB, 0xB4, 0x8C, 0xDB, 0x6B, 0x9A, 0x11, 0x8C, 0x60, 0xB6, 0x47, 0xAA, 0x1E, 0x56, 0x4A, 0x6B, 0xEF, 0x5D, 0xA6, 0x88, 0x39, 0x5A, 0xA9, 0x3E, 0x98, 0x54, 0x4A, 0x42, 0x84, 0x9C, 0x5D, 0xB4,
0xAE, 0xF2, 0xA7, 0x5A, 0xB8, 0x3F, 0x0C, 0xA2, 0xF4, 0x89, 0x17, 0x7E, 0x97, 0x46, 0x53, 0x36, 0xF0, 0x5D, 0xA7, 0xFA, 0x2D, 0x0D, 0x3B, 0x59, 0xD1, 0x96, 0x10, 0xB0, 0x6F, 0xAF, 0xC6, 0xA7,
0xD2, 0x4A, 0x1C, 0x6C, 0x8D, 0x47, 0x0C, 0x08, 0xA3, 0x42, 0xB2, 0x3B, 0xDA, 0x26, 0x83, 0x94, 0x03, 0x1E, 0xC1, 0x21, 0x9D, 0x2F, 0x81, 0xF8, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2F, 0x21, 0x2F, 0xEB, 0x73, 0x66, 0x1D, 0x04, 0xDA, 0xEE, 0x9E, 0x39, 0xBB, 0x84, 0x67, 0x4D, 0xB0, 0xEA, 0xAD, 0x9C, 0xD0, 0x0A, 0x77, 0x59,
0xEC, 0xEA, 0xA6, 0xE7, 0x1C, 0x46, 0xF5, 0xA0, 0x71, 0x8F, 0xF5, 0xE2, 0xE9, 0x7E, 0xCB, 0xCC, 0xD4, 0x9D, 0x9D, 0x9F, 0xA3, 0xAC, 0x1B, 0xC1, 0x9D, 0xAB, 0x40, 0x84, 0x6B, 0x83, 0x4E, 0x59,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE9, 0x53, 0x01, 0xB6, 0x7E, 0x50, 0x70, 0x88, 0xCA, 0x09, 0x92, 0xE3, 0x17, 0xE6, 0x88, 0x31,
0xFE, 0x3A, 0x6F, 0x55, 0xFF, 0xD0, 0x2F, 0xD8, 0x8F, 0x88, 0x22, 0xB0, 0x38, 0x04, 0xD3, 0xC5, 0x39, 0xD7, 0x98, 0x4F, 0xCD, 0x03, 0x1F, 0xC8, 0x3F, 0x12, 0x18, 0xAF, 0x1D, 0x8A, 0x1F, 0xD6,
0x3C, 0xEA, 0x84, 0xAF, 0x20, 0xA4, 0xDC, 0xE2, 0x2F, 0xEF, 0x22, 0xB0, 0x02, 0x7D, 0xFC, 0xC8, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x36, 0xCF, 0x6F, 0xE9, 0x00, 0x0F, 0xB5, 0xF2,
0x2F, 0xEF, 0x22, 0xB0, 0x02, 0x7D, 0xFC, 0xC8, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0xD5, 0xB5, 0x91, 0x55, 0x37, 0x27, 0x08, 0x72, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4,
0xF2, 0x40, 0xA5, 0xC4, 0x42, 0x18, 0xCB, 0x57, 0xD5, 0xB5, 0x91, 0x55, 0x37, 0x27, 0x08, 0x72, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44,
0x13, 0x72, 0xF8, 0xA3, 0xFA, 0x42, 0x86, 0xAC, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44, 0x0F, 0xAE, 0xF9, 0xB5, 0xEC, 0xD1, 0x2D, 0xB9,
0x55, 0x51, 0x2A, 0x5E, 0x54, 0x69, 0x19, 0xBA, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53, 0x2A, 0x03, 0xD7, 0xFC, 0x3B, 0xE1, 0x0E, 0x72, 0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B,
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x7A, 0x2F, 0xCB, 0x9D, 0x42, 0x5D, 0x5A, 0x46, 0x3E, 0xA8, 0x81, 0x61, 0xBB, 0xCB, 0x5E, 0x98, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53,
0xF8, 0x06, 0x15, 0x38, 0xB4, 0x81, 0x30, 0xFD, 0x33, 0x0F, 0x21, 0x15, 0x76, 0xFC, 0x3D, 0xB8, 0xB1, 0xFE, 0x53, 0x6E, 0x60, 0x7D, 0xA8, 0xCC, 0x6A, 0x7D, 0xF9, 0xB1, 0x18, 0x19, 0x0A, 0xAF,
0xDA, 0x2A, 0x1C, 0xEF, 0xA1, 0x70, 0x43, 0x95, 0x8B, 0x06, 0xB1, 0xF2, 0x2B, 0xF7, 0x4E, 0x54, 0xA4, 0xFA, 0x39, 0x45, 0xA7, 0xB7, 0x24, 0x00, 0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B,
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0xD6, 0x0A, 0x65, 0x93, 0xDB, 0xE9, 0xC3, 0xC7, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53,
0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22, 0x7C, 0x63, 0x41, 0x4A, 0x99, 0x1D, 0x8A, 0xEA,
0x29, 0xBB, 0xBA, 0x1B, 0x58, 0xE4, 0x1D, 0x60, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x05, 0x79, 0x71, 0x2C, 0xC3, 0x28, 0x3A, 0x40, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4,
0xF2, 0x40, 0xA5, 0xC4, 0x42, 0x18, 0xCB, 0x57, 0x05, 0x79, 0x71, 0x2C, 0xC3, 0x28, 0x3A, 0x40, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44,
0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xC7, 0x1F, 0xEA, 0x68, 0x98, 0xE0, 0x35, 0x5D, 0xBC, 0x4C, 0x1D, 0x6E, 0x6B, 0x2F, 0x6F, 0xDB, 0x71, 0x3E, 0xB9, 0x7D, 0xF2, 0xC0, 0x2F, 0xD3,
0x31, 0x7E, 0xDC, 0xE7, 0xF3, 0x6B, 0xA9, 0x8B, 0x81, 0x27, 0xD8, 0x4F, 0x69, 0xE1, 0x53, 0xBC, 0x8E, 0x92, 0x09, 0x3A, 0xFA, 0x94, 0x83, 0x46, 0xE1, 0x4D, 0x7B, 0x34, 0x5E, 0x59, 0x90, 0x4B,
0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0xAA, 0x16, 0xD9, 0x79, 0x45, 0x0B, 0x9D, 0x78, 0xF5, 0x5C, 0x17, 0xB6, 0xEF, 0x7F, 0x9D, 0xA2, 0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41,
0x81, 0x0C, 0x0E, 0xE3, 0x2B, 0x3C, 0x74, 0xC6, 0x52, 0x8F, 0xBD, 0xEE, 0xAB, 0xB4, 0xA6, 0x3F, 0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0x77, 0x5B, 0x2D, 0x77, 0x28, 0x3C, 0x2B, 0x55,
0x3A, 0x02, 0x01, 0xC1, 0xB8, 0x0E, 0x57, 0xC6, 0x78, 0x23, 0x8E, 0x04, 0xD3, 0x54, 0xC3, 0xE7, 0xB0, 0xEA, 0x08, 0xC1, 0x4B, 0x4C, 0x6B, 0xAA, 0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13,
0x79, 0x05, 0xA2, 0x23, 0x54, 0xE6, 0x2A, 0x70, 0xF9, 0xCC, 0x47, 0x30, 0xE3, 0xB6, 0x8D, 0x2C, 0xC3, 0x1C, 0x3C, 0x20, 0x02, 0xF7, 0xB5, 0x5B, 0x8D, 0xE4, 0xF8, 0x55, 0xDE, 0x60, 0x74, 0x56,
0xE7, 0xA3, 0x5B, 0x02, 0x6E, 0xBF, 0x9F, 0x4E, 0x40, 0x49, 0x69, 0x7F, 0x14, 0x46, 0x39, 0x92, 0x51, 0x9C, 0x15, 0xCB, 0x12, 0xAF, 0xA2, 0x1C, 0x60, 0x51, 0x8A, 0x93, 0xE4, 0x99, 0x73, 0xE9,
0x42, 0x95, 0xC1, 0x97, 0x04, 0xDB, 0x1A, 0x91, 0x65, 0x91, 0x1D, 0x92, 0xA8, 0x90, 0x03, 0x4E, 0xCA, 0x8C, 0x68, 0x3B, 0x4F, 0xF0, 0x99, 0x55, 0xAE, 0xC2, 0x3F, 0xE9, 0x6E, 0x03, 0xF3, 0x88,
0xA4, 0xFC, 0x35, 0x30, 0xD5, 0xB1, 0xB6, 0xEA, 0x73, 0xA2, 0xB5, 0x47, 0x2E, 0xC1, 0x39, 0xD7, 0x9C, 0x87, 0xC0, 0x15, 0x30, 0x8A, 0xAE, 0xF2, 0xAC, 0x8D, 0x8B, 0x79, 0x5C, 0x63, 0xB7, 0x70,
0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x62, 0x83, 0x79, 0x83, 0x2D, 0xCA, 0xEF, 0xCC, 0x4E, 0x95, 0xFD, 0x7A, 0xCB, 0x4C, 0xF1, 0x2E, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17,
0x75, 0x02, 0x39, 0x7B, 0x27, 0x88, 0x4F, 0x51, 0xED, 0xF4, 0x82, 0x98, 0x6F, 0x55, 0xE0, 0xBC, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0xCA, 0x1E, 0x5F, 0x36, 0xFC, 0x44, 0x9E, 0xA1,
0x30, 0x94, 0x9F, 0xC5, 0x06, 0x3B, 0x64, 0x99, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x60, 0x9B, 0x85, 0x2D, 0x01, 0x9D, 0xF0, 0xD1, 0xD6, 0xBE, 0x38, 0xE9, 0xDC, 0x51, 0x98, 0x98,
0xA2, 0xB8, 0x90, 0x71, 0xFA, 0xA7, 0xB3, 0xDC, 0x5F, 0x6F, 0xEC, 0x96, 0xE9, 0xF8, 0xBB, 0xA1, 0x0D, 0x85, 0xFE, 0x23, 0x41, 0x37, 0x03, 0x16, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x95, 0x74, 0x76, 0x7A, 0x38, 0x4D, 0xEF, 0x8D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xCE, 0xC9, 0x38, 0xCE, 0x52, 0xC4, 0x7A, 0xC2,
0xE7, 0x8F, 0x32, 0x8D, 0x9E, 0x17, 0xD4, 0x88, 0x99, 0xEA, 0x8E, 0x83, 0xAC, 0xEA, 0xEA, 0xA7, 0x1C, 0xBA, 0xE3, 0x08, 0x48, 0xFD, 0x2A, 0xCB, 0xD3, 0x40, 0x14, 0x11, 0x10, 0xF2, 0x03, 0x53,
0x96, 0x02, 0x9B, 0xCF, 0xAD, 0xEB, 0x9E, 0x35, 0x65, 0xA9, 0xE2, 0xA9, 0xF0, 0xCB, 0x76, 0xA9, 0x2D, 0x35, 0xBF, 0x5C, 0x90, 0x83, 0x66, 0x38, 0x1C, 0xBA, 0xE3, 0x08, 0x48, 0xFD, 0x2A, 0xCB,
0xB0, 0xE0, 0xC7, 0x87, 0x29, 0x1B, 0x34, 0x62, 0xC5, 0x0D, 0x49, 0xE8, 0x74, 0x80, 0x83, 0x98, 0x79, 0xBF, 0x66, 0x3F, 0xD6, 0x53, 0x1F, 0x62, 0x35, 0xA7, 0x60, 0x91, 0xE2, 0x11, 0x9F, 0x69,
0x9A, 0xB9, 0x11, 0x95, 0xE4, 0x09, 0x3A, 0xC7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2C, 0xF3, 0xCF, 0xBA, 0x38, 0x0F, 0xE8, 0x1F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x15, 0x73, 0xDC, 0x9A, 0xC6, 0x6E, 0xED, 0x8E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xE5, 0xBA, 0xAB, 0x96, 0xA8, 0xC9, 0x56,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFB, 0xB0, 0x54, 0x01, 0xF8, 0xFA, 0xD2, 0xBD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x5E, 0x13, 0xB0, 0xF9, 0xF3, 0xF1, 0x59, 0x4B, 0xBA, 0x71, 0x18, 0xDD, 0xEB, 0x69, 0xD4, 0x01, 0x5A, 0xC6, 0xE9, 0xD2, 0x49, 0x1C, 0x60, 0xD6, 0x11, 0x15, 0x93, 0x43, 0x5A, 0x58, 0x38, 0x8D,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x77, 0x90, 0x8B, 0xBF, 0xA8, 0x2C, 0x04, 0x93, 0x3C, 0xEA, 0x84, 0xAF, 0x20, 0xA4, 0xDC, 0xE2, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
0x03, 0xE7, 0xB9, 0xEF, 0xFD, 0x5C, 0xFB, 0x72, 0xFB, 0x33, 0x11, 0x96, 0x23, 0x2C, 0x9A, 0x01, 0xA1, 0x1E, 0xB8, 0xA0, 0x79, 0x1B, 0x96, 0x5D, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0x7C, 0xD6, 0xA7, 0x13, 0xF0, 0xB2, 0xEF, 0x45, 0x82, 0xB0, 0xF4, 0x78, 0x6F, 0x90, 0x30, 0x6A, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26,
0x41, 0x9D, 0xAC, 0xAB, 0x73, 0x33, 0xD5, 0xF9, 0xCE, 0xAA, 0xC3, 0xD8, 0xCF, 0x59, 0xBA, 0x47, 0x72, 0x8F, 0x85, 0x1E, 0x17, 0xD9, 0x67, 0x6F, 0x94, 0x87, 0x56, 0xFA, 0x6E, 0x58, 0x17, 0xD6,
0x8B, 0x06, 0xB1, 0xF2, 0x2B, 0xF7, 0x4E, 0x54, 0xCB, 0x19, 0x4E, 0x28, 0x0C, 0x64, 0x82, 0x78, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9, 0x09, 0x33, 0x07, 0xE1, 0xC6, 0x64, 0x37, 0xF1,
0xE6, 0xD3, 0x7F, 0xA7, 0xF0, 0xAF, 0x53, 0x6C, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0x99, 0x4F, 0xAF, 0x1F, 0x97, 0x18, 0x65, 0xAB, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9,
0x27, 0xDB, 0x24, 0x6A, 0xE9, 0xBB, 0x0F, 0xDD, 0x4D, 0x16, 0xAB, 0x79, 0x24, 0x3D, 0xC7, 0xEB, 0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x39, 0xFD, 0xD0, 0x3A, 0x3C, 0x88, 0xA9, 0x9C,
0x48, 0x6B, 0x06, 0x08, 0xF1, 0xAD, 0x0D, 0xD1, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22,
0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F,
0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x29, 0x35, 0x1F, 0x8C, 0x23, 0xDC, 0xB4, 0x2C, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8, 0xEC, 0x5F, 0x1B, 0x7C, 0x9D, 0x7E, 0xFF, 0xEC,
0x1F, 0x52, 0xF3, 0x4D, 0x9C, 0x5E, 0x99, 0x38, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0xF3, 0xFE, 0x1B, 0x3E, 0x5C, 0x3C, 0x4E, 0x20, 0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50,
0x09, 0x33, 0x07, 0xE1, 0xC6, 0x64, 0x37, 0xF1, 0x5C, 0xBA, 0x8E, 0x00, 0x8E, 0x03, 0xD9, 0x70, 0x29, 0xC9, 0x3E, 0x74, 0x18, 0x80, 0x78, 0xD6, 0x5C, 0x9D, 0x75, 0x13, 0xD9, 0x0F, 0x3C, 0x0F,
0xD4, 0x0B, 0x46, 0xA7, 0x56, 0x6D, 0x6E, 0xA3, 0x78, 0xC7, 0xE9, 0x83, 0xB0, 0x70, 0xF7, 0xFA, 0x5C, 0xBA, 0x8E, 0x00, 0x8E, 0x03, 0xD9, 0x70, 0x29, 0xC9, 0x3E, 0x74, 0x18, 0x80, 0x78, 0xD6,
0xB2, 0xEB, 0xEC, 0xC4, 0x33, 0x86, 0x8E, 0x5E, 0x13, 0x98, 0xC8, 0xD6, 0xFF, 0x98, 0xD3, 0x74, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8,
0x4A, 0xB5, 0x00, 0xA5, 0xA7, 0x98, 0x5B, 0xB7, 0xC4, 0xDF, 0xD5, 0x09, 0xFB, 0x1A, 0xCE, 0xB0, 0xB3, 0x3B, 0x70, 0x57, 0x6F, 0xED, 0xC4, 0xCF, 0xF6, 0xA7, 0x90, 0x48, 0x61, 0x9F, 0xD8, 0x91,
0xBB, 0x75, 0x39, 0x69, 0xFF, 0xD9, 0x05, 0xA2, 0x9A, 0x49, 0x74, 0xAC, 0xF9, 0xF6, 0x1A, 0xDB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFB, 0x85, 0x34, 0x42, 0x99, 0x1C, 0xB4, 0xB5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x56, 0xCA, 0xDE, 0xB9, 0xBA, 0x84, 0x87, 0x1B, 0x38, 0x99, 0x53, 0x71, 0xD7, 0x81, 0x14, 0xC2,
0x37, 0x37, 0x5F, 0x88, 0xD1, 0x87, 0xD7, 0xAD, 0x2E, 0x3C, 0x12, 0x33, 0xF8, 0x56, 0x81, 0x2F, 0x36, 0x78, 0xE5, 0x04, 0x19, 0x53, 0x02, 0x09, 0xB1, 0xFE, 0x53, 0x6E, 0x60, 0x7D, 0xA8, 0xCC,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x6E, 0x8D, 0x1E, 0xEA, 0xF2, 0x93, 0x70, 0xAD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xAF, 0x27, 0x59, 0x79, 0xD8, 0x8D, 0x2D, 0x6C, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0A, 0x94, 0xAD, 0x1D, 0x0F, 0x4D, 0x0B, 0x0C,
0x9B, 0x03, 0x0D, 0xA3, 0xF4, 0xA2, 0xF2, 0xDB, 0xC2, 0x74, 0x19, 0xB2, 0x2B, 0x46, 0x2A, 0x67, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0x43, 0xE1, 0x9C, 0x47, 0xA9, 0x24, 0xAA, 0x0D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xED, 0xA8, 0xA8, 0x3B, 0xD8, 0x95, 0x3E, 0x9B, 0xC2, 0x09, 0x73, 0xE5, 0xEA, 0xB1, 0xFF, 0xE2,
0x2E, 0x50, 0x7C, 0x0C, 0x27, 0x58, 0x98, 0x57, 0x83, 0x0F, 0x65, 0xF5, 0x9C, 0x29, 0x95, 0x51, 0xE7, 0x6E, 0x3B, 0xA8, 0x6F, 0xCD, 0x7A, 0x26, 0x9D, 0x54, 0x00, 0xFE, 0x08, 0xB6, 0x1D, 0xAA,
0xF7, 0xBF, 0x41, 0x22, 0x71, 0x27, 0x1D, 0x57, 0xBE, 0x1C, 0x9B, 0x1E, 0x11, 0x3E, 0x1B, 0xC4, 0x05, 0x5F, 0x51, 0x56, 0x29, 0x1E, 0x4B, 0x8E, 0xBE, 0x1C, 0x9B, 0x1E, 0x11, 0x3E, 0x1B, 0xC4,
0xF0, 0x7E, 0x18, 0xA8, 0x25, 0x02, 0x07, 0xC1, 0xA3, 0x6E, 0xAE, 0x75, 0x4F, 0x51, 0xC9, 0x30, 0xF0, 0x55, 0x95, 0x72, 0x06, 0x8A, 0x0D, 0xBB, 0x73, 0x89, 0x9F, 0x03, 0xEB, 0xE7, 0x89, 0x90,
0x73, 0x3D, 0x92, 0xD7, 0xE0, 0x96, 0xCC, 0xFE, 0x76, 0x7E, 0x46, 0x91, 0x21, 0xA9, 0x76, 0x7F, 0xD2, 0x35, 0xA8, 0x2C, 0x62, 0x5E, 0xB7, 0x89, 0xDD, 0xCC, 0xD4, 0xF2, 0xA0, 0xAC, 0x79, 0x6F,
0xB9, 0xD3, 0x54, 0x9F, 0x04, 0xA5, 0x52, 0xA1, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0xA4, 0x14, 0x0A, 0xE9, 0x1E, 0x2F, 0xC5, 0x22, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F,
0x59, 0x9C, 0x33, 0x0B, 0x1F, 0x4F, 0x97, 0x03, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0x14, 0x6F, 0x25, 0x68, 0xCC, 0x7E, 0x08, 0x06, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F,
0x8B, 0x59, 0x9B, 0x06, 0x3C, 0xD1, 0xDB, 0x27, 0xF8, 0xEB, 0x4C, 0x73, 0x15, 0x96, 0x9C, 0xE5, 0xDA, 0x3A, 0x81, 0x7F, 0x41, 0xFB, 0x9B, 0xB3, 0x2D, 0x1D, 0x76, 0xF4, 0xAC, 0x77, 0x0B, 0xE1,
0xCB, 0xE4, 0x26, 0x24, 0xF8, 0x70, 0x94, 0xA9, 0x45, 0xA6, 0x85, 0x5D, 0x29, 0xCA, 0x0F, 0xF5, 0xFE, 0x46, 0x01, 0x10, 0x99, 0xF9, 0x0C, 0x42, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
0xD0, 0x66, 0x50, 0x87, 0xB9, 0x54, 0x0B, 0x98, 0x10, 0x3E, 0x3A, 0x4C, 0xC9, 0xAD, 0x8F, 0x4C, 0xEA, 0xD0, 0x97, 0x3B, 0x76, 0x14, 0x8D, 0x96, 0x5C, 0xC6, 0x6D, 0x5B, 0x12, 0xFB, 0xCF, 0x61,
0xA0, 0x68, 0x21, 0xF9, 0xE2, 0x06, 0x23, 0x04, 0x2A, 0x13, 0x7F, 0x72, 0x46, 0xC3, 0x03, 0x80, 0x18, 0xEF, 0x9F, 0x0F, 0x32, 0x5B, 0x2A, 0x8C, 0xD7, 0x7F, 0xB3, 0x00, 0x37, 0x4C, 0x1B, 0x60,
0xE4, 0xF8, 0x2C, 0x93, 0xB4, 0x6E, 0x65, 0x18, 0x77, 0x58, 0xB6, 0xF6, 0xE7, 0x7B, 0xAE, 0x03, 0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0x03, 0xE7, 0xB9, 0xEF, 0xFD, 0x5C, 0xFB, 0x72,
0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0xB4, 0x76, 0xAF, 0x43, 0x02, 0x0B, 0x97, 0x88, 0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0xAC, 0x7B, 0x61, 0xC4, 0xBC, 0xBE, 0x69, 0x99,
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B, 0x3E, 0x1B, 0x46, 0xB0, 0xE3, 0x97, 0x77, 0xEC, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
0xE7, 0x2F, 0x99, 0x81, 0x37, 0x6C, 0xD7, 0xD0, 0x5F, 0xB6, 0x10, 0x44, 0xA4, 0xA5, 0xEC, 0xA3, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31,
0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89, 0x70, 0x85, 0xFE, 0xA6, 0xCD, 0x41, 0x8E, 0x4F, 0xA2, 0x02, 0x03, 0xF4, 0x6F, 0x47, 0xAB, 0xA9, 0x27, 0x8F, 0xBF, 0xF3, 0x69, 0xE9, 0xAC, 0x1D,
0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0xF7, 0x32, 0x3D, 0x2D, 0x41, 0xD7, 0xC9, 0x76,
0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0x39, 0x70, 0x85, 0xB7, 0x81, 0x64, 0xE4, 0x84, 0x96, 0x6F, 0xA4, 0x1D, 0xFF, 0xE1, 0x53, 0x1A, 0x5F, 0xB6, 0x10, 0x44, 0xA4, 0xA5, 0xEC, 0xA3,
0xD4, 0x0B, 0x46, 0xA7, 0x56, 0x6D, 0x6E, 0xA3, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13, 0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F,
0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x0F, 0x87, 0x56, 0xE3, 0x92, 0xE2, 0xBB, 0xB9, 0x2E, 0x55, 0xD7, 0x4F, 0xD6, 0x38, 0x64, 0x39,
0x76, 0xB4, 0x00, 0x69, 0x99, 0xEF, 0x2C, 0x56, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x58, 0xCE, 0x07, 0xF6, 0x3C, 0x78, 0x53, 0x4A, 0xEF, 0x33, 0xF5, 0x36, 0x9A, 0x38, 0xFA, 0xC6,
0xF5, 0xED, 0x67, 0xAF, 0xAE, 0xAB, 0x7C, 0x95, 0xE8, 0x39, 0x08, 0x8F, 0x66, 0x86, 0xF5, 0xEC, 0x10, 0x90, 0x40, 0x19, 0x82, 0x77, 0xC8, 0x03, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
0x74, 0x2C, 0xE1, 0x99, 0x9E, 0xE4, 0xA2, 0x06, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0x43, 0xA1, 0xA7, 0x05, 0x4A, 0x25, 0x8C, 0xF1, 0x4B, 0x5C, 0xB8, 0xC2, 0xA0, 0x8A, 0xE8, 0x8E,
0x95, 0x3B, 0x8A, 0xDC, 0x38, 0x29, 0x26, 0x57, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3, 0x1D, 0x20, 0xF2, 0xFC, 0x27, 0x46, 0x71, 0x1A, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
0x81, 0x99, 0x01, 0xE2, 0x93, 0x96, 0x7E, 0x5D, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x4D, 0xD1, 0xF4, 0xC5, 0xA4, 0x7B, 0x3B, 0xB2, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4,
0x18, 0x43, 0x3F, 0x11, 0x08, 0x69, 0x4E, 0x48, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3, 0x1E, 0xD5, 0x63, 0x6B, 0x18, 0x36, 0xA1, 0xEE, 0x59, 0xCC, 0x0D, 0x3B, 0xB5, 0xBA, 0x5E, 0x54,
0x54, 0xAA, 0xBB, 0x23, 0xE0, 0x03, 0x15, 0xD3, 0x57, 0xEC, 0x92, 0x60, 0x3D, 0xC0, 0x8B, 0xFC, 0x4D, 0xD0, 0x8E, 0x7D, 0x11, 0xCC, 0xCA, 0xDE, 0x45, 0xA6, 0x85, 0x5D, 0x29, 0xCA, 0x0F, 0xF5,
0x33, 0xEC, 0x22, 0x51, 0x67, 0x72, 0x0C, 0x08, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0xA1, 0x1E, 0xB8, 0xA0, 0x79, 0x1B, 0x96, 0x5D, 0x8A, 0xE1, 0xA1, 0x04, 0x9B, 0xD1, 0x07, 0x94,
0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x68, 0x72, 0x01, 0x1C, 0xAE, 0x6A, 0x22, 0x60, 0x90, 0xCE, 0x34, 0x94, 0xE0, 0x42, 0x13, 0x00, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31,
0xB1, 0xFD, 0xED, 0x44, 0x4B, 0xB7, 0x17, 0xB6, 0xE7, 0xE4, 0x89, 0x39, 0x42, 0xEA, 0xF5, 0x52, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22,
0x0C, 0xBA, 0x0E, 0xA4, 0x7A, 0x04, 0xF4, 0xAC, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2, 0xFB, 0x9A, 0x44, 0xAE, 0xB3, 0x7E, 0x0C, 0xD4, 0x8E, 0x47, 0x27, 0x3F, 0xF7, 0xCB, 0xF1, 0xBF,
0xB0, 0x54, 0x6F, 0x6B, 0x9A, 0xC8, 0x19, 0xB6, 0xA3, 0x51, 0x69, 0x64, 0x99, 0xC2, 0x38, 0xD1, 0xC8, 0x59, 0xCF, 0xF2, 0xA5, 0xA1, 0x4F, 0x02, 0xA8, 0xE9, 0x94, 0xB6, 0x5F, 0x78, 0xF5, 0x91,
0x82, 0x3B, 0x8F, 0x56, 0x7B, 0x46, 0xCD, 0x40, 0x3B, 0x78, 0x64, 0xFE, 0xF5, 0xF1, 0x3B, 0x27, 0xC7, 0xCF, 0x43, 0x90, 0xD1, 0x8F, 0x31, 0x44, 0x3E, 0x1A, 0xA0, 0xEF, 0x39, 0x01, 0x2D, 0x73,
0x3B, 0x78, 0x64, 0xFE, 0xF5, 0xF1, 0x3B, 0x27, 0x08, 0xE1, 0xF1, 0x26, 0x67, 0x48, 0xD1, 0xEC, 0x05, 0x74, 0x4D, 0x20, 0x8D, 0xC0, 0xFE, 0x8B, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51,
0xB0, 0x4B, 0x01, 0x03, 0x41, 0xF8, 0xDF, 0x7C, 0x4E, 0xD2, 0x57, 0x1C, 0xA7, 0x35, 0xF8, 0x6D, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x35, 0x3A, 0xFD, 0xD3, 0x05, 0x49, 0xDE, 0xD7,
0x5B, 0x77, 0xBF, 0xFA, 0x0F, 0xB1, 0xAB, 0xA7, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x96, 0x82, 0xB9, 0xE8, 0x38, 0xE1, 0xE7, 0x64, 0x06, 0xA1, 0x1F, 0xB4, 0x64, 0xEB, 0xAF, 0xB5,
0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x13, 0x39, 0xEF, 0x6A, 0x2C, 0x1F, 0xE4, 0x53, 0x5C, 0x7B, 0xBD, 0x0E, 0x0B, 0xCC, 0x64, 0x89, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51,
0x0E, 0x83, 0x91, 0x52, 0x17, 0x1D, 0x65, 0x23, 0x2B, 0x94, 0x7E, 0x22, 0xFD, 0x68, 0xA3, 0x18, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x4F, 0x1E, 0x43, 0x4D, 0x86, 0xE4, 0x09, 0xF0,
0x32, 0x1D, 0x90, 0x40, 0xA7, 0x85, 0x46, 0x04, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0xA5, 0x79, 0x96, 0x7E, 0x24, 0x1D, 0x9C, 0x67, 0xA4, 0x59, 0x3A, 0x2C, 0x26, 0xB5, 0x56, 0xF5,
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xB1, 0x76, 0x76, 0xB1, 0x23, 0x25, 0x0C, 0xC0, 0x24, 0xA8, 0x16, 0x27, 0xE7, 0x25, 0x5D, 0x67, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28,
0x91, 0x2E, 0xA8, 0x43, 0xD0, 0xD8, 0x1A, 0xAC, 0x48, 0x1E, 0x29, 0xAA, 0x2D, 0x76, 0xEC, 0x00, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x15, 0x71, 0xB1, 0xAE, 0x12, 0x42, 0x2B, 0x22,
0x52, 0x64, 0x43, 0xFC, 0xE3, 0x49, 0xD8, 0x17, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xAA, 0x65, 0x3E, 0x76, 0xD2, 0x22, 0x45, 0xD4, 0x01, 0x46, 0xC1, 0xC4, 0xD5, 0x61, 0xB6, 0x06,
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x2D, 0xA9, 0x20, 0x42, 0x64, 0x58, 0xEC, 0x45, 0x89, 0x37, 0x39, 0xF6, 0x0B, 0xA6, 0x5B, 0xF3, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28,
0x89, 0x1A, 0xC9, 0x4E, 0x9F, 0x64, 0x75, 0x74, 0xAC, 0x2C, 0x10, 0xAC, 0x10, 0x23, 0x2B, 0x61, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x42, 0x5A, 0x40, 0x04, 0x48, 0xD7, 0x24, 0xCD,
0xEE, 0x3D, 0xB1, 0xC6, 0xCC, 0x3A, 0x8E, 0x97, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x21, 0x47, 0x58, 0xF1, 0xF9, 0xD8, 0x1B, 0x84, 0x6A, 0x6D, 0x6B, 0xB7, 0x0A, 0x2C, 0x5F, 0x9C,
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xB1, 0xCC, 0x3E, 0x6B, 0x17, 0x86, 0xE6, 0x9C, 0x8C, 0x42, 0x00, 0xB2, 0x04, 0x81, 0x66, 0xA7, 0x26, 0x4A, 0xEB, 0x82, 0xB6, 0xAD, 0xD5, 0xA1,
0x7C, 0xE0, 0xCF, 0xAB, 0xD9, 0xD1, 0x9F, 0x3D, 0x29, 0x8F, 0xA1, 0x5A, 0xAD, 0xA3, 0x76, 0xD3, 0x65, 0x13, 0xA1, 0x44, 0x00, 0x8F, 0xFE, 0x05, 0x7C, 0x5B, 0xB9, 0x33, 0x16, 0xBF, 0xF9, 0x01,
0x14, 0xE9, 0xA3, 0xE9, 0x80, 0xB4, 0xAC, 0xFC, 0x40, 0x2C, 0x5A, 0x58, 0x08, 0x17, 0x79, 0x7C, 0x43, 0xEE, 0x2F, 0x7F, 0x5C, 0x1A, 0xB1, 0x0E, 0xFD, 0x00, 0x52, 0x67, 0x09, 0x59, 0x40, 0x22,
0xBF, 0x86, 0x3E, 0xC9, 0xEB, 0xC1, 0xDF, 0x63, 0x82, 0x10, 0x30, 0x8A, 0x51, 0xEF, 0x44, 0xDF, 0x06, 0x91, 0x98, 0x95, 0x60, 0x1E, 0xFD, 0x1C, 0x54, 0x16, 0x53, 0x83, 0xA5, 0xF6, 0xA0, 0x87,
0x7E, 0x80, 0x1D, 0xBB, 0xF2, 0xFB, 0x17, 0x2F, 0x72, 0x0F, 0xCD, 0x8C, 0x37, 0xBA, 0x38, 0xFD, 0x05, 0xFE, 0x52, 0x48, 0x0B, 0xC4, 0x68, 0xE2, 0x59, 0x89, 0x8B, 0x1C, 0xC9, 0x31, 0xF7, 0xC7,
0x71, 0x93, 0xCF, 0x50, 0x84, 0x4E, 0xC1, 0x53, 0x08, 0x2F, 0xCC, 0xF8, 0x59, 0x97, 0xB1, 0x19, 0x83, 0x35, 0x17, 0xD2, 0xE1, 0xE5, 0xCF, 0x15, 0x9E, 0x90, 0x21, 0x13, 0xEA, 0xEE, 0x87, 0xF0,
0xFF, 0x16, 0x4A, 0xA1, 0x1D, 0x3E, 0x11, 0x7F, 0xAD, 0x0F, 0x1F, 0x84, 0x27, 0x30, 0x7E, 0x43, 0x53, 0xFE, 0xBA, 0xB3, 0x02, 0x26, 0x63, 0x91, 0xBD, 0xD5, 0x55, 0x3C, 0x03, 0xBE, 0x89, 0x50,
0xCC, 0xCD, 0x77, 0x9E, 0xB6, 0x0A, 0x37, 0xC2, 0xFA, 0x9C, 0x71, 0x6A, 0xBB, 0x57, 0xAE, 0xB0, 0x75, 0xF2, 0xF7, 0xC5, 0x6A, 0x82, 0xD5, 0xB6, 0xAC, 0x42, 0x6B, 0x9D, 0x7A, 0x48, 0x92, 0x7B,
0xF4, 0x0A, 0xFA, 0x63, 0x3D, 0x19, 0xCD, 0x48, 0x30, 0x44, 0x92, 0x62, 0xA4, 0x7D, 0x4E, 0xF7, 0xD9, 0xAF, 0x39, 0x14, 0xEF, 0xCD, 0xD8, 0xD6, 0x99, 0x58, 0x8C, 0x79, 0x8A, 0xE5, 0xC2, 0x68,
0x87, 0x11, 0xA8, 0xC5, 0x94, 0x92, 0x8E, 0x43, 0xA9, 0x24, 0xE3, 0xD1, 0x0F, 0x17, 0xEE, 0x38, 0xF7, 0x74, 0x99, 0x03, 0xB5, 0x6C, 0xE2, 0x70, 0x64, 0x16, 0x0F, 0x53, 0xDF, 0x8D, 0x58, 0xED,
0xAB, 0x6D, 0x0F, 0xC0, 0x37, 0xAD, 0x24, 0x01, 0x95, 0x2A, 0x89, 0xFE, 0x18, 0x10, 0x67, 0x17, 0xFC, 0xCA, 0x50, 0x3D, 0x8B, 0x7E, 0xBD, 0x90, 0xCF, 0xB4, 0x4E, 0x82, 0x4B, 0x9D, 0x72, 0x55,
0xA9, 0xA1, 0x58, 0x79, 0xBF, 0xC0, 0x52, 0xE0, 0x4F, 0xE3, 0x5E, 0xAF, 0xD3, 0x56, 0xE5, 0x27, 0x56, 0xFF, 0xC9, 0x43, 0x9E, 0x64, 0x8C, 0x93, 0x23, 0x68, 0x68, 0x7A, 0xB9, 0x1B, 0x09, 0x2B,
0x33, 0x37, 0xC0, 0x24, 0x01, 0x6F, 0x48, 0xF5, 0x25, 0xE7, 0xAC, 0xA5, 0xE4, 0x91, 0xF3, 0x9F, 0xBB, 0x8E, 0x31, 0x37, 0xB8, 0xAC, 0x43, 0x69, 0x58, 0xA4, 0xD3, 0xAA, 0xBE, 0xBF, 0x61, 0x4E,
0x24, 0xDD, 0xB1, 0x2A, 0xCD, 0xFC, 0x8A, 0x70, 0x56, 0x84, 0xA0, 0x7D, 0xAF, 0xCA, 0xA0, 0xFD, 0x51, 0x82, 0xE0, 0xC9, 0x4E, 0x26, 0x38, 0x1E, 0x4D, 0x18, 0x67, 0x0F, 0x57, 0x68, 0x46, 0xEF,
0x3F, 0x82, 0xE7, 0xD4, 0x79, 0x70, 0x39, 0xCF, 0xEB, 0x3F, 0xAE, 0xED, 0x42, 0x7A, 0x27, 0xB0, 0x6F, 0xE8, 0x18, 0x21, 0xD0, 0x84, 0x9F, 0x66, 0x1F, 0xF8, 0x65, 0x43, 0x54, 0xD3, 0x90, 0x01,
0x92, 0x8F, 0xB6, 0x50, 0x78, 0xC9, 0x3F, 0x19, 0x20, 0x1E, 0xF9, 0x42, 0x7F, 0xC1, 0x87, 0x0B, 0xF6, 0x7D, 0xE0, 0x8B, 0xE1, 0x17, 0x3A, 0xAE, 0x38, 0xE9, 0x08, 0x64, 0x20, 0xBD, 0x63, 0x2F,
0x85, 0xBE, 0x97, 0x75, 0x1E, 0xDD, 0x47, 0x0B, 0x61, 0xF7, 0x01, 0xF8, 0xEB, 0x0C, 0x10, 0x51, 0xCE, 0xAC, 0x68, 0x59, 0x42, 0xBF, 0xB0, 0xBA, 0x94, 0x9C, 0xE2, 0xC1, 0xDF, 0x2A, 0x49, 0x0B,
0x5A, 0x6B, 0x31, 0xDC, 0x11, 0xE5, 0xBD, 0x6A, 0xDB, 0xF9, 0x8B, 0x60, 0xAB, 0x06, 0xBA, 0x54, 0xC6, 0xCF, 0x7E, 0xEB, 0x51, 0xB4, 0x09, 0xC8, 0x9F, 0x28, 0x5B, 0xCE, 0xB8, 0x4F, 0x18, 0x36,
0xD5, 0x25, 0x03, 0x80, 0x1A, 0xC1, 0xD5, 0xD9, 0x84, 0x48, 0xA5, 0x40, 0xFF, 0xE9, 0x86, 0xC4, 0x56, 0xE0, 0xFC, 0x8E, 0x18, 0xB8, 0x76, 0xA2, 0x60, 0x7B, 0x9D, 0x8E, 0xB6, 0x93, 0x4D, 0x59,
0x89, 0x8C, 0x80, 0x95, 0xE0, 0x26, 0x98, 0xA9, 0x1A, 0xE0, 0x9F, 0xEE, 0x1F, 0x0F, 0xAE, 0xAF, 0x0A, 0xA7, 0x98, 0x35, 0x89, 0x56, 0x71, 0x92, 0x10, 0x25, 0x1F, 0x64, 0x4B, 0x69, 0x46, 0xDD,
0xA6, 0x2E, 0xE2, 0x98, 0x01, 0x01, 0x9F, 0x8C, 0x99, 0x4D, 0x57, 0xCD, 0x5D, 0xFF, 0x4D, 0x53, 0x91, 0xDD, 0x10, 0x3C, 0xFF, 0xD2, 0xAA, 0x4E, 0x5D, 0x09, 0xF7, 0x38, 0x04, 0xF5, 0x57, 0x5E,
0x46, 0x48, 0xAE, 0x98, 0x8C, 0xFC, 0x3A, 0x3C, 0x5A, 0x60, 0x98, 0x96, 0xCF, 0x16, 0xA4, 0xF3, 0xAC, 0xAE, 0x83, 0x87, 0x2F, 0x46, 0x07, 0xC4, 0x33, 0x7A, 0x45, 0xBB, 0x72, 0x21, 0x50, 0xE2,
0xCC, 0xA6, 0xA2, 0x94, 0x5D, 0x88, 0x77, 0x37, 0x6B, 0xCF, 0x3C, 0x51, 0x83, 0xBC, 0x94, 0x89, 0xD0, 0xE2, 0xF6, 0xF3, 0xF8, 0xCE, 0x68, 0x1E, 0xAC, 0x4C, 0x2E, 0xD9, 0x11, 0xEB, 0x3B, 0xD1,
0x6C, 0xA1, 0x73, 0x6F, 0xCC, 0x99, 0x10, 0x68, 0xCF, 0xBA, 0xC1, 0x04, 0x63, 0x47, 0xC9, 0x62, 0xC1, 0xD9, 0x8F, 0xC2, 0xF3, 0xED, 0x00, 0xD3, 0x3F, 0x7F, 0xAC, 0x5D, 0x10, 0x2A, 0xBC, 0x5D,
0x8C, 0xBE, 0x65, 0x5A, 0xE0, 0x7D, 0xAC, 0x08, 0x3E, 0x30, 0x61, 0x5A, 0xEA, 0x09, 0x74, 0x52, 0xDA, 0xAC, 0x40, 0xDC, 0x0A, 0x31, 0x42, 0x46, 0x89, 0x89, 0xFC, 0xA7, 0x32, 0xCB, 0xDB, 0xDE,
0x39, 0x63, 0xFB, 0x82, 0x27, 0x8D, 0x11, 0x12, 0x70, 0xC8, 0x4E, 0x3E, 0x21, 0xB8, 0x07, 0x1A, 0x2F, 0xCF, 0xB6, 0x52, 0x30, 0xA1, 0x05, 0x40, 0xEB, 0x49, 0xB4, 0xF5, 0x59, 0xB3, 0x21, 0x15,
0xCE, 0x81, 0xD9, 0xE1, 0xCC, 0x21, 0x16, 0xAB, 0x43, 0x51, 0xF1, 0x68, 0x27, 0x52, 0xD1, 0xAF, 0x8A, 0x53, 0x51, 0x0E, 0x84, 0xAB, 0x10, 0xEF, 0x02, 0x4A, 0x7E, 0xEB, 0x2C, 0xC3, 0x6A, 0x24,
0xE0, 0x5F, 0xE0, 0x09, 0x5A, 0x37, 0xD6, 0xE1, 0x39, 0xCE, 0x5F, 0xDB, 0x0D, 0xC6, 0x0E, 0xA5, 0x29, 0xC4, 0xA4, 0xC1, 0x11, 0x0E, 0x50, 0x53, 0xDC, 0x26, 0x12, 0xF1, 0xC0, 0x72, 0x0C, 0x63,
0x4D, 0x71, 0x94, 0x5F, 0xE4, 0xB9, 0x50, 0xEA, 0xD0, 0xCB, 0x51, 0xCA, 0x73, 0x6B, 0xD6, 0x03, 0x3C, 0x7D, 0x44, 0x26, 0x1F, 0x4D, 0x75, 0xCB, 0x7C, 0x52, 0x97, 0xDF, 0xC9, 0xBB, 0x78, 0x2B,
0x77, 0xB1, 0x81, 0x49, 0xC8, 0x2B, 0x35, 0x03, 0x0C, 0xA5, 0x6D, 0x30, 0x6A, 0xEB, 0x51, 0x07, 0xC9, 0xC8, 0x9B, 0xDC, 0xE2, 0x1B, 0x8D, 0x27, 0x4E, 0xF2, 0x0F, 0x9D, 0x4D, 0xE2, 0x13, 0x53,
0x21, 0xC7, 0xFF, 0x1D, 0x75, 0x01, 0xEB, 0xFA, 0x83, 0x66, 0xA0, 0xC0, 0xDE, 0xE5, 0xD6, 0xD4, 0x6A, 0xA1, 0xD2, 0x1D, 0xB5, 0xB0, 0xBE, 0x9F, 0x2F, 0x92, 0x5B, 0xEF, 0xA0, 0x48, 0xDE, 0x99,
0x69, 0x72, 0xC8, 0x8A, 0x20, 0x82, 0xF5, 0xB1, 0xE6, 0xAA, 0xD6, 0x03, 0x98, 0xD9, 0x75, 0xEB, 0x21, 0x45, 0xEB, 0xE9, 0xDF, 0xE5, 0xD5, 0x96, 0xB5, 0x2C, 0x40, 0x14, 0xE4, 0x89, 0x9F, 0x1F,
0x74, 0x6A, 0x9C, 0x63, 0x9A, 0x6D, 0x17, 0x59, 0xF9, 0x29, 0x73, 0x62, 0xBA, 0x3B, 0x7F, 0x4C, 0xC9, 0x2C, 0xD2, 0xEA, 0xA7, 0x1D, 0xCC, 0xD4, 0x05, 0x33, 0xF8, 0x6C, 0xCA, 0xC8, 0x99, 0xD0,
0xF1, 0x49, 0x82, 0xD4, 0xE2, 0xD1, 0xF6, 0xB1, 0x0E, 0x79, 0xFA, 0x43, 0xAE, 0x66, 0xE1, 0x3A, 0x86, 0xA2, 0x61, 0xE8, 0x1E, 0x4B, 0x22, 0x74, 0xEF, 0xDA, 0x9E, 0x10, 0x67, 0x44, 0x8C, 0x32,
0xCA, 0x02, 0xB4, 0xE3, 0xB0, 0x91, 0x07, 0x74, 0xC3, 0x5F, 0x3E, 0x8D, 0x52, 0x2D, 0xE9, 0x9E, 0x9C, 0x75, 0x4E, 0x0A, 0xA7, 0xBE, 0x2C, 0xDB, 0x4A, 0xB7, 0x79, 0x2E, 0x7D, 0x30, 0xC3, 0x3F,
0x3B, 0x85, 0xB2, 0x65, 0xC6, 0x26, 0xBC, 0x02, 0x26, 0xCF, 0x75, 0x4A, 0x1F, 0xDF, 0xBB, 0x83, 0x56, 0x82, 0xA7, 0x1E, 0x64, 0xAC, 0xC7, 0x84, 0x52, 0x8C, 0x80, 0x15, 0xA3, 0x08, 0x36, 0x66,
0xD5, 0x66, 0x41, 0x5E, 0x13, 0x8B, 0xCF, 0xA3, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
}

89
encryption/bruteforce.go Normal file
View file

@ -0,0 +1,89 @@
package encryption
import (
"encoding/binary"
"math"
"runtime"
"slices"
"sync"
)
func BruteforceBorlandSeed(b EncryptedBlock, material KeyMaterial) ([]uint32, error) {
data := slices.Clone(b)
err := data.Decrypt(material, false)
if err != nil {
return nil, err
}
numCpu := runtime.NumCPU()
perCpu := math.MaxUint32 / numCpu
firstValue := binary.LittleEndian.Uint16(data[2:])
secondValue := binary.LittleEndian.Uint16(data[4:])
var foundSeeds []uint32
var foundSeedsLock sync.Mutex
var wg sync.WaitGroup
for cpu := 0; cpu < numCpu; cpu++ {
wg.Add(1)
go func(cpu int) {
defer wg.Done()
seed := uint32(cpu * perCpu)
endSeed := seed + uint32(perCpu)
if cpu == (numCpu - 1) {
endSeed = math.MaxUint32
}
for {
currentSeed := BorlandRand(seed)
seedA := uint16((currentSeed << 1) >> 0x11)
currentSeed = BorlandRand(currentSeed)
seedB := uint16((currentSeed << 1) >> 0x11)
if seedA == firstValue && seedB == secondValue {
if func() bool {
for i := 4; i < 16; i += 2 {
currentSeed = BorlandRand(currentSeed)
if binary.LittleEndian.Uint16(data[2+i:]) != uint16((currentSeed<<1)>>0x11) {
return false
}
}
for i := 0; i < 0xf3; i++ {
currentSeed = BorlandRand(currentSeed)
if binary.LittleEndian.Uint16(data[0x1a+i*2:]) != uint16((currentSeed<<1)>>0x11) {
return false
}
}
return true
}() {
func() {
foundSeedsLock.Lock()
defer foundSeedsLock.Unlock()
foundSeeds = append(foundSeeds, seed)
}()
}
}
if seed == endSeed {
break
}
seed++
}
return
}(cpu)
}
wg.Wait()
slices.Sort(foundSeeds)
return foundSeeds, nil
}

12
encryption/firmware.go Normal file
View file

@ -0,0 +1,12 @@
package encryption
func DecryptFirmwareData(buf []byte, readAddressSize bool) {
//TODO
seed := uint32(0x2009)
var blockBuf [8]byte
for i := 0; i < len(buf); i += 8 {
copy(blockBuf[:], buf[i:])
seed = BorlandRandXORInPlace(blockBuf[:], seed)
}
}

46
encryption/generator.go Normal file
View file

@ -0,0 +1,46 @@
package encryption
import (
"crypto/rand"
"encoding/binary"
"io"
)
type KeyGenerator interface {
Fill(data []byte)
MangleIndex() uint32
}
// SecureRandomKeyGenerator Generates random numbers using the system secure random number generator
type SecureRandomKeyGenerator struct{}
func (g *SecureRandomKeyGenerator) Fill(data []byte) {
io.ReadFull(rand.Reader, data)
}
func (g *SecureRandomKeyGenerator) MangleIndex() uint32 {
var buf [1]byte
io.ReadFull(rand.Reader, buf[:])
return uint32(buf[0] & 0x7)
}
// BorlandRandKeyGenerator Generates random numbers with its value as current seed
type BorlandRandKeyGenerator uint32
func (g *BorlandRandKeyGenerator) Fill(data []byte) {
seed := uint32(*g)
for i := 0; i < len(data); i += 2 {
seed = BorlandRand(seed)
binary.LittleEndian.PutUint16(data[i:], uint16((seed<<1)>>0x11))
}
*g = BorlandRandKeyGenerator(seed)
}
func (g *BorlandRandKeyGenerator) MangleIndex() uint32 {
seed := uint32(*g)
seed = BorlandRand(seed)
mangleIndex := (seed >> 0x10) & 0x7
*g = BorlandRandKeyGenerator(seed)
return mangleIndex
}

45
encryption/keys.go Normal file
View file

@ -0,0 +1,45 @@
package encryption
import (
"encoding/binary"
)
const MangleKeyBlockSize = 8
const MangleKeyDataSize = 4 * 4
const MangleKeyRounds = 48
// MangleKeyData Key entries of 128-bit length
type MangleKeyData [MangleKeyDataSize]byte
func (d MangleKeyData) RoundKey(round int32) uint32 {
return binary.LittleEndian.Uint32(d[(round%4)*4:])
}
type MangleKeyTable [8]MangleKeyData
var HardcodedMangleTable = MangleKeyTable{
/* Slot 0 is used by OuterMangleKeyOffsetFirmware for outer key mangle */
/*0x00*/ {0x6f, 0xc0, 0x39, 0x05, 0x01, 0x58, 0x23, 0x3a, 0x80, 0xda, 0xb4, 0x1b, 0x65, 0x6a, 0x91, 0x44},
/* Slot 1 is used by OuterMangleKeyOffsetDeviceId for outer key mangle */
/*0x01*/ {0x35, 0xcb, 0x01, 0x5b, 0xfb, 0xa4, 0x98, 0xb4, 0x82, 0x6d, 0x48, 0xe9, 0x10, 0x50, 0x94, 0xf4},
/*0x02*/ {0xec, 0xbc, 0xba, 0xe8, 0xf8, 0x3d, 0xa7, 0x2a, 0x9c, 0xf7, 0xf9, 0x4c, 0xe7, 0x73, 0x6d, 0x88},
/*0x03*/ {0x03, 0x35, 0x48, 0x25, 0xaf, 0xa8, 0xa0, 0xb1, 0xb2, 0x45, 0xa7, 0x24, 0x39, 0x13, 0xe2, 0xf5},
/*0x04*/ {0x88, 0x90, 0xd8, 0x42, 0xaf, 0x79, 0xa3, 0x37, 0xe0, 0x89, 0x26, 0x42, 0xe9, 0x39, 0x62, 0x63},
/*0x05*/ {0xf0, 0x61, 0xd0, 0xab, 0x79, 0x05, 0x71, 0x7f, 0x51, 0x6b, 0x62, 0xbd, 0x15, 0x2c, 0xf2, 0x2a},
/* Slot 6 is used by OuterMangleKeyOffsetMemory for outer key mangle */
/*0x06*/ {0x06, 0xbc, 0x41, 0xb3, 0x74, 0x46, 0x6e, 0x6e, 0x01, 0x7b, 0xeb, 0xb3, 0x32, 0x5b, 0x96, 0xf1},
/*0x07*/ {0x6f, 0x3e, 0xf3, 0x52, 0xf9, 0xa2, 0x69, 0x4d, 0xc4, 0x77, 0xab, 0x77, 0x08, 0x45, 0x8f, 0x46},
}
var AlternateMangleTable = MangleKeyTable{
/*0x00*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x01*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x02*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x03*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x04*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x05*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x06*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
/*0x07*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
}

50
encryption/material.go Normal file
View file

@ -0,0 +1,50 @@
package encryption
import (
"encoding/binary"
)
type KeyMaterial struct {
// Generator Random source to generate the inline material
Generator KeyGenerator
OuterKeyOffset OuterMangleKeyOffset
DeviceKey *MangleKeyData
AlternateMangleKey *MangleKeyTable
}
func NewFirmwareKeyMaterial(generator KeyGenerator) KeyMaterial {
return KeyMaterial{
Generator: generator,
OuterKeyOffset: OuterMangleKeyOffsetFirmware,
DeviceKey: nil,
AlternateMangleKey: nil,
}
}
func NewMemoryKeyMaterial(generator KeyGenerator) KeyMaterial {
return KeyMaterial{
Generator: generator,
OuterKeyOffset: OuterMangleKeyOffsetMemory,
DeviceKey: nil,
AlternateMangleKey: nil,
}
}
type OuterMangleKeyOffset int
const (
OuterMangleKeyOffsetFirmware = 0x00
OuterMangleKeyOffsetDeviceId = 0x01
OuterMangleKeyOffsetMemory = 0x06
)
func DeviceMangleKey(deviceId1, deviceId2, deviceId3 uint32) *MangleKeyData {
var d MangleKeyData
outerKey := HardcodedMangleTable[OuterMangleKeyOffsetDeviceId]
binary.LittleEndian.PutUint32(d[:], deviceId1^outerKey.RoundKey(0))
binary.LittleEndian.PutUint32(d[4:], deviceId2^outerKey.RoundKey(1))
binary.LittleEndian.PutUint32(d[8:], deviceId3^outerKey.RoundKey(2))
binary.LittleEndian.PutUint32(d[12:], outerKey.RoundKey(3))
return &d
}

31
encryption/rand.go Normal file
View file

@ -0,0 +1,31 @@
package encryption
import "encoding/binary"
// BorlandRandMultiplier 22695477
const BorlandRandMultiplier = 0x015A4E35
// BorlandRand Borland C++ rand()
func BorlandRand(seed uint32) uint32 {
return seed*BorlandRandMultiplier + 1
}
func BorlandRandXORBytes(src, dst []byte, seed uint32) (newSeed uint32) {
_ = dst[len(src)-1]
for i := range src {
seed = BorlandRand(seed)
dst[i] = src[i] ^ byte(seed>>16)
}
return seed
}
func BorlandRandXORInPlace(data []byte, seed uint32) (newSeed uint32) {
return BorlandRandXORBytes(data, data, seed)
}
func BorlandRandXORUint32(value, seed uint32) (newValue, newSeed uint32) {
var buf [4]byte
binary.LittleEndian.PutUint32(buf[:], value)
newSeed = BorlandRandXORInPlace(buf[:], seed)
return binary.LittleEndian.Uint32(buf[:]), newSeed
}

45
encryption/rounds.go Normal file
View file

@ -0,0 +1,45 @@
package encryption
import "encoding/binary"
func (d MangleKeyData) Encrypt(data []byte) {
for i := 0; i < len(data); i += MangleKeyBlockSize {
binary.LittleEndian.PutUint64(data[i:], d.EncryptBlock(binary.LittleEndian.Uint64(data[i:])))
}
}
func (d MangleKeyData) EncryptBlock(block uint64) uint64 {
dataA, dataB := uint32(block), uint32(block>>32)
for round := int32(0); round < MangleKeyRounds; round++ {
dataB, dataA = encryptRound(binary.LittleEndian.Uint32(d[(round&3)<<2:]), dataA, dataB, uint32(round))
}
return uint64(dataA) | (uint64(dataB) << 32)
}
func encryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
dataA = round + roundKey + ((dataB >> 8) ^ (dataB << 6)) + dataB + dataA
return dataA, dataB
}
func (d MangleKeyData) Decrypt(data []byte) {
for i := 0; i < len(data); i += MangleKeyBlockSize {
binary.LittleEndian.PutUint64(data[i:], d.DecryptBlock(binary.LittleEndian.Uint64(data[i:])))
}
}
func (d MangleKeyData) DecryptBlock(block uint64) uint64 {
dataA, dataB := uint32(block), uint32(block>>32)
for round := int32(MangleKeyRounds - 1); round != -1; round-- {
dataA, dataB = decryptRound(binary.LittleEndian.Uint32(d[(round&3)<<2:]), dataB, dataA, uint32(round))
}
return uint64(dataA) | (uint64(dataB) << 32)
}
func decryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
dataA = (dataA - dataB) - ((dataB >> 8) ^ (dataB << 6)) - roundKey - round
return dataA, dataB
}

302
firmware/firmware.go Normal file
View file

@ -0,0 +1,302 @@
package firmware
import (
"bytes"
"errors"
"fmt"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/buffer"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/compression"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/encryption"
"golang.org/x/text/encoding/charmap"
"io"
"slices"
)
const SerialNumberSize = 16
const MarkerSize = 8
const MarkerPhyton = "Phyton\x00\x00"
const MarkerAlmaCode = "AlmaCode"
const BaseAddress = 0x8000000
type ASFirmwareHeader struct {
Description [256]byte
DateTime DateTime
DataSize uint32
}
func (h ASFirmwareHeader) DescriptionString() string {
decoder := charmap.Windows1251.NewDecoder()
buf, err := decoder.Bytes(zeroTerminatedSlice(h.Description[:]))
if err != nil {
return ""
}
return string(buf)
}
func zeroTerminatedSlice(data []byte) []byte {
return data[:max(0, slices.Index(data, 0))]
}
type ASFileHeader struct {
Marker [MarkerSize]byte
HeaderSize uint32
DateTime DateTime
BufferSize uint32
SerialNumber [SerialNumberSize]byte
VersionLow uint8
VersionHigh uint8
// FileCount only available when IsAlmaCode() == true
FileCount uint32
FirmwareHeaderSize uint32
Compressed uint8
Reserved uint8
CRC32 uint32
UpdateCRC32 uint32
}
func (h ASFileHeader) IsAlmaCode() bool {
return bytes.Compare(h.Marker[:], []byte(MarkerAlmaCode)) == 0
}
type ASBlockHeader struct {
HeaderSize uint32
Size uint32
Addr uint32
SizeAligned uint32
}
type Block struct {
Header ASBlockHeader
Block encryption.EncryptedBlock
}
type Entry struct {
Header ASFirmwareHeader
Blocks Blocks
compressed bool
}
func (entry Entry) Code() []byte {
// Runs https://www.st.com/en/microcontrollers-microprocessors/stm32l475vc.html
// https://youtu.be/-IsAlSwFWIA?t=508
var buf []byte
for _, b := range entry.Blocks {
decBlock := slices.Clone(b.Block)
err := decBlock.Decrypt(encryption.NewFirmwareKeyMaterial(nil), !entry.compressed)
if err != nil {
panic(err)
}
if entry.compressed {
data, err := compression.FirmwareBlockDecompress(decBlock.DataBlock()[:b.Header.Size])
if err != nil {
panic(err)
}
calculatedCrc := crc.CalculateCRC(data)
crc1, _ := decBlock.CRC()
if calculatedCrc != crc1 {
panic("wrong CRC")
}
newLength := int(b.Header.Addr) - BaseAddress + len(data)
if len(buf) < newLength {
buf = append(buf, make([]byte, newLength-len(buf))...)
}
copy(buf[int(b.Header.Addr)-BaseAddress:], data)
} else {
newLength := int(b.Header.Addr) - BaseAddress + len(decBlock.DataBlock())
if len(buf) < newLength {
buf = append(buf, make([]byte, newLength-len(buf))...)
}
copy(buf[int(b.Header.Addr)-BaseAddress:], decBlock.DataBlock())
}
}
return buf
}
type Firmware struct {
FileHeader ASFileHeader
Entries []Entry
Data []byte
}
type Blocks []Block
func BlocksFromData(data []byte) (result Blocks) {
inputData := buffer.PanicBuffer(data)
for len(inputData) > 0 {
var blockHeader ASBlockHeader
blockHeader.HeaderSize = inputData.ReadUint32()
//i := int32(-836261582)
blockHeader.Size = inputData.ReadUint32() ^ BlockHeaderSizeKey
//i2 := int32(-1294620572)
blockHeader.Addr = inputData.ReadUint32() ^ BlockHeaderAddrKey
blockHeader.SizeAligned = blockHeader.Size
//i3 := int32(-8)
if (blockHeader.SizeAligned % 8) != 0 {
blockHeader.SizeAligned = (blockHeader.SizeAligned & uint32(0xFFFFFFF8)) + 8
}
encryptedBlock := encryption.NewEncryptedBlock(int(blockHeader.SizeAligned))
if n := inputData.Read(encryptedBlock); n != len(encryptedBlock) {
panic(io.ErrUnexpectedEOF)
}
result = append(result, Block{
Header: blockHeader,
Block: encryptedBlock,
})
}
return result
}
func (fw Firmware) Length() int {
if fw.FileHeader.IsAlmaCode() {
panic("not implemented")
}
return len(fw.Data) - int(fw.FileHeader.HeaderSize)
}
func LoadFirmware(buf []byte) (f *Firmware, err error) {
defer func() {
if e := recover(); e != nil {
var ok bool
if err, ok = e.(error); !ok {
err = fmt.Errorf("%s", e)
}
}
}()
fw := &Firmware{
Data: buf,
}
dataBuf := buffer.Buffer(buf)
_, err = dataBuf.Read(fw.FileHeader.Marker[:])
if err != nil {
return nil, err
}
isAlmaCode := bytes.Compare(fw.FileHeader.Marker[:], []byte(MarkerAlmaCode)) == 0
if !isAlmaCode && bytes.Compare(fw.FileHeader.Marker[:], []byte(MarkerPhyton)) != 0 {
return nil, errors.New("unsupported header")
}
fw.FileHeader.HeaderSize, err = dataBuf.ReadUint32()
if err != nil {
return nil, err
}
dataBuf = buf[len(fw.FileHeader.Marker)+4 : fw.FileHeader.HeaderSize]
var dateTime uint32
dateTime, err = dataBuf.ReadUint32()
if err != nil {
return nil, err
}
fw.FileHeader.DateTime = DateTime(dateTime)
fw.FileHeader.BufferSize, err = dataBuf.ReadUint32()
if err != nil {
return nil, err
}
_, err = dataBuf.Read(fw.FileHeader.SerialNumber[:])
if err != nil {
return nil, err
}
if err = func() error {
fw.FileHeader.VersionLow, err = dataBuf.ReadByte()
if err != nil {
return err
}
fw.FileHeader.VersionHigh, err = dataBuf.ReadByte()
if err != nil {
return err
}
fw.FileHeader.FileCount, err = dataBuf.ReadUint32()
if err != nil {
return err
}
fw.FileHeader.FirmwareHeaderSize, err = dataBuf.ReadUint32()
if err != nil {
return err
}
fw.FileHeader.Compressed, err = dataBuf.ReadByte()
if err != nil {
return err
}
fw.FileHeader.Reserved, err = dataBuf.ReadByte()
if err != nil {
return err
}
fw.FileHeader.CRC32, err = dataBuf.ReadUint32()
if err != nil {
return err
}
return nil
}(); err != nil {
if err != io.EOF {
return nil, err
}
}
if fw.FileHeader.IsAlmaCode() {
for fileN := uint32(0); fileN < fw.FileHeader.FileCount; fileN++ {
offset := fw.FileHeader.HeaderSize + fw.FileHeader.FirmwareHeaderSize*fileN
fileBuffer := buffer.Buffer(buf[offset : offset+fw.FileHeader.FirmwareHeaderSize])
var entry Entry
_, err = fileBuffer.Read(entry.Header.Description[:])
if err != nil {
return nil, err
}
dateTime, err = fileBuffer.ReadUint32()
if err != nil {
return nil, err
}
entry.Header.DateTime = DateTime(dateTime)
entry.Header.DataSize, err = fileBuffer.ReadUint32()
entry.compressed = fw.FileHeader.Compressed > 0
if err != nil {
return nil, err
}
fw.Entries = append(fw.Entries, entry)
}
offset := fw.FileHeader.HeaderSize + fw.FileHeader.FirmwareHeaderSize*fw.FileHeader.FileCount
for i, entry := range fw.Entries {
fw.Entries[i].Blocks = BlocksFromData(fw.Data[offset : offset+entry.Header.DataSize])
offset += entry.Header.DataSize
}
if offset != uint32(len(fw.Data)) {
return nil, errors.New("data lingering after read")
}
} else {
fw.Entries = append(fw.Entries, Entry{
Header: ASFirmwareHeader{
DateTime: fw.FileHeader.DateTime,
DataSize: uint32(len(fw.Data[fw.FileHeader.HeaderSize:])),
},
Blocks: BlocksFromData(fw.Data[fw.FileHeader.HeaderSize:]),
compressed: fw.FileHeader.Compressed > 0,
})
}
fw.FileHeader.UpdateCRC32 = crc.CalculateCRC(fw.Data)
return fw, nil
}

15
firmware/firmware_test.go Normal file
View file

@ -0,0 +1,15 @@
package firmware
/*
func TestLoadFirmware(t *testing.T) {
buf, _ := os.ReadFile("rc-102z.bin")
fw, err := LoadFirmware(buf)
if err != nil {
t.Fatal(err)
}
code := fw.Entries[0].Code()
t.Logf("code, %d", len(code))
}
*/

129
firmware/flash.go Normal file
View file

@ -0,0 +1,129 @@
package firmware
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/buffer"
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/encryption"
"io"
)
type FlashAreaData struct {
PublicSignature uint32
StructLen uint32
Data []byte
}
type FlashAreaData_PublicAPI struct {
BootSignature uint32
ProductSerialNumber [32]byte
TargetFileName [32]byte
ProductName [64]byte
CalibrationBP0 uint32
CalibrationBP290 uint32
VendorID uint16
ProductID uint16
ManufacturerName [32]byte
TargetID uint32
TargetStartTimeout uint32
}
func (f *FlashAreaData) PublicAPI() *FlashAreaData_PublicAPI {
var result FlashAreaData_PublicAPI
err := binary.Read(bytes.NewReader(f.Data), binary.LittleEndian, &result)
if err != nil {
return nil
}
return &result
}
type FlashArea uint32
const (
FlashAreaUnknown = FlashArea(iota)
FlashAreaPublicAPI
)
type FlashStatus uint32
const (
FlashOK = FlashStatus(iota)
FlashInvAddr
FlashWrProt
FlashNotBlank
FlashVerify
FlashErase
FlashProg
FlashInitEr
FlashSignEr
FlashInvalidCRC
FlashInvalidKeyNumb
FlashInvalidSign
FlashInvalidAreaName
FlashInvalidTarget
FlashRdpErr
)
// DecodeReadFlashArea Decodes a result of RD_FLASH_AREA command
func DecodeReadFlashArea(data []byte) (*FlashAreaData, error) {
buf := buffer.Buffer(data)
flashStatusInt, err := buf.ReadUint32()
if err != nil {
return nil, err
}
flashStatus := FlashStatus(flashStatusInt)
if flashStatus != FlashOK {
if flashStatus == FlashInvalidAreaName {
return nil, errors.New("area out of bounds")
} else if flashStatus == FlashInvalidSign {
return nil, errors.New("invalid area public signature")
}
return nil, fmt.Errorf("invalid flash status %d", flashStatus)
}
// random seed is set by device using register TIM6_CNT at 0x40001024
randomSeed, err := buf.ReadUint32()
if err != nil {
return nil, err
}
size, err := buf.ReadUint32()
if err != nil {
return nil, err
}
size, randomSeed = encryption.BorlandRandXORUint32(size, randomSeed)
if int(size) > len(buf) {
return nil, io.ErrUnexpectedEOF
}
flashData := make(buffer.Buffer, size)
_, err = buf.Read(flashData)
if err != nil {
return nil, err
}
randomSeed = encryption.BorlandRandXORInPlace(flashData, randomSeed)
areaData := &FlashAreaData{}
areaData.PublicSignature, err = flashData.ReadUint32()
if err != nil {
return nil, err
}
areaData.StructLen, err = flashData.ReadUint32()
if err != nil {
return nil, err
}
if int(areaData.StructLen) != (len(flashData) + 8) {
return nil, io.ErrUnexpectedEOF
}
areaData.Data = flashData
return areaData, nil
}

4
firmware/keys.go Normal file
View file

@ -0,0 +1,4 @@
package firmware
const BlockHeaderSizeKey = 0xCE27A932
const BlockHeaderAddrKey = 0xB2D5A864

23
firmware/time.go Normal file
View file

@ -0,0 +1,23 @@
package firmware
import "time"
type DateTime uint32
func (dt DateTime) Time() time.Time {
high := uint16(dt >> 16)
low := uint16(dt)
year := ((high >> 9) & 127) + 1980
month := (high >> 5) & 15
day := high & 31
hours := (low >> 11) & 31
minutes := (low >> 5) & 63
seconds := (low & 31) * 2
return time.Date(int(year), time.Month(month), int(day), int(hours), int(minutes), int(seconds), 0, time.UTC)
}
func (dt DateTime) String() string {
return dt.Time().String()
}

7
go.mod Normal file
View file

@ -0,0 +1,7 @@
module git.gammaspectra.live/WeebDataHoarder/PhytonUtils
go 1.21
require golang.org/x/text v0.13.0
require github.com/icza/bitio v1.1.0 // indirect

5
go.sum Normal file
View file

@ -0,0 +1,5 @@
github.com/icza/bitio v1.1.0 h1:ysX4vtldjdi3Ygai5m1cWy4oLkhWTAi+SyO6HC8L9T0=
github.com/icza/bitio v1.1.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A=
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=