ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit 724a4caff868393ba0c0ba520033470824405c0e
parent 34e6e672eee2a1584806f7255998b94870dd03f5
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Wed, 12 Feb 2020 21:49:41 +0100

Pushed v1.09 code

- Fix: If a corrupt .XM doesn't contain all the sample data at the end of the
  file, try to load what is left instead of showing an "Out of memory!" message.
- Fix: Prevent upscaling factors higher than 2x on ARM devices. Fixes extreme
  slowdowns on Raspberry Pi 4 with 2k or higher resolution screens.
- The .MOD importer has been slightly improved for oldschool 15-sample formats
- The .S3M importer has been slightly improved for certain effect cases not
  compatible with FT2.
- Audio mixer: Internal voice volumes are now calculated with 256 times higher
  precision than FT2. Some other changes were also made to make sure the audio
  mixing is always done at max precision regardless of the "amp" setting in
  the config screen. These are changes that most people won't ever be able to
  hear, but the speed performance of the mixer is still the same, so why not.
- The audio dithering routine has now been improved (rectangular->triangular),
  and it's now enabled by default on a fresh configuration, or if you reset it.

Diffstat:
Mmake-linux-nomidi.sh | 2+-
Mmake-linux.sh | 2+-
Mmake-macos.sh | 2+-
Msrc/ft2_about.c | 1+
Msrc/ft2_audio.c | 357+++++++++++++++++++++++++++----------------------------------------------------
Msrc/ft2_audio.h | 2+-
Msrc/ft2_checkboxes.c | 2+-
Msrc/ft2_config.c | 12++++++++++--
Msrc/ft2_gui.c | 68+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Msrc/ft2_header.h | 2+-
Msrc/ft2_inst_ed.c | 1+
Msrc/ft2_module_loader.c | 589++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/ft2_pattern_draw.c | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msrc/ft2_pattern_ed.c | 2--
Msrc/ft2_replayer.c | 25++++++++-----------------
Msrc/ft2_sampling.c | 9+++------
Msrc/ft2_scopes.c | 14+++++++-------
Msrc/ft2_video.c | 18++++++++++++++++++
Msrc/helpdata/FT2.HLP | 2+-
Msrc/helpdata/ft2_help_data.h | 1059+++++++++++++++++++++++++++++++++++++++----------------------------------------
20 files changed, 1256 insertions(+), 1042 deletions(-)

diff --git a/make-linux-nomidi.sh b/make-linux-nomidi.sh @@ -11,4 +11,4 @@ gcc -DNDEBUG src/gfxdata/*.c src/*.c -lSDL2 -lm -Wshadow -Winit-self -Wall -Wno- rm src/gfxdata/*.o src/*.o &> /dev/null -echo Done! The executable is in the folder named \'release/other\'. +echo Done. The executable can be found in \'release/other\' if everything went well. diff --git a/make-linux.sh b/make-linux.sh @@ -11,4 +11,4 @@ gcc -DNDEBUG -DHAS_MIDI -D__LINUX_ALSA__ src/rtmidi/*.cpp src/gfxdata/*.c src/*. rm src/rtmidi/*.o src/gfxdata/*.o src/*.o &> /dev/null -echo Done! The executable is in the folder named \'release/other\'. +echo Done. The executable can be found in \'release/other\' if everything went well. diff --git a/make-macos.sh b/make-macos.sh @@ -13,5 +13,5 @@ else install_name_tool -change @rpath/SDL2.framework/Versions/A/SDL2 @executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2 release/macos/ft2-clone-macos.app/Contents/MacOS/ft2-clone-macos rm src/rtmidi/*.o src/gfxdata/*.o src/*.o &> /dev/null - echo Done! The executable is in the folder named \'release/macos\'. + echo Done. The executable can be found in \'release/macos\' if everything went well. fi diff --git a/src/ft2_about.c b/src/ft2_about.c @@ -1,4 +1,5 @@ #include <stdio.h> // sprintf() +#include <math.h> #include "ft2_header.h" #include "ft2_gui.h" #include "ft2_pattern_ed.h" diff --git a/src/ft2_audio.c b/src/ft2_audio.c @@ -20,7 +20,8 @@ static int8_t pmpCountDiv, pmpChannels = 2; static uint16_t smpBuffSize; -static int32_t masterVol, masterAmp, oldAudioFreq, speedVal, pmpLeft, randSeed = INITIAL_DITHER_SEED; +static int32_t masterVol, oldAudioFreq, speedVal, pmpLeft, randSeed = INITIAL_DITHER_SEED; +static int32_t prngStateL, prngStateR; static uint32_t tickTimeLen, tickTimeLenFrac, oldSFrq, oldSFrqRev = 0xFFFFFFFF; static float fAudioAmpMul; static voice_t voice[MAX_VOICES * 2]; @@ -106,31 +107,20 @@ bool setNewAudioSettings(void) // only call this from the main input/video threa void setAudioAmp(int16_t ampFactor, int16_t master, bool bitDepth32Flag) { ampFactor = CLAMP(ampFactor, 1, 32); - master = CLAMP(master, 0, 256); + master = CLAMP(master, 0, 256); - // voiceVolume = (vol(0..2047) * amp(1..32) * pan(0..65536)) >> 4 - const float fAudioNorm = 1.0f / (((2047UL * 32 * 65536) / 16) / MAX_VOICES); + // voiceVolume = (vol(0..65535) * pan(0..65536)) >> 4 + const float fAudioNorm = 1.0f / (((65535UL * 65536) / 16) / MAX_VOICES); if (bitDepth32Flag) { // 32-bit floating point (24-bit) - fAudioAmpMul = fAudioNorm * (master / 256.0f); + fAudioAmpMul = fAudioNorm * (master / 256.0f) * (ampFactor / 32.0f); } else { // 16-bit integer - masterVol = master; - } - - // calculate channel amp - - if (masterAmp != ampFactor) - { - masterAmp = ampFactor; - - // make all channels update volume because of amp change - for (uint32_t i = 0; i < song.antChn; i++) - stm[i].status |= IS_Vol; + masterVol = master * ampFactor * 2048; } } @@ -170,12 +160,7 @@ void setSpeed(uint16_t bpm) */ tickTimeLen = (int32_t)dInt; - /* - fractional part (scaled to 0..2^32-1) - - ** We have to resort to slow float->int conversion here because the result - ** can be above 2^31. In 64-bit mode, this will still use a fast SSE2 instruction. - ** Anyhow, this function won't be called that many times a second in worst case, - ** so it's not a big issue at all. - */ + // - fractional part (scaled to 0..2^32-1) - dFrac *= UINT32_MAX; tickTimeLenFrac = (uint32_t)(dFrac + 0.5); } @@ -198,15 +183,16 @@ void audioSetInterpolation(bool interpolation) static inline void voiceUpdateVolumes(uint8_t i, uint8_t status) { int32_t volL, volR; + uint32_t vol; voice_t *v, *f; v = &voice[i]; - volL = v->SVol * masterAmp; // 0..2047 * 1..32 = 0..65504 + vol = v->SVol; // 0..65535 - // (0..65504 * 0..65536) >> 4 = 0..268304384 - volR = ((uint32_t)volL * panningTab[v->SPan]) >> 4; - volL = ((uint32_t)volL * panningTab[256 - v->SPan]) >> 4; + // (0..65535 * 0..65536) >> 4 = 0..268431360 + volR = (vol * panningTab[ v->SPan]) >> 4; + volL = (vol * panningTab[256-v->SPan]) >> 4; if (!audio.volumeRampingFlag) { @@ -245,7 +231,8 @@ static inline void voiceUpdateVolumes(uint8_t i, uint8_t status) /* FT2 has two internal volume ramping lengths: ** IS_QuickVol: 5ms (audioFreq / 200) - ** Normal: The duration of a tick (speedVal) */ + ** Normal: The duration of a tick (speedVal) + */ if (volL == v->SLVol2 && volR == v->SRVol2) { @@ -326,10 +313,9 @@ static void voiceTrigger(uint8_t i, sampleTyp *s, int32_t position) void mix_SaveIPVolumes(void) // for volume ramping { - voice_t *v; - for (uint32_t i = 0; i < song.antChn; i++) + voice_t *v = voice; + for (uint32_t i = 0; i < MAX_VOICES; i++, v++) { - v = &voice[i]; v->SLVol2 = v->SLVol1; v->SRVol2 = v->SRVol1; v->SVolIPLen = 0; @@ -342,60 +328,62 @@ void mix_UpdateChannelVolPanFrq(void) stmTyp *ch; voice_t *v; - for (uint8_t i = 0; i < song.antChn; i++) - { - ch = &stm[i]; - v = &voice[i]; + ch = stm; + v = voice; + for (uint8_t i = 0; i < song.antChn; i++, ch++, v++) + { status = ch->tmpStatus = ch->status; // ch->tmpStatus is used for audio/video sync queue - if (status != 0) - { - ch->status = 0; + if (status == 0) + continue; - // volume change - if (status & IS_Vol) - v->SVol = ch->finalVol; + ch->status = 0; - // panning change - if (status & IS_Pan) - v->SPan = ch->finalPan; + // volume change + if (status & IS_Vol) + v->SVol = ch->finalVol; - // update mixing volumes if vol/pan change - if (status & (IS_Vol + IS_Pan)) - voiceUpdateVolumes(i, status); + // panning change + if (status & IS_Pan) + v->SPan = ch->finalPan; - // frequency change - if (status & IS_Period) - { - v->SFrq = getFrequenceValue(ch->finalPeriod); + // update mixing volumes if vol/pan change + if (status & (IS_Vol + IS_Pan)) + voiceUpdateVolumes(i, status); - if (v->SFrq != oldSFrq) - { - oldSFrq = v->SFrq; + // frequency change + if (status & IS_Period) + { + v->SFrq = getFrequenceValue(ch->finalPeriod); - oldSFrqRev = 0xFFFFFFFF; - if (oldSFrq != 0) - oldSFrqRev /= oldSFrq; - } + if (v->SFrq != oldSFrq) + { + oldSFrq = v->SFrq; - v->SFrqRev = oldSFrqRev; + oldSFrqRev = 0xFFFFFFFF; + if (oldSFrq != 0) + oldSFrqRev /= oldSFrq; } - // sample trigger (note) - if (status & IS_NyTon) - voiceTrigger(i, ch->smpPtr, ch->smpStartPos); + v->SFrqRev = oldSFrqRev; } + + // sample trigger (note) + if (status & IS_NyTon) + voiceTrigger(i, ch->smpPtr, ch->smpStartPos); } } -void resetDitherSeed(void) +void resetAudioDither(void) { randSeed = INITIAL_DITHER_SEED; + prngStateL = 0; + prngStateR = 0; } -// Delphi/Pascal LCG Random() (without limit). Suitable for 32-bit random numbers static inline uint32_t random32(void) { + // LCG 32-bit random randSeed *= 134775813; randSeed++; @@ -410,36 +398,17 @@ static void sendSamples16BitStereo(uint8_t *stream, uint32_t sampleBlockLength, (void)numAudioChannels; streamPointer16 = (int16_t *)stream; - - if (masterVol == 256) // max master volume - { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - out32 = audio.mixBufferL[i] >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - out32 = audio.mixBufferR[i] >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - } - } - else + for (uint32_t i = 0; i < sampleBlockLength; i++) { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - out32 = ((audio.mixBufferL[i] >> 8) * masterVol) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - out32 = ((audio.mixBufferR[i] >> 8) * masterVol) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - } + // left channel + out32 = ((int64_t)audio.mixBufferL[i] * masterVol) >> 32; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + // right channel + out32 = ((int64_t)audio.mixBufferR[i] * masterVol) >> 32; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; } } @@ -450,144 +419,73 @@ static void sendSamples16BitMultiChan(uint8_t *stream, uint32_t sampleBlockLengt uint32_t i, j; streamPointer16 = (int16_t *)stream; - - if (masterVol == 256) // max master volume + for (i = 0; i < sampleBlockLength; i++) { - for (i = 0; i < sampleBlockLength; i++) - { - // left channel - out32 = audio.mixBufferL[i] >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - out32 = audio.mixBufferR[i] >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - for (j = 2; j < numAudioChannels; j++) - *streamPointer16++ = 0; - } - } - else - { - for (i = 0; i < sampleBlockLength; i++) - { - // left channel - out32 = ((audio.mixBufferL[i] >> 8) * masterVol) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - out32 = ((audio.mixBufferR[i] >> 8) * masterVol) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - for (j = 2; j < numAudioChannels; j++) - *streamPointer16++ = 0; - } + // left channel + out32 = ((int64_t)audio.mixBufferL[i] * masterVol) >> 32; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + // right channel + out32 = ((int64_t)audio.mixBufferR[i] * masterVol) >> 32; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + for (j = 2; j < numAudioChannels; j++) + *streamPointer16++ = 0; } } static void sendSamples16BitDitherStereo(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { int16_t *streamPointer16; - int32_t dither, out32; + int32_t prng, out32; (void)numAudioChannels; streamPointer16 = (int16_t *)stream; - - if (masterVol == 256) // max master volume - { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - dither = ((random32() % 3) - 1) << (8 - 1); // random 1.5-bit noise: -128, 0, 128 - out32 = (audio.mixBufferL[i] + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = (audio.mixBufferR[i] + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - } - } - else + for (uint32_t i = 0; i < sampleBlockLength; i++) { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - dither = ((random32() % 3) - 1) << (8 - 1); // random 1.5-bit noise: -128, 0, 128 - out32 = (audio.mixBufferL[i] + dither) >> 8; - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = ((out32 * masterVol) + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = (audio.mixBufferR[i] + dither) >> 8; - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = ((out32 * masterVol) + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - } + // left channel - 1-bit triangular dithering + prng = random32(); + out32 = ((((int64_t)audio.mixBufferL[i] * masterVol) + prng) - prngStateL) >> 32; + prngStateL = prng; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + // right channel - 1-bit triangular dithering + prng = random32(); + out32 = ((((int64_t)audio.mixBufferR[i] * masterVol) + prng) - prngStateR) >> 32; + prngStateR = prng; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; } } static void sendSamples16BitDitherMultiChan(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { int16_t *streamPointer16; - int32_t dither, out32; + int32_t prng, out32; streamPointer16 = (int16_t *)stream; - - if (masterVol == 256) // max master volume - { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - dither = ((random32() % 3) - 1) << (8 - 1); // random 1.5-bit noise: -128, 0, 128 - out32 = (audio.mixBufferL[i] + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = (audio.mixBufferR[i] + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - for (uint32_t j = 2; j < numAudioChannels; j++) - *streamPointer16++ = 0; - } - } - else + for (uint32_t i = 0; i < sampleBlockLength; i++) { - for (uint32_t i = 0; i < sampleBlockLength; i++) - { - // left channel - dither = ((random32() % 3) - 1) << (8 - 1); // random 1.5-bit noise: -128, 0, 128 - out32 = (audio.mixBufferL[i] + dither) >> 8; - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = ((out32 * masterVol) + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - // right channel - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = (audio.mixBufferR[i] + dither) >> 8; - dither = ((random32() % 3) - 1) << (8 - 1); - out32 = ((out32 * masterVol) + dither) >> 8; - CLAMP16(out32); - *streamPointer16++ = (int16_t)out32; - - for (uint32_t j = 2; j < numAudioChannels; j++) - *streamPointer16++ = 0; - } + // left channel - 1-bit triangular dithering + prng = random32(); + out32 = ((((int64_t)audio.mixBufferL[i] * masterVol) + prng) - prngStateL) >> 32; + prngStateL = prng; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + // right channel - 1-bit triangular dithering + prng = random32(); + out32 = ((((int64_t)audio.mixBufferR[i] * masterVol) + prng) - prngStateR) >> 32; + prngStateR = prng; + CLAMP16(out32); + *streamPointer16++ = (int16_t)out32; + + for (uint32_t j = 2; j < numAudioChannels; j++) + *streamPointer16++ = 0; } } @@ -636,27 +534,22 @@ static void sendSamples24BitMultiChan(uint8_t *stream, uint32_t sampleBlockLengt static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAudioChannels) { - voice_t *v = voice; + voice_t *v, *r; assert(sampleBlockLength <= MAX_WAV_RENDER_SAMPLES_PER_TICK); memset(audio.mixBufferL, 0, sampleBlockLength * sizeof (int32_t)); memset(audio.mixBufferR, 0, sampleBlockLength * sizeof (int32_t)); // mix channels - for (uint32_t i = 0; i < song.antChn; i++) - { - // call the mixing routine currently set for the voice - if (v->mixRoutine != NULL) - v->mixRoutine(v, sampleBlockLength); - // mix fade-out voice - v += MAX_VOICES; + v = voice; // normal voices + r = &voice[MAX_VOICES]; // volume ramp voices + for (uint32_t i = 0; i < song.antChn; i++, v++, r++) + { // call the mixing routine currently set for the voice - if (v->mixRoutine != NULL) - v->mixRoutine(v, sampleBlockLength); - - v -= (MAX_VOICES - 1); // go to next normal channel + if (v->mixRoutine != NULL) v->mixRoutine(v, sampleBlockLength); // mix normal voice + if (r->mixRoutine != NULL) r->mixRoutine(r, sampleBlockLength); // mix volume ramp voice } // normalize mix buffer and send to audio stream @@ -666,27 +559,21 @@ static void mixAudio(uint8_t *stream, uint32_t sampleBlockLength, uint8_t numAud // used for song-to-WAV renderer uint32_t mixReplayerTickToBuffer(uint8_t *stream, uint8_t bitDepth) { - voice_t *v = voice; + voice_t *v, *r; assert(speedVal <= MAX_WAV_RENDER_SAMPLES_PER_TICK); memset(audio.mixBufferL, 0, speedVal * sizeof (int32_t)); memset(audio.mixBufferR, 0, speedVal * sizeof (int32_t)); // mix channels - for (uint32_t i = 0; i < song.antChn; i++) - { - // call the mixing routine currently set for the voice - if (v->mixRoutine != NULL) - v->mixRoutine(v, speedVal); - - // mix fade-out voice - v += MAX_VOICES; + v = voice; // normal voices + r = &voice[MAX_VOICES]; // volume ramp voices + for (uint32_t i = 0; i < song.antChn; i++, v++, r++) + { // call the mixing routine currently set for the voice - if (v->mixRoutine != NULL) - v->mixRoutine(v, speedVal); - - v -= (MAX_VOICES - 1); // go to next normal channel + if (v->mixRoutine != NULL) v->mixRoutine(v, speedVal); // mix normal voice + if (r->mixRoutine != NULL) r->mixRoutine(r, speedVal); // mix volume ramp voice } // normalize mix buffer and send to audio stream diff --git a/src/ft2_audio.h b/src/ft2_audio.h @@ -97,7 +97,7 @@ void closeAudio(void); void pauseAudio(void); void resumeAudio(void); bool setNewAudioSettings(void); -void resetDitherSeed(void); +void resetAudioDither(void); void lockAudio(void); void unlockAudio(void); void lockMixerCallback(void); diff --git a/src/ft2_checkboxes.c b/src/ft2_checkboxes.c @@ -81,7 +81,7 @@ checkBox_t checkBoxes[NUM_CHECKBOXES] = { 3, 91, 76, 12, cbToggleAutoSaveConfig }, { 389, 132, 90, 12, cbConfigInterpolation }, { 389, 145, 107, 12, cbConfigVolRamp }, - { 389, 158 , 94, 12, cbConfigDither }, + { 389, 158 , 84, 12, cbConfigDither }, { 113, 14, 108, 12, cbConfigPattStretch }, { 113, 27, 117, 12, cbConfigHexCount }, { 113, 40, 81, 12, cbConfigAccidential }, diff --git a/src/ft2_config.c b/src/ft2_config.c @@ -1171,7 +1171,7 @@ void showConfigScreen(void) textOutShadow(390, 120, PAL_FORGRND, PAL_DSKTOP2, "Mixing device ctrl.:"); textOutShadow(406, 134, PAL_FORGRND, PAL_DSKTOP2, "Interpolation"); textOutShadow(406, 147, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping"); - textOutShadow(406, 160, PAL_FORGRND, PAL_DSKTOP2, "1.5-bit dither"); + textOutShadow(406, 160, PAL_FORGRND, PAL_DSKTOP2, "1-bit dither"); textOutShadow(509, 3, PAL_FORGRND, PAL_DSKTOP2, "Mixing frequency:"); #ifdef __APPLE__ @@ -1969,10 +1969,14 @@ void rbWinSize3x(void) return; } +#ifdef __arm__ + okBox(0, "System message", "3x video upscaling is not supported on ARM devices for performance reasons."); +#else config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + WINSIZE_4X); config.windowFlags |= WINSIZE_3X; setWindowSizeFromConfig(true); checkRadioButton(RB_CONFIG_WIN_SIZE_3X); +#endif } void rbWinSize4x(void) @@ -1983,10 +1987,14 @@ void rbWinSize4x(void) return; } +#ifdef __arm__ + okBox(0, "System message", "4x video upscaling is not supported on ARM devices for performance reasons."); +#else config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + WINSIZE_3X); config.windowFlags |= WINSIZE_4X; setWindowSizeFromConfig(true); checkRadioButton(RB_CONFIG_WIN_SIZE_4X); +#endif } void cbSampCutToBuff(void) @@ -2220,7 +2228,7 @@ const uint8_t defConfigData[CONFIG_FILE_SIZE] = { 0x46,0x61,0x73,0x74,0x54,0x72,0x61,0x63,0x6B,0x65,0x72,0x20,0x32,0x2E,0x30,0x20,0x63,0x6F,0x6E,0x66, 0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x1A,0x01,0x01,0x80,0xBB,0x00, - 0x00,0xFF,0x00,0x00,0x01,0xDC,0x00,0x00,0x00,0x01,0x01,0x00,0x02,0x00,0xFF,0x00,0x20,0x02,0x01,0x00, + 0x00,0xFF,0x00,0x00,0x01,0xDC,0x00,0x00,0x00,0x01,0x01,0x00,0x03,0x00,0xFF,0x00,0x20,0x02,0x01,0x00, 0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x24,0x2F,0x3F,0x09,0x09,0x10,0x3F,0x3F,0x3F,0x13,0x18,0x26,0x3F,0x3F,0x3F,0x27,0x27, 0x27,0x00,0x00,0x00,0x08,0x0A,0x0F,0x20,0x29,0x3F,0x0F,0x0F,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, diff --git a/src/ft2_gui.c b/src/ft2_gui.c @@ -312,7 +312,10 @@ uint16_t textWidth16(const char *textPtr) void charOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr) { const uint8_t *srcPtr; - uint32_t *dstPtr, pixVal, tmp; + uint32_t *dstPtr, pixVal; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -328,10 +331,15 @@ void charOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr) { for (uint32_t x = 0; x < FONT1_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = pixVal; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = pixVal; dstPtr[x] = tmp; +#endif } srcPtr += FONT1_WIDTH; @@ -379,7 +387,10 @@ void charOutOutlined(uint16_t x, uint16_t y, uint8_t paletteIndex, char chr) void charOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint8_t shadowPaletteIndex, char chr) { const uint8_t *srcPtr; - uint32_t *dstPtr1, *dstPtr2, pixVal1, pixVal2, tmp; + uint32_t *dstPtr1, *dstPtr2, pixVal1, pixVal2; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -397,6 +408,13 @@ void charOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint8_t s { for (uint32_t x = 0; x < FONT1_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + { + dstPtr2[x] = pixVal2; + dstPtr1[x] = pixVal1; + } +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr2[x]; if (srcPtr[x] != 0) tmp = pixVal2; @@ -405,6 +423,7 @@ void charOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint8_t s tmp = dstPtr1[x]; if (srcPtr[x] != 0) tmp = pixVal1; dstPtr1[x] = tmp; +#endif } srcPtr += FONT1_WIDTH; @@ -417,7 +436,10 @@ void charOutClipX(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr, { const uint8_t *srcPtr; uint16_t width; - uint32_t *dstPtr, pixVal, tmp; + uint32_t *dstPtr, pixVal; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -440,10 +462,15 @@ void charOutClipX(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr, { for (uint32_t x = 0; x < width; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = pixVal; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = pixVal; dstPtr[x] = tmp; +#endif } srcPtr += FONT1_WIDTH; @@ -454,7 +481,10 @@ void charOutClipX(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr, void bigCharOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr) { const uint8_t *srcPtr; - uint32_t *dstPtr, pixVal, tmp; + uint32_t *dstPtr, pixVal; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -470,10 +500,15 @@ void bigCharOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr) { for (uint32_t x = 0; x < FONT2_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = pixVal; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = pixVal; dstPtr[x] = tmp; +#endif } srcPtr += FONT2_WIDTH; @@ -484,7 +519,10 @@ void bigCharOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr) static void bigCharOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint8_t shadowPaletteIndex, char chr) { const uint8_t *srcPtr; - uint32_t *dstPtr1, *dstPtr2, pixVal1, pixVal2, tmp; + uint32_t *dstPtr1, *dstPtr2, pixVal1, pixVal2; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -502,6 +540,13 @@ static void bigCharOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, { for (uint32_t x = 0; x < FONT2_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + { + dstPtr2[x] = pixVal2; + dstPtr1[x] = pixVal1; + } +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr2[x]; if (srcPtr[x] != 0) tmp = pixVal2; @@ -510,6 +555,7 @@ static void bigCharOutShadow(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, tmp = dstPtr1[x]; if (srcPtr[x] != 0) tmp = pixVal1; dstPtr1[x] = tmp; +#endif } srcPtr += FONT2_WIDTH; @@ -649,7 +695,10 @@ void textOutClipX(uint16_t x, uint16_t y, uint8_t paletteIndex, const char *text void hexOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint32_t val, uint8_t numDigits) { const uint8_t *srcPtr; - uint32_t *dstPtr, pixVal, tmp; + uint32_t *dstPtr, pixVal; +#ifndef __arm__ + uint32_t tmp; +#endif assert(xPos < SCREEN_W && yPos < SCREEN_H); @@ -665,10 +714,15 @@ void hexOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, uint32_t val, ui { for (uint32_t x = 0; x < FONT6_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = pixVal; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = pixVal; dstPtr[x] = tmp; +#endif } srcPtr += FONT6_WIDTH; @@ -834,7 +888,7 @@ void vLine(uint16_t x, uint16_t y, uint16_t h, uint8_t paletteIndex) dstPtr = &video.frameBuffer[(y * SCREEN_W) + x]; for (uint32_t i = 0; i < h; i++) { - *dstPtr = pixVal; + *dstPtr = pixVal; dstPtr += SCREEN_W; } } diff --git a/src/ft2_header.h b/src/ft2_header.h @@ -12,7 +12,7 @@ #endif #include "ft2_replayer.h" -#define PROG_VER_STR "1.08" +#define PROG_VER_STR "1.09" // do NOT change these! It will only mess things up... diff --git a/src/ft2_inst_ed.c b/src/ft2_inst_ed.c @@ -6,6 +6,7 @@ #include <stdio.h> #include <stdint.h> #include <stdbool.h> +#include <math.h> #include "ft2_header.h" #include "ft2_config.h" #include "ft2_audio.h" diff --git a/src/ft2_module_loader.c b/src/ft2_module_loader.c @@ -30,7 +30,8 @@ ** You will experience a lot of headaches if you dig into this file... ** If something looks to be wrong, it's probably right! ** -** The actual module load routines are ported from FT2 and slightly modified. */ +** The actual module load routines are ported from FT2 and slightly modified. +*/ enum { @@ -41,6 +42,19 @@ enum FORMAT_STM = 4 }; +// .MOD types +enum +{ + FORMAT_MK, // ProTracker or compatible + FORMAT_FLT, // StarTrekker (4-channel modules only) + FORMAT_FT2, // FT2 (or other trackers, multichannel) + FORMAT_STK, // The Ultimate SoundTracker (15 samples) + FORMAT_NT, // NoiseTracker + FORMAT_HMNT, // His Master's NoiseTracker (special one) + + FORMAT_UNKNOWN // may be The Ultimate Soundtracker (set to FORMAT_STK later) +}; + // DO NOT TOUCH THESE STRUCTS! #ifdef _MSC_VER @@ -161,13 +175,55 @@ static bool allocateTmpInstr(int16_t nr) return true; } +#define IS_ID(s, b) !strncmp(s, b, 4) + +static uint8_t getModType(uint8_t *numChannels, const char *id) +{ + uint8_t modFormat = FORMAT_UNKNOWN; + *numChannels = 4; + + if (IS_ID("M.K.", id) || IS_ID("M!K!", id) || IS_ID("NSMS", id) || IS_ID("LARD", id) || IS_ID("PATT", id)) + { + modFormat = FORMAT_MK; // ProTracker or compatible + } + else if (id[1] == 'C' && id[2] == 'H' && id[3] == 'N') + { + modFormat = FORMAT_FT2; // FT2 or generic multichannel + *numChannels = id[0] - '0'; + } + else if (id[2] == 'C' && (id[3] == 'H' || id[3] == 'N')) + { + modFormat = FORMAT_FT2; // FT2 or generic multichannel + *numChannels = ((id[0] - '0') * 10) + (id[1] - '0'); + } + else if (IS_ID("FLT4", id)) + { + modFormat = FORMAT_FLT; // StarTrekker (4-channel modules only) + } + else if (IS_ID("FLT8", id)) + { + modFormat = FORMAT_FLT; // StarTrekker (4-channel modules only) + *numChannels = 8; + } + else if (IS_ID("N.T.", id)) + { + modFormat = FORMAT_NT; // NoiseTracker + } + else if (IS_ID("M&K!", id) || IS_ID("FEST", id)) + { + modFormat = FORMAT_HMNT; // His Master's NoiseTracker + } + + return modFormat; +} + static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) { char ID[16]; - bool modIsUST, modIsFEST, modIsNT; - uint8_t bytes[4]; + bool mightBeSTK, lateSTKVerFlag, veryLateSTKVerFlag; + uint8_t bytes[4], modFormat, numChannels; int16_t i, j, k, ai; - uint16_t a, b, period, ciaPeriod; + uint16_t a, b, period; tonTyp *ton; sampleTyp *s; songMOD31HeaderTyp h_MOD31; @@ -176,6 +232,14 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) showMsg = fromExternalThread ? okBoxThreadSafe : okBox; + veryLateSTKVerFlag = false; // "DFJ SoundTracker III" nad later + lateSTKVerFlag = false; // "TJC SoundTracker II" and later + mightBeSTK = false; + + memset(&songTmp, 0, sizeof (songTmp)); + memset(&h_MOD31, 0, sizeof (songMOD31HeaderTyp)); + memset(&h_MOD15, 0, sizeof (songMOD15HeaderTyp)); + // start loading MOD loadedFormat = FORMAT_MOD; @@ -200,7 +264,7 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) goto modLoadError; } - if (fileLength < 1596 || fileLength > 20842494) // minimum and maximum possible size for an FT2 .mod + if (fileLength < 1596 || fileLength > 20842494) // minimum and maximum possible size for a supported .mod { showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); goto modLoadError; @@ -212,63 +276,23 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) goto modLoadError; } - modIsFEST = false; - modIsNT = false; - modIsUST = false; - - if (!strncmp(h_MOD31.sig, "N.T.", 4)) - { - j = 4; - modIsNT = true; - } - else if (!strncmp(h_MOD31.sig, "FEST", 4) || !strncmp(h_MOD31.sig, "M&K!", 4)) - { - modIsFEST = true; - modIsNT = true; - j = 4; - } - else if (!strncmp(h_MOD31.sig, "M!K!", 4) || !strncmp(h_MOD31.sig, "M.K.", 4) || !strncmp(h_MOD31.sig, "FLT4", 4)) - { - j = 4; - } - else if (!strncmp(h_MOD31.sig, "OCTA", 4) || !strncmp(h_MOD31.sig, "FLT8", 4) || !strncmp(h_MOD31.sig, "CD81", 4)) - { - j = 8; - } - else - { - j = 0; - for (i = 0; i < 32; i++) - { - if (!strncmp(h_MOD31.sig, modSig[i], 4)) - { - j = i + 1; - break; - } - else if (j == 31) - { - j = -1; // ID not recignized - } - } - } + modFormat = getModType(&numChannels, h_MOD31.sig); - // unsupported MOD - if (j == -1) + if (modFormat == FORMAT_FLT && numChannels == 8) { - showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); + showMsg(0, "System message", "8-channel Startrekker modules are not supported!"); goto modLoadError; } - if (j > 0) + if (modFormat != FORMAT_UNKNOWN) { - modIsUST = false; if (fileLength < sizeof (h_MOD31)) { showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); goto modLoadError; } - songTmp.antChn = (uint8_t)j; + songTmp.antChn = numChannels; songTmp.len = h_MOD31.len; songTmp.repS = h_MOD31.repS; memcpy(songTmp.songTab, h_MOD31.songTab, 128); @@ -276,40 +300,96 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) } else { - modIsUST = true; + mightBeSTK = true; if (fileLength < sizeof (h_MOD15)) { - showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); + showMsg(0, "System message", "Error: This file is not a module!"); goto modLoadError; } - fseek(f, 0, SEEK_SET); + rewind(f); if (fread(&h_MOD15, 1, sizeof (h_MOD15), f) != sizeof (h_MOD15)) { showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); goto modLoadError; } - songTmp.antChn = 4; + songTmp.antChn = numChannels; songTmp.len = h_MOD15.len; songTmp.repS = h_MOD15.repS; memcpy(songTmp.songTab, h_MOD15.songTab, 128); ai = 15; } - if (songTmp.antChn == 0 || songTmp.len < 1) + if (modFormat == FORMAT_MK && songTmp.len == 129) + songTmp.len = 127; // fixes a specific copy of beatwave.mod + + if (songTmp.antChn == 0 || songTmp.len < 1 || songTmp.len > 128 || (mightBeSTK && songTmp.repS > 220)) { showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); goto modLoadError; } - if (!strncmp(h_MOD31.sig, "M.K.", 4) && songTmp.len == 129) - songTmp.len = 127; // fixes a specific copy of beatwave.mod by Sidewinder + for (a = 0; a < ai; a++) + { + songMODInstrHeaderTyp *smp = &h_MOD31.instr[a]; - if (songTmp.len > 128 || (modIsUST && (songTmp.repS == 0 || songTmp.repS > 220))) + if (modFormat != FORMAT_HMNT) // most of "His Master's Noisetracker" songs have junk sample names, so let's not load them + { + // trim off spaces at end of name + for (i = 21; i >= 0; i--) + { + if (smp->name[i] == ' ' || smp->name[i] == 0x1A) + smp->name[i] = '\0'; + else + break; + } + + memcpy(songTmp.instrName[1+a], smp->name, 22); + songTmp.instrName[1+a][22] = '\0'; + } + + /* Only late versions of Ultimate SoundTracker could have samples larger than 9999 bytes. + ** If found, we know for sure that this is a late STK module. + */ + if (mightBeSTK && 2*SWAP16(smp->len) > 9999) + lateSTKVerFlag = true; + } + + songTmp.speed = 125; + if (mightBeSTK) { - showMsg(0, "System message", "Error: This file is either not a module, or is not supported."); - goto modLoadError; + /* If we're still here at this point and the mightBeSTK flag is set, + ** then it's most likely a proper The Ultimate SoundTracker (STK/UST) module. + */ + modFormat = FORMAT_STK; + + if (h_MOD15.repS == 0) + h_MOD15.repS = 120; + + // jjk55.mod by Jesper Kyd has a bogus STK tempo value that should be ignored + if (!strcmp("jjk55", h_MOD31.name)) + h_MOD15.repS = 120; + + // The "restart pos" field in STK is the inital tempo (must be converted to BPM first) + if (h_MOD15.repS != 120) // 120 is a special case and means 50Hz (125BPM) + { + if (h_MOD15.repS > 220) + h_MOD15.repS = 220; + + // convert UST tempo to BPM + uint16_t ciaPeriod = (240 - songTmp.repS) * 122; + double dHz = 709379.0 / ciaPeriod; + int32_t BPM = (int32_t)((dHz * (125.0 / 50.0)) + 0.5); + + songTmp.speed = (uint16_t)BPM; + } + + songTmp.repS = 0; + } + else if (songTmp.repS >= songTmp.len) + { + songTmp.repS = 0; } // trim off spaces at end of name @@ -324,32 +404,16 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) memcpy(songTmp.name, h_MOD31.name, 20); songTmp.name[20] = '\0'; - for (a = 0; a < ai; a++) - { - // trim off spaces at end of name - for (i = 21; i >= 0; i--) - { - if (h_MOD31.instr[a].name[i] == ' ' || h_MOD31.instr[a].name[i] == 0x1A) - h_MOD31.instr[a].name[i] = '\0'; - else - break; - } - - memcpy(songTmp.instrName[1+a], h_MOD31.instr[a].name, 22); - songTmp.instrName[1+a][22] = '\0'; - } - + // count number of patterns b = 0; for (a = 0; a < 128; a++) { if (songTmp.songTab[a] > b) b = songTmp.songTab[a]; } + b++; - if (songTmp.len < 255) - memset(&songTmp.songTab[songTmp.len], 0, 256 - songTmp.len); - - for (a = 0; a <= b; a++) + for (a = 0; a < b; a++) { pattTmp[a] = (tonTyp *)calloc((MAX_PATT_LEN * TRACK_WIDTH) + 16, 1); if (pattTmp[a] == NULL) @@ -386,6 +450,22 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) ton->effTyp = bytes[2] & 0x0F; ton->eff = bytes[3]; + if (mightBeSTK) + { + if (ton->effTyp == 0xC || ton->effTyp == 0xD || ton->effTyp == 0xE) + { + // "TJC SoundTracker II" and later + lateSTKVerFlag = true; + } + + if (ton->effTyp == 0xF) + { + // "DFJ SoundTracker III" and later + lateSTKVerFlag = true; + veryLateSTKVerFlag = true; + } + } + if (ton->effTyp == 0xC) { if (ton->eff > 64) @@ -425,44 +505,108 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) ton->eff = 0; } } + } + } - if (modIsUST) + if (tmpPatternEmpty(a)) + { + if (pattTmp[a] != NULL) + { + free(pattTmp[a]); + pattTmp[a] = NULL; + } + } + } + + // pattern command conversion for non-PT formats + if (modFormat == FORMAT_STK || modFormat == FORMAT_FT2 || modFormat == FORMAT_NT || modFormat == FORMAT_HMNT || modFormat == FORMAT_FLT) + { + for (a = 0; a < b; a++) + { + if (pattTmp[a] == NULL) + continue; + + for (j = 0; j < 64; j++) + { + for (k = 0; k < songTmp.antChn; k++) { - if (ton->effTyp == 0x01) + ton = &pattTmp[a][(j * MAX_VOICES) + k]; + + if (modFormat == FORMAT_NT || modFormat == FORMAT_HMNT) { - // arpeggio - ton->effTyp = 0x00; + // any Dxx == D00 in NT/HMNT + if (ton->effTyp == 0xD) + ton->eff = 0; + + // effect F with param 0x00 does nothing in NT/HMNT + if (ton->effTyp == 0xF && ton->eff == 0) + ton->effTyp = 0; } - else if (ton->effTyp == 0x02) + else if (modFormat == FORMAT_FLT) // Startrekker { - // pitch slide - if (ton->eff & 0xF0) - { - ton->effTyp = 0x02; - ton->eff >>= 4; - } - else if (ton->eff & 0x0F) + if (ton->effTyp == 0xE) // remove unsupported "assembly macros" command { - ton->effTyp = 0x01; + ton->effTyp = 0; + ton->eff = 0; } + + // Startrekker is always in vblank mode, and limits speed to 0x1F + if (ton->effTyp == 0xF && ton->eff > 0x1F) + ton->eff = 0x1F; } + else if (modFormat == FORMAT_STK) + { + // convert STK effects to PT effects - // I don't remember why I did this... - if (ton->effTyp == 0x0D && ton->eff > 0) - ton->effTyp = 0x0A; - } + if (!lateSTKVerFlag) + { + // old SoundTracker 1.x commands - if (modIsNT && ton->effTyp == 0x0D) - ton->eff = 0; - } - } + if (ton->effTyp == 1) + { + // arpeggio + ton->effTyp = 0; + } + else if (ton->effTyp == 2) + { + // pitch slide + if (ton->eff & 0xF0) + { + // pitch slide down + ton->effTyp = 2; + ton->eff >>= 4; + } + else if (ton->eff & 0x0F) + { + // pitch slide up + ton->effTyp = 1; + } + } + } + else + { + // "DFJ SoundTracker II" or later - if (tmpPatternEmpty(a)) - { - if (pattTmp[a] != NULL) - { - free(pattTmp[a]); - pattTmp[a] = NULL; + if (ton->effTyp == 0xD) + { + if (veryLateSTKVerFlag) // "DFJ SoundTracker III" or later + { + // pattern break w/ no param (param must be cleared to fix some songs) + ton->eff = 0; + } + else + { + // volume slide + ton->effTyp = 0xA; + } + } + } + + // effect F with param 0x00 does nothing in UST/STK (I think?) + if (ton->effTyp == 0xF && ton->eff == 0) + ton->effTyp = 0; + } + } } } } @@ -472,13 +616,13 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) if (h_MOD31.instr[a].len == 0) continue; - if (!allocateTmpInstr(1 + a)) + if (!allocateTmpInstr(1+a)) { showMsg(0, "System message", "Not enough memory!"); goto modLoadError; } - setNoEnvelope(instrTmp[1 + a]); + setNoEnvelope(instrTmp[1+a]); s = &instrTmp[1+a]->samp[0]; @@ -491,34 +635,42 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) goto modLoadError; } - memcpy(s->name, songTmp.instrName[1+a], 22); + if (modFormat != FORMAT_HMNT) // most of "His Master's Noisetracker" songs have junk sample names, so let's not load them + memcpy(s->name, songTmp.instrName[1+a], 22); - if (modIsFEST) - h_MOD31.instr[a].fine = (32 - (h_MOD31.instr[a].fine & 0x1F)) >> 1; + if (modFormat == FORMAT_HMNT) // finetune in "His Master's NoiseTracker" is different + h_MOD31.instr[a].fine = (uint8_t)((-h_MOD31.instr[a].fine & 0x1F) / 2); // one more bit of precision, + inverted - if (!modIsUST) - s->fine = 8 * ((2 * ((h_MOD31.instr[a].fine & 0x0F) ^ 8)) - 16); - else - s->fine = 0; + if (modFormat != FORMAT_STK) + s->fine = 8 * ((2 * ((h_MOD31.instr[a].fine & 0xF) ^ 8)) - 16); s->pan = 128; s->vol = h_MOD31.instr[a].vol; - if (s->vol > 64) s->vol = 64; + if (s->vol > 64) + s->vol = 64; s->repS = 2 * SWAP16(h_MOD31.instr[a].repS); + s->repL = 2 * SWAP16(h_MOD31.instr[a].repL); - if (modIsUST) - s->repS /= 2; + if (s->repL < 2) + s->repL = 2; - s->repL = 2 * SWAP16(h_MOD31.instr[a].repL); + /* Ultimate SoundTracker before version 2.5 had loopStart in bytes, not words + ** XXX: This has to be verified... It's possible that it was before that, + ** and that this breaks some modules. + */ + if (mightBeSTK && !lateSTKVerFlag) + s->repS /= 2; - if (s->repL <= 2) + // fix for poorly converted STK (< v2.5) -> PT/NT modules (FIXME: Worth keeping or not?) + if (!mightBeSTK && s->repL > 2 && s->repS+s->repL > s->len) { - s->repS = 0; - s->repL = 0; + if ((s->repS/2) + s->repL <= s->len) + s->repS /= 2; } + // fix overflown loop if (s->repS+s->repL > s->len) { if (s->repS >= s->len) @@ -532,52 +684,27 @@ static bool loadMusicMOD(FILE *f, uint32_t fileLength, bool fromExternalThread) } } - if (s->repL > 2) - s->typ = 1; - else - s->typ = 0; + if (s->repS+s->repL > 2) + s->typ = 1; // enable loop - if (modIsUST && (s->repS > 2 && s->repS < s->len)) + /* For Ultimate SoundTracker modules, only the loop area of a looped sample is played. + ** Skip loading of eventual data present before loop start. + */ + if (modFormat == FORMAT_STK && (s->repS > 0 && s->repL < s->len)) { s->len -= s->repS; fseek(f, s->repS, SEEK_CUR); s->repS = 0; } - if (fread(s->pek, s->len, 1, f) == 1) - { - fixSample(s); - } - else - { - free(s->pek); - s->pek = NULL; - s->len = 0; - } - } - - songTmp.speed = 125; - - if (modIsUST) - { - // repS is initialBPM in UST MODs - - if (songTmp.repS != 120) // 120 is a special case and means 50Hz (125BPM) + int32_t bytesRead = (int32_t)fread(s->pek, 1, s->len, f); + if (bytesRead < s->len) { - if (songTmp.repS > 239) - songTmp.repS = 239; - - // convert UST tempo to BPM - const double dPALAmigaCiaClk = 709379.0; - ciaPeriod = (240 - songTmp.repS) * 122; - songTmp.speed = (uint16_t)round((dPALAmigaCiaClk / ciaPeriod) * (125.0 / 50.0)); + int32_t bytesToClear = s->len - bytesRead; + memset(&s->pek[bytesRead], 0, bytesToClear); } - songTmp.repS = 0; - } - else if (songTmp.repS >= songTmp.len) - { - songTmp.repS = 0; + fixSample(s); } fclose(f); @@ -965,7 +1092,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) bool check3xx, illegalUxx; uint8_t ha[2048]; uint8_t s3mLastDEff[32], s3mLastEEff[32], s3mLastFEff[32]; - uint8_t s3mLastSEff[32], s3mLastJEff[32], s3mLastGInstr[32], tmp8, typ; + uint8_t s3mLastSEff[32], s3mLastJEff[32], s3mLastGInstr[32], typ; int16_t i, j, k, ai, ap, ver, ii, kk, tmp; uint16_t ptnOfs[256]; int32_t len; @@ -1088,11 +1215,11 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) if (ptnOfs[i] == 0) continue; // empty pattern - memset(s3mLastDEff, 0, sizeof (s3mLastDEff)); - memset(s3mLastEEff, 0, sizeof (s3mLastEEff)); - memset(s3mLastFEff, 0, sizeof (s3mLastFEff)); - memset(s3mLastSEff, 0, sizeof (s3mLastSEff)); - memset(s3mLastJEff, 0, sizeof (s3mLastJEff)); + memset(s3mLastDEff, 0, sizeof (s3mLastDEff)); + memset(s3mLastEEff, 0, sizeof (s3mLastEEff)); + memset(s3mLastFEff, 0, sizeof (s3mLastFEff)); + memset(s3mLastSEff, 0, sizeof (s3mLastSEff)); + memset(s3mLastJEff, 0, sizeof (s3mLastJEff)); memset(s3mLastGInstr, 0, sizeof (s3mLastGInstr)); fseek(f, ptnOfs[i] << 4, SEEK_SET); @@ -1141,7 +1268,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) // note and sample if (typ & 32) { - ton.ton = pattBuff[k++]; + ton.ton = pattBuff[k++]; ton.instr = pattBuff[k++]; if (ton.instr > MAX_INST) @@ -1181,17 +1308,17 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) if ((s3mLastDEff[ii] & 0xF0) == 0xF0 || (s3mLastDEff[ii] & 0x0F) == 0x0F) ton.eff = s3mLastDEff[ii]; } - else if (ton.effTyp == 5) ton.eff = s3mLastEEff[ii]; - else if (ton.effTyp == 6) ton.eff = s3mLastFEff[ii]; + else if (ton.effTyp == 5) ton.eff = s3mLastEEff[ii]; + else if (ton.effTyp == 6) ton.eff = s3mLastFEff[ii]; else if (ton.effTyp == 10) ton.eff = s3mLastJEff[ii]; else if (ton.effTyp == 19) ton.eff = s3mLastSEff[ii]; } if (ton.eff != 0) { - if (ton.effTyp == 4) s3mLastDEff[ii] = ton.eff; - else if (ton.effTyp == 5) s3mLastEEff[ii] = ton.eff; - else if (ton.effTyp == 6) s3mLastFEff[ii] = ton.eff; + if (ton.effTyp == 4) s3mLastDEff[ii] = ton.eff; + else if (ton.effTyp == 5) s3mLastEEff[ii] = ton.eff; + else if (ton.effTyp == 6) s3mLastFEff[ii] = ton.eff; else if (ton.effTyp == 10) s3mLastJEff[ii] = ton.eff; else if (ton.effTyp == 19) s3mLastSEff[ii] = ton.eff; } @@ -1272,8 +1399,8 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) } break; - case 8: ton.effTyp = 0x04; break; // H - case 9: ton.effTyp = 0x1D; break; // I + case 8: ton.effTyp = 0x04; break; // H + case 9: ton.effTyp = 0x1D; break; // I case 10: ton.effTyp = 0x00; break; // J case 11: ton.effTyp = 0x06; break; // K case 12: ton.effTyp = 0x05; break; // L @@ -1291,11 +1418,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) else if (tmp == 0x2) ton.eff |= 0x50; else if (tmp == 0x3) ton.eff |= 0x40; else if (tmp == 0x4) ton.eff |= 0x70; - else if (tmp == 0x08) - { - ton.effTyp = 0x8; - ton.eff <<= 4; - } + // we ignore S8x (set 4-bit pan) becuase it's not compatible with FT2 panning else if (tmp == 0xB) ton.eff |= 0x60; else if (tmp == 0xC) ton.eff |= 0xC0; else if (tmp == 0xD) ton.eff |= 0xD0; @@ -1312,7 +1435,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) case 20: // T { ton.effTyp = 0x0F; - if (ton.eff < 0x20) + if (ton.eff < 0x21) // Txx with a value lower than 33 (0x21) does nothing in ST3, remove effect { ton.effTyp = 0; ton.eff = 0; @@ -1320,12 +1443,12 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) } break; - case 21: // U + case 21: // U (fine vibrato, doesn't exist in FT2, convert to normal vibrato) { if ((ton.eff & 0x0F) != 0) { - ton.eff = (ton.eff & 0xF0) | (((ton.eff & 15) + 1) / 4); - if ((ton.eff & 0x0F) == 0) + ton.eff = (ton.eff & 0xF0) | (((ton.eff & 15) + 1) / 4); // divide depth by 4 + if ((ton.eff & 0x0F) == 0) // depth too low, remove effect { illegalUxx = true; ton.effTyp = 0; @@ -1366,9 +1489,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) if (ton.instr != 0 && ton.effTyp != 0x3) s3mLastGInstr[ii] = ton.instr; - /* Remove any EDx with no note. - ** SDx with no note in ST3 = does nothing - ** EDx with no note in FT2 = still retriggers */ + // EDx with no note does nothing in ST3 but retrigs in FT2, remove effect if (ton.effTyp == 0xE && (ton.eff & 0xF0) == 0xD0) { if (ton.ton == 0 || ton.ton == 97) @@ -1378,6 +1499,36 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) } } + // EDx with a zero will prevent note/instr/vol from updating in ST3, remove everything + if (ton.effTyp == 0xE && ton.eff == 0xD0) + { + ton.ton = 0; + ton.instr = 0; + ton.vol = 0; + ton.effTyp = 0; + ton.eff = 0; + } + + // ECx with a zero does nothing in ST3 but cuts voice in FT2, remove effect + if (ton.effTyp == 0xE && ton.eff == 0xC0) + { + ton.effTyp = 0; + ton.eff = 0; + } + + // Vxx with a value higher than 64 (0x40) does nothing in ST3, remove effect + if (ton.effTyp == 0x10 && ton.eff > 0x40) + { + ton.effTyp = 0; + ton.eff = 0; + } + + if (ton.effTyp > 35) + { + ton.effTyp = 0; + ton.eff = 0; + } + pattTmp[i][(kk * MAX_VOICES) + ii] = ton; } } @@ -1461,6 +1612,9 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) memcpy(s->name, h_S3MInstr.name, 21); + if (h_S3MInstr.c2Spd > 65535) + h_S3MInstr.c2Spd = 65535; + tuneSample(s, h_S3MInstr.c2Spd); s->len = h_S3MInstr.len; @@ -1517,7 +1671,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) memcpy(s->pek, tmpSmp, h_S3MInstr.len * 2); - s->len *= 2; + s->len *= 2; s->repS *= 2; s->repL *= 2; } @@ -1561,6 +1715,8 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) { pattTon = &pattTmp[i][(j * MAX_VOICES) + k]; + // fix illegal 3xx slides + if (pattTon->ton > 0 && pattTon->ton < 97) check3xx = pattTon->effTyp != 0x3; @@ -1573,42 +1729,37 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) } } - if (pattTon->effTyp == 0x9 && pattTon->eff > 0) + /* In ST3 in GUS mode, an overflowed sample offset behaves like this: + ** - Non-looped sample: Cut voice + ** - Looped sample: Wrap around loop point + ** + ** What we do here is to change the sample offset value to point to + ** the wrapped sample loop position. This may be off by up to 256 bytes + ** though... + */ + + if (pattTon->effTyp == 0x9 && pattTon->eff > 0 && pattTon->instr > 0 && pattTon->instr <= ai && ai <= 128) { - if (pattTon->instr != 0 && pattTon->instr <= ai) + s = &instrTmp[pattTon->instr]->samp[0]; + if (s->len > 0 && (s->typ & 1)) // only handle non-empty looping samples { - s = &instrTmp[pattTon->instr]->samp[0]; - - len = s->len; + uint32_t loopEnd = s->repS + s->repL; + uint32_t offset = pattTon->eff * 256; - tmp8 = 0; - if (len > 0) + if (offset >= loopEnd) { - tmp8 = pattTon->eff; - if (tmp8 >= len/256) - { - if (len/256 < 1) - tmp8 = 0; - else - tmp8 = (uint8_t)((len/256) - 1); - } - } + if (s->repL >= 2) + offset = s->repS + ((offset - loopEnd) % s->repL); + else + offset = s->repS; - if (tmp8 > 0) - { - pattTon->eff = tmp8; - } - else - { - pattTon->effTyp = 0; - pattTon->eff = 0; + offset = (offset + (1 << 7)) >> 8; // convert to rounded sample offset value + if (offset > 255) + offset = 255; + + pattTon->eff = (uint8_t)offset; } } - else - { - pattTon->effTyp = 0; - pattTon->eff = 0; - } } } } @@ -1619,7 +1770,7 @@ static bool loadMusicS3M(FILE *f, uint32_t dataLength, bool fromExternalThread) songTmp.antChn = countS3MChannels(ap); if (!(config.dontShowAgainFlags & DONT_SHOW_S3M_LOAD_WARNING_FLAG)) - showMsg(6, "System message", "Warning: S3M channel panning is not compatible with FT2!"); + showMsg(6, "System message", "Warning: S3M channel panning is ignored because it's not compatible with FT2."); moduleLoaded = true; return true; @@ -2132,8 +2283,12 @@ static bool loadInstrSample(FILE *f, uint16_t i) if (s->pek == NULL) return false; - if (fread(s->pek, l, 1, f) != 1) - return false; + int32_t bytesRead = (int32_t)fread(s->pek, 1, l, f); + if (bytesRead < l) + { + int32_t bytesToClear = l - bytesRead; + memset(&s->pek[bytesRead], 0, bytesToClear); + } if (bytesToSkip > 0) fseek(f, bytesToSkip, SEEK_CUR); diff --git a/src/ft2_pattern_draw.c b/src/ft2_pattern_draw.c @@ -977,7 +977,10 @@ void writePattern(int32_t currRow, int32_t pattern) void pattTwoHexOut(uint32_t xPos, uint32_t yPos, uint8_t val, uint32_t color) { const uint8_t *ch1Ptr, *ch2Ptr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif ch1Ptr = &font4Ptr[(val >> 4) * FONT4_CHAR_W]; ch2Ptr = &font4Ptr[(val & 0x0F) * FONT4_CHAR_W]; @@ -987,6 +990,10 @@ void pattTwoHexOut(uint32_t xPos, uint32_t yPos, uint8_t val, uint32_t color) { for (uint32_t x = 0; x < FONT4_CHAR_W; x++) { +#ifdef __arm__ + if (ch1Ptr[x] != 0) dstPtr[x] = color; + if (ch2Ptr[x] != 0) dstPtr[FONT4_CHAR_W+x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (ch1Ptr[x] != 0) tmp = color; @@ -995,6 +1002,7 @@ void pattTwoHexOut(uint32_t xPos, uint32_t yPos, uint8_t val, uint32_t color) tmp = dstPtr[FONT4_CHAR_W+x]; if (ch2Ptr[x] != 0) tmp = color; dstPtr[FONT4_CHAR_W+x] = tmp; +#endif } ch1Ptr += FONT4_WIDTH; @@ -1006,7 +1014,10 @@ void pattTwoHexOut(uint32_t xPos, uint32_t yPos, uint8_t val, uint32_t color) static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontType, uint32_t color) { const uint8_t *srcPtr; - uint32_t x, y, *dstPtr, tmp; + uint32_t x, y, *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; @@ -1017,10 +1028,15 @@ static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontT { for (x = 0; x < FONT3_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT3_WIDTH; @@ -1034,10 +1050,15 @@ static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontT { for (x = 0; x < FONT4_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT4_WIDTH; @@ -1051,10 +1072,15 @@ static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontT { for (x = 0; x < FONT5_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT5_WIDTH; @@ -1068,10 +1094,15 @@ static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontT { for (x = 0; x < FONT7_CHAR_W; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT7_WIDTH; @@ -1083,7 +1114,10 @@ static void pattCharOut(uint32_t xPos, uint32_t yPos, uint8_t chr, uint8_t fontT static void drawEmptyNoteSmall(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif srcPtr = &font7Data[18 * FONT7_CHAR_W]; dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; @@ -1092,10 +1126,15 @@ static void drawEmptyNoteSmall(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT7_CHAR_W*3; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT7_WIDTH; @@ -1106,7 +1145,10 @@ static void drawEmptyNoteSmall(uint32_t xPos, uint32_t yPos, uint32_t color) static void drawKeyOffSmall(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif srcPtr = &font7Data[21 * FONT7_CHAR_W]; dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + (xPos + 2)]; @@ -1115,10 +1157,15 @@ static void drawKeyOffSmall(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT7_CHAR_W*2; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT7_WIDTH; @@ -1130,7 +1177,10 @@ static void drawNoteSmall(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t co { const uint8_t *ch1Ptr, *ch2Ptr, *ch3Ptr; uint8_t note; - uint32_t *dstPtr, char1, char2, char3, tmp; + uint32_t *dstPtr, char1, char2, char3; +#ifndef __arm__ + uint32_t tmp; +#endif assert(ton >= 1 && ton <= 97); @@ -1159,6 +1209,11 @@ static void drawNoteSmall(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t co { for (uint32_t x = 0; x < FONT7_CHAR_W; x++) { +#ifdef __arm__ + if (ch1Ptr[x] != 0) dstPtr[x] = color; + if (ch2Ptr[x] != 0) dstPtr[FONT7_CHAR_W+x] = color; + if (ch3Ptr[x] != 0) dstPtr[((FONT7_CHAR_W*2)-2)+x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (ch1Ptr[x] != 0) tmp = color; @@ -1171,6 +1226,7 @@ static void drawNoteSmall(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t co tmp = dstPtr[((FONT7_CHAR_W*2)-2)+x]; // -2 to get correct alignment for ending glyph if (ch3Ptr[x] != 0) tmp = color; dstPtr[((FONT7_CHAR_W*2)-2)+x] = tmp; +#endif } ch1Ptr += FONT7_WIDTH; @@ -1183,7 +1239,10 @@ static void drawNoteSmall(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t co static void drawEmptyNoteMedium(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; srcPtr = &font4Ptr[43 * FONT4_CHAR_W]; @@ -1192,10 +1251,15 @@ static void drawEmptyNoteMedium(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT4_CHAR_W*3; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT4_WIDTH; @@ -1206,7 +1270,10 @@ static void drawEmptyNoteMedium(uint32_t xPos, uint32_t yPos, uint32_t color) static void drawKeyOffMedium(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif srcPtr = &font4Ptr[40 * FONT4_CHAR_W]; dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; @@ -1215,10 +1282,15 @@ static void drawKeyOffMedium(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT4_CHAR_W*3; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT4_WIDTH; @@ -1229,7 +1301,10 @@ static void drawKeyOffMedium(uint32_t xPos, uint32_t yPos, uint32_t color) static void drawNoteMedium(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t color) { const uint8_t *ch1Ptr, *ch2Ptr, *ch3Ptr; - uint32_t note, *dstPtr, char1, char2, char3, tmp; + uint32_t note, *dstPtr, char1, char2, char3; +#ifndef __arm__ + uint32_t tmp; +#endif ton--; @@ -1256,6 +1331,11 @@ static void drawNoteMedium(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t c { for (uint32_t x = 0; x < FONT4_CHAR_W; x++) { +#ifdef __arm__ + if (ch1Ptr[x] != 0) dstPtr[x] = color; + if (ch2Ptr[x] != 0) dstPtr[FONT4_CHAR_W+x] = color; + if (ch3Ptr[x] != 0) dstPtr[(FONT4_CHAR_W*2)+x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (ch1Ptr[x] != 0) tmp = color; @@ -1268,6 +1348,7 @@ static void drawNoteMedium(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t c tmp = dstPtr[(FONT4_CHAR_W*2)+x]; if (ch3Ptr[x] != 0) tmp = color; dstPtr[(FONT4_CHAR_W*2)+x] = tmp; +#endif } ch1Ptr += FONT4_WIDTH; @@ -1280,7 +1361,10 @@ static void drawNoteMedium(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t c static void drawEmptyNoteBig(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif srcPtr = &font4Ptr[67 * FONT4_CHAR_W]; dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; @@ -1289,10 +1373,15 @@ static void drawEmptyNoteBig(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT4_CHAR_W*6; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT4_WIDTH; @@ -1303,7 +1392,10 @@ static void drawEmptyNoteBig(uint32_t xPos, uint32_t yPos, uint32_t color) static void drawKeyOffBig(uint32_t xPos, uint32_t yPos, uint32_t color) { const uint8_t *srcPtr; - uint32_t *dstPtr, tmp; + uint32_t *dstPtr; +#ifndef __arm__ + uint32_t tmp; +#endif srcPtr = &font4Data[61 * FONT4_CHAR_W]; dstPtr = &video.frameBuffer[(yPos * SCREEN_W) + xPos]; @@ -1312,10 +1404,15 @@ static void drawKeyOffBig(uint32_t xPos, uint32_t yPos, uint32_t color) { for (uint32_t x = 0; x < FONT4_CHAR_W*6; x++) { +#ifdef __arm__ + if (srcPtr[x] != 0) + dstPtr[x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (srcPtr[x] != 0) tmp = color; dstPtr[x] = tmp; +#endif } srcPtr += FONT4_WIDTH; @@ -1327,8 +1424,10 @@ static void drawNoteBig(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t colo { const uint8_t *ch1Ptr, *ch2Ptr, *ch3Ptr; uint8_t note; - uint32_t *dstPtr, char1, char2, char3, tmp; - + uint32_t *dstPtr, char1, char2, char3; +#ifndef __arm__ + uint32_t tmp; +#endif ton--; note = noteTab1[ton]; @@ -1354,6 +1453,11 @@ static void drawNoteBig(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t colo { for (uint32_t x = 0; x < FONT5_CHAR_W; x++) { +#ifdef __arm__ + if (ch1Ptr[x] != 0) dstPtr[x] = color; + if (ch2Ptr[x] != 0) dstPtr[FONT5_CHAR_W+x] = color; + if (ch3Ptr[x] != 0) dstPtr[(FONT5_CHAR_W*2)+x] = color; +#else // carefully written like this to generate conditional move instructions (font data is hard to predict) tmp = dstPtr[x]; if (ch1Ptr[x] != 0) tmp = color; @@ -1366,6 +1470,7 @@ static void drawNoteBig(uint32_t xPos, uint32_t yPos, int32_t ton, uint32_t colo tmp = dstPtr[(FONT5_CHAR_W*2)+x]; if (ch3Ptr[x] != 0) tmp = color; dstPtr[(FONT5_CHAR_W*2)+x] = tmp; +#endif } ch1Ptr += FONT5_WIDTH; diff --git a/src/ft2_pattern_ed.c b/src/ft2_pattern_ed.c @@ -21,8 +21,6 @@ #include "ft2_mouse.h" #include "ft2_video.h" -#include "ft2_module_loader.h" - // for pattern marking w/ keyboard static int8_t lastChMark; static int16_t lastRowMark; diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c @@ -1244,7 +1244,7 @@ static void fixaEnvelopeVibrato(stmTyp *ch) if (++ch->envVCnt == ins->envVP[envPos][0]) { - ch->envVAmp = (ins->envVP[envPos][1] & 0xFF) << 8; + ch->envVAmp = ins->envVP[envPos][1] << 8; envPos++; if (ins->envVTyp & 4) @@ -1314,34 +1314,25 @@ static void fixaEnvelopeVibrato(stmTyp *ch) } } - /* original FT2 method with lower precision (finalVol = 0..256) - envVal >>= 8; - ch->finalVol = (song.globVol * (((envVal * ch->outVol) * ch->fadeOutAmp) >> (16 + 2))) >> 7; - */ - - /* calculate with four times more precision (finalVol = 0..2048) + /* calculate with 256 times more precision (vol = 0..65535) ** Also, vol envelope range is now 0..16384 instead of being shifted to 0..64 */ uint32_t vol1 = song.globVol * ch->outVol * ch->fadeOutAmp; // 0..64 * 0..64 * 0..32768 = 0..134217728 - uint32_t vol2 = envVal << 2; // 0..16384 * 2^2 = 0..65536 + uint32_t vol2 = envVal << 7; // 0..16384 * 2^7 = 0..2097152 - vol = ((uint64_t)vol1 * vol2) >> 32; // 0..2048 + vol = ((uint64_t)vol1 * vol2) >> 32; // 0..65536 ch->status |= IS_Vol; } else { - /* original FT2 method with lower precision (finalVol = 0..256) - ch->finalVol = (song.globVol * (((ch->outVol << 4) * ch->fadeOutAmp) >> 16)) >> 7; - */ - // calculate with four times more precision (finalVol = 0..2048) - vol = (song.globVol * ch->outVol * ch->fadeOutAmp) >> 16; // 0..64 * 0..64 * 0..32768 = 0..2048 + vol = (song.globVol * ch->outVol * ch->fadeOutAmp) >> 11; // 0..64 * 0..64 * 0..32768 = 0..65536 } - if (vol > 2047) - vol = 2047; // range is now 0..2047 to prevent MUL overflow when voice volume is calculated + if (vol > 65535) + vol = 65535; // range is now 0..65535 to prevent MUL overflow when voice volume is calculated ch->finalVol = (uint16_t)vol; } @@ -3127,7 +3118,7 @@ void stopVoices(void) editor.curPlaySmp = 255; stopAllScopes(); - resetDitherSeed(); + resetAudioDither(); resetOldRates(); // wait for scope thread to finish, so that we know pointers aren't deprecated diff --git a/src/ft2_sampling.c b/src/ft2_sampling.c @@ -233,8 +233,6 @@ static void drawSamplingPreview(void) int32_t smpIdx, smpNum; uint32_t *centerPtrL, *centerPtrR, pixVal; -#define SAMPLEL_AREA_Y_CENTER 250 - pixVal = video.palette[PAL_PATTEXT]; // select buffer currently not being written to (double-buffering) @@ -338,19 +336,18 @@ void handleSamplingUpdates(void) void startSampling(void) { - int16_t result; - #if SDL_PATCHLEVEL < 5 - okBox(2, "System message", "This program needs to be compiled with SDL 2.0.5 or later to support audio sampling."); + okBox(0, "System message", "This program needs to be compiled with SDL 2.0.5 or later to support audio sampling."); return; #else + int16_t result; SDL_AudioSpec want, have; sampleTyp *s, *nextSmp; if (editor.samplingAudioFlag || editor.curInstr == 0) return; - result = okBox(9, "System request", "Stereo sampling will use the next sample slot. While ongoing, press any key to stop. "); + result = okBox(9, "System request", "Stereo sampling will use the next sample slot. While ongoing, press any key to stop."); if (result == 0 || result == 3) return; diff --git a/src/ft2_scopes.c b/src/ft2_scopes.c @@ -435,11 +435,11 @@ static void updateScopes(void) scope_t tempState; scopesUpdatingFlag = true; - for (uint32_t i = 0; i < song.antChn; i++) + + sc = scope; + for (uint32_t i = 0; i < song.antChn; i++, sc++) { - sc = &scope[i]; tempState = *sc; // cache it - if (!tempState.active) continue; // scope is not active, no need @@ -585,15 +585,15 @@ void handleScopesFromChQueue(chSyncData_t *chSyncData, uint8_t *scopeUpdateStatu volatile scope_t *sc; sampleTyp *smpPtr; - for (int32_t i = 0; i < song.antChn; i++) + sc = scope; + ch = chSyncData->channels; + for (int32_t i = 0; i < song.antChn; i++, sc++, ch++) { - sc = &scope[i]; - ch = &chSyncData->channels[i]; status = scopeUpdateStatus[i]; // set scope volume if (status & IS_Vol) - sc->SVol = (int8_t)(((ch->finalVol * SCOPE_HEIGHT) + (1 << 10)) >> 11); // rounded + sc->SVol = (int8_t)(((ch->finalVol * SCOPE_HEIGHT) + (1 << 15)) >> 16); // rounded // set scope frequency if (status & IS_Period) diff --git a/src/ft2_video.c b/src/ft2_video.c @@ -775,6 +775,18 @@ void setWindowSizeFromConfig(bool updateRenderer) uint8_t i, oldUpscaleFactor; SDL_DisplayMode dm; + /* Kludge for Raspbarry Pi. Upscaling of 3x or higher makes everything slow as a snail. + ** This hack unfortunately applies to any ARM based device, but I doubt 3x/4x would run + ** smooth on any ARM device suitable for the FT2 clone anyway (excluding tablets/phones). + */ +#ifdef __arm__ + if ((config.windowFlags & WINSIZE_3X) || (config.windowFlags & WINSIZE_4X)) + { + config.windowFlags &= ~(WINSIZE_1X + WINSIZE_2X + WINSIZE_3X + WINSIZE_4X); + config.windowFlags |= WINSIZE_AUTO; + } +#endif + oldUpscaleFactor = video.upscaleFactor; if (config.windowFlags & WINSIZE_AUTO) { @@ -793,6 +805,12 @@ void setWindowSizeFromConfig(bool updateRenderer) if (i == 0) video.upscaleFactor = 1; // 1x is not going to fit, but use 1x anyways... + + // kludge (read comment above) +#ifdef __arm__ + if (video.upscaleFactor > 2) + video.upscaleFactor = 2; +#endif } else { diff --git a/src/helpdata/FT2.HLP b/src/helpdata/FT2.HLP @@ -781,7 +781,7 @@ Enables the anti-click system in the audio mixer (FT2.08+). Please note that original FT2 can't load this config entry, clone only. ->@X040@C0011.5-bit dither: +>@X040@C0011-bit dither: >@X060@C002 Works for 16-bit audio mode only. Applies random scaled values to the mixed samples before truncating to 16-bit. diff --git a/src/helpdata/ft2_help_data.h b/src/helpdata/ft2_help_data.h @@ -3,9 +3,9 @@ #include <stdint.h> -#define HELP_DATA_LEN 27914 +#define HELP_DATA_LEN 27912 -const uint8_t helpData[27914] = +const uint8_t helpData[27912] = { 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, @@ -1784,556 +1784,555 @@ const uint8_t helpData[27914] = 0x6C,0x6F,0x61,0x64,0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F, 0x6E,0x66,0x69,0x67,0x20,0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B, 0x63,0x6C,0x6F,0x6E,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00, - 0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x31,0x2E,0x35,0x2D,0x62,0x69,0x74,0x20,0x64,0x69,0x74,0x68, - 0x65,0x72,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x21,0x57,0x6F,0x72,0x6B,0x73,0x20,0x66,0x6F, - 0x72,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x61,0x75,0x64, - 0x69,0x6F,0x20,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x6E,0x6C,0x79, - 0x2E,0x4E,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x72,0x61, - 0x6E,0x64,0x6F,0x6D,0x20,0x73,0x63,0x61,0x6C,0x65,0x64,0x20, - 0x76,0x61,0x6C,0x75,0x65,0x73,0x20,0x74,0x6F,0x20,0x74,0x68, - 0x65,0x20,0x6D,0x69,0x78,0x65,0x64,0x20,0x73,0x61,0x6D,0x70, - 0x6C,0x65,0x73,0x20,0x62,0x65,0x66,0x6F,0x72,0x65,0x20,0x74, - 0x72,0x75,0x6E,0x63,0x61,0x74,0x69,0x6E,0x67,0x20,0x74,0x6F, - 0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x2E,0x46,0x54,0x68,0x69, - 0x73,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x69,0x6E,0x20, - 0x74,0x68,0x65,0x6F,0x72,0x79,0x20,0x6C,0x6F,0x77,0x65,0x72, - 0x20,0x74,0x68,0x65,0x20,0x71,0x75,0x61,0x6E,0x74,0x69,0x7A, - 0x61,0x74,0x69,0x6F,0x6E,0x20,0x6E,0x6F,0x69,0x73,0x65,0x2E, - 0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x61,0x6C,0x72,0x65, - 0x61,0x64,0x79,0x20,0x68,0x61,0x73,0x46,0x61,0x20,0x70,0x72, - 0x65,0x74,0x74,0x79,0x20,0x6C,0x6F,0x77,0x20,0x6E,0x6F,0x69, - 0x73,0x65,0x20,0x66,0x6C,0x6F,0x6F,0x72,0x2C,0x20,0x73,0x6F, - 0x20,0x64,0x6F,0x6E,0x27,0x74,0x20,0x65,0x78,0x70,0x65,0x63, - 0x74,0x20,0x61,0x6E,0x79,0x20,0x61,0x75,0x64,0x69,0x62,0x6C, - 0x65,0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x63,0x65, - 0x20,0x68,0x65,0x72,0x65,0x2E,0x1F,0x41,0x6C,0x73,0x6F,0x20, - 0x61,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x66,0x6F,0x72,0x20, - 0x57,0x41,0x56,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E, - 0x67,0x2E,0x00,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, - 0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x63,0x61, - 0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, - 0x40,0x43,0x30,0x30,0x32,0x46,0x41,0x6D,0x70,0x6C,0x69,0x66, - 0x69,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75, - 0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,0x20,0x6D,0x69,0x78,0x69, - 0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73, - 0x65,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x6E,0x65,0x20, - 0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,0x68,0x2C,0x20,0x79,0x6F, - 0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,0x74,0x20,0x64,0x69,0x73, - 0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x33,0x32,0x58, - 0x20,0x65,0x71,0x75,0x61,0x6C,0x73,0x20,0x66,0x75,0x6C,0x6C, - 0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75,0x64,0x65,0x20,0x66, - 0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,0x63,0x68,0x61,0x6E,0x6E, - 0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, - 0x43,0x30,0x30,0x31,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63, - 0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58, - 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x54,0x68,0x65, - 0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x20,0x66,0x72,0x65,0x71, - 0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x20, - 0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,0x6C,0x6C,0x20,0x70,0x69, - 0x74,0x63,0x68,0x20,0x62,0x65,0x6E,0x64,0x73,0x20,0x72,0x75, - 0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6E,0x73,0x74,0x61,0x6E, - 0x74,0x3F,0x73,0x70,0x65,0x65,0x64,0x2C,0x20,0x69,0x6E,0x64, - 0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74,0x20,0x6F,0x66,0x20, - 0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20, - 0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49, - 0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x77,0x69,0x74,0x63,0x68, - 0x20,0x74,0x68,0x69,0x73,0x41,0x6F,0x6E,0x65,0x2C,0x20,0x6F, - 0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,0x69,0x73,0x68,0x65,0x64, - 0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,0x69,0x74,0x20,0x6D,0x69, - 0x67,0x68,0x74,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x73,0x74, - 0x72,0x61,0x6E,0x67,0x65,0x20,0x69,0x66,0x20,0x74,0x68,0x65, - 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x75,0x73,0x65,0x73,0x0D, - 0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,0x65,0x73, - 0x2E,0x00,0x20,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30, - 0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69, - 0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x3A,0x01, - 0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30, - 0x31,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x61,0x79, - 0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,0x78,0x20,0x6E,0x75,0x6D, - 0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30, - 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x41,0x49,0x66,0x20,0x79, - 0x6F,0x75,0x20,0x75,0x73,0x65,0x20,0x70,0x61,0x74,0x74,0x65, - 0x72,0x6E,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x61,0x72,0x65, - 0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,0x20,0x74,0x68,0x61,0x6E, - 0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2C,0x20,0x79, - 0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x75,0x73, - 0x65,0x45,0x68,0x65,0x78,0x20,0x63,0x6F,0x75,0x6E,0x74,0x69, - 0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,0x65,0x20,0x74,0x68,0x65, - 0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x20, - 0x32,0x20,0x64,0x69,0x67,0x69,0x74,0x73,0x20,0x69,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D, - 0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x2E,0x00, - 0x17,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x53,0x63,0x6F,0x70,0x65,0x20,0x73,0x74,0x79,0x6C,0x65,0x3A, - 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x43,0x22,0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x22,0x20, - 0x77,0x69,0x6C,0x6C,0x20,0x73,0x68,0x6F,0x77,0x20,0x74,0x68, - 0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x69,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x61, - 0x73,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69, - 0x6B,0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69, - 0x6E,0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72, - 0x61,0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74, - 0x77,0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69, - 0x6E,0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E, - 0x20,0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70, - 0x65,0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30, - 0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74, - 0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C, - 0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40, - 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79, - 0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30, - 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C, - 0x73,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61, - 0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65, - 0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76, - 0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75, - 0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40, - 0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65, - 0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A, - 0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20, - 0x74,0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69, - 0x73,0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66, - 0x20,0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72, - 0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68, - 0x61,0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20, - 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20, - 0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75, - 0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61, - 0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20, - 0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74, - 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18, + 0x18,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, + 0x31,0x2D,0x62,0x69,0x74,0x20,0x64,0x69,0x74,0x68,0x65,0x72, + 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, + 0x32,0x21,0x57,0x6F,0x72,0x6B,0x73,0x20,0x66,0x6F,0x72,0x20, + 0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x61,0x75,0x64,0x69,0x6F, + 0x20,0x6D,0x6F,0x64,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x4E, + 0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x72,0x61,0x6E,0x64, + 0x6F,0x6D,0x20,0x73,0x63,0x61,0x6C,0x65,0x64,0x20,0x76,0x61, + 0x6C,0x75,0x65,0x73,0x20,0x74,0x6F,0x20,0x74,0x68,0x65,0x20, + 0x6D,0x69,0x78,0x65,0x64,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x73,0x20,0x62,0x65,0x66,0x6F,0x72,0x65,0x20,0x74,0x72,0x75, + 0x6E,0x63,0x61,0x74,0x69,0x6E,0x67,0x20,0x74,0x6F,0x20,0x31, + 0x36,0x2D,0x62,0x69,0x74,0x2E,0x46,0x54,0x68,0x69,0x73,0x20, + 0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x6F,0x72,0x79,0x20,0x6C,0x6F,0x77,0x65,0x72,0x20,0x74, + 0x68,0x65,0x20,0x71,0x75,0x61,0x6E,0x74,0x69,0x7A,0x61,0x74, + 0x69,0x6F,0x6E,0x20,0x6E,0x6F,0x69,0x73,0x65,0x2E,0x20,0x31, + 0x36,0x2D,0x62,0x69,0x74,0x20,0x61,0x6C,0x72,0x65,0x61,0x64, + 0x79,0x20,0x68,0x61,0x73,0x46,0x61,0x20,0x70,0x72,0x65,0x74, + 0x74,0x79,0x20,0x6C,0x6F,0x77,0x20,0x6E,0x6F,0x69,0x73,0x65, + 0x20,0x66,0x6C,0x6F,0x6F,0x72,0x2C,0x20,0x73,0x6F,0x20,0x64, + 0x6F,0x6E,0x27,0x74,0x20,0x65,0x78,0x70,0x65,0x63,0x74,0x20, + 0x61,0x6E,0x79,0x20,0x61,0x75,0x64,0x69,0x62,0x6C,0x65,0x20, + 0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x63,0x65,0x20,0x68, + 0x65,0x72,0x65,0x2E,0x1F,0x41,0x6C,0x73,0x6F,0x20,0x61,0x70, + 0x70,0x6C,0x69,0x65,0x73,0x20,0x66,0x6F,0x72,0x20,0x57,0x41, + 0x56,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x2E, + 0x00,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30, + 0x31,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x63,0x61,0x74,0x69, + 0x6F,0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, + 0x30,0x30,0x32,0x46,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x65, + 0x73,0x20,0x74,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65, + 0x20,0x77,0x68,0x65,0x6E,0x20,0x6D,0x69,0x78,0x69,0x6E,0x67, + 0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x65,0x74, + 0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x6E,0x65,0x20,0x74,0x6F, + 0x6F,0x20,0x68,0x69,0x67,0x68,0x2C,0x20,0x79,0x6F,0x75,0x27, + 0x6C,0x6C,0x3A,0x67,0x65,0x74,0x20,0x64,0x69,0x73,0x74,0x6F, + 0x72,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x33,0x32,0x58,0x20,0x65, + 0x71,0x75,0x61,0x6C,0x73,0x20,0x66,0x75,0x6C,0x6C,0x20,0x61, + 0x6D,0x70,0x6C,0x69,0x74,0x75,0x64,0x65,0x20,0x66,0x6F,0x72, + 0x20,0x6F,0x6E,0x65,0x20,0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C, + 0x2E,0x00,0x1B,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, + 0x30,0x31,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20, + 0x74,0x61,0x62,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, + 0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x54,0x68,0x65,0x20,0x6C, + 0x69,0x6E,0x65,0x61,0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65, + 0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x20,0x6D,0x61, + 0x6B,0x65,0x73,0x20,0x61,0x6C,0x6C,0x20,0x70,0x69,0x74,0x63, + 0x68,0x20,0x62,0x65,0x6E,0x64,0x73,0x20,0x72,0x75,0x6E,0x20, + 0x69,0x6E,0x20,0x63,0x6F,0x6E,0x73,0x74,0x61,0x6E,0x74,0x3F, + 0x73,0x70,0x65,0x65,0x64,0x2C,0x20,0x69,0x6E,0x64,0x65,0x70, + 0x65,0x6E,0x64,0x65,0x6E,0x74,0x20,0x6F,0x66,0x20,0x74,0x68, + 0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x66,0x72, + 0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,0x20, + 0x79,0x6F,0x75,0x20,0x73,0x77,0x69,0x74,0x63,0x68,0x20,0x74, + 0x68,0x69,0x73,0x41,0x6F,0x6E,0x65,0x2C,0x20,0x6F,0x6E,0x20, + 0x61,0x20,0x66,0x69,0x6E,0x69,0x73,0x68,0x65,0x64,0x20,0x73, + 0x6F,0x6E,0x67,0x2C,0x20,0x69,0x74,0x20,0x6D,0x69,0x67,0x68, + 0x74,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x73,0x74,0x72,0x61, + 0x6E,0x67,0x65,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x73, + 0x6F,0x75,0x6E,0x64,0x20,0x75,0x73,0x65,0x73,0x0D,0x70,0x6F, + 0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,0x65,0x73,0x2E,0x00, + 0x20,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43, + 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E, + 0x2C,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x3A,0x01,0x3E,0x29, 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50, - 0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A, - 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x43,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73, - 0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74, - 0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75, - 0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65, - 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75, - 0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69, - 0x73,0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73, - 0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20, - 0x6D,0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74, - 0x65,0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20, - 0x6F,0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69, - 0x64,0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79, - 0x2E,0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65, - 0x70,0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68, - 0x61,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73, - 0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79, - 0x2E,0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30, - 0x31,0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64, - 0x69,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73, - 0x3A,0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, - 0x43,0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73, - 0x74,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B, - 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37, - 0x54,0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20, - 0x69,0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20, - 0x63,0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74, - 0x69,0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72, - 0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74, - 0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65, - 0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70, - 0x61,0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E, - 0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73, - 0x20,0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72, - 0x2E,0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D, - 0x65,0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72, - 0x20,0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61, - 0x74,0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20, - 0x63,0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68, - 0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F, - 0x6C,0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E, - 0x61,0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65, - 0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68, - 0x69,0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20, - 0x6C,0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20, - 0x26,0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E, - 0x43,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79, - 0x2C,0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C, - 0x73,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74, - 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20, - 0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70, - 0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20, - 0x6D,0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20, - 0x61,0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73, - 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73, - 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F, - 0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B, - 0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45, - 0x3E,0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61, - 0x6E,0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49, - 0x66,0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C, - 0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74, - 0x69,0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20, - 0x6F,0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61, - 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D, - 0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C, - 0x20,0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61, - 0x20,0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E, - 0x75,0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01, - 0x3E,0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72, - 0x6B,0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74, - 0x69,0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72, - 0x6F,0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73, - 0x20,0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20, - 0x74,0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20, - 0x69,0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65, - 0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C, - 0x75,0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F, - 0x6C,0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E, - 0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61, - 0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B, - 0x69,0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73, - 0x61,0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20, - 0x61,0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61, - 0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63, - 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28, - 0x4D,0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F, - 0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F, - 0x6C,0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66, - 0x72,0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20, - 0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E, + 0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x61,0x79,0x6F,0x75, + 0x74,0x2C,0x20,0x68,0x65,0x78,0x20,0x6E,0x75,0x6D,0x62,0x65, + 0x72,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, + 0x40,0x43,0x30,0x30,0x32,0x41,0x49,0x66,0x20,0x79,0x6F,0x75, + 0x20,0x75,0x73,0x65,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E, + 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x61,0x72,0x65,0x20,0x6C, + 0x6F,0x6E,0x67,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x39, + 0x39,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2C,0x20,0x79,0x6F,0x75, + 0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x75,0x73,0x65,0x45, + 0x68,0x65,0x78,0x20,0x63,0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67, + 0x20,0x73,0x69,0x6E,0x63,0x65,0x20,0x74,0x68,0x65,0x72,0x65, + 0x20,0x61,0x72,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x32,0x20, + 0x64,0x69,0x67,0x69,0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65, + 0x72,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x2E,0x00,0x17,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x63, + 0x6F,0x70,0x65,0x20,0x73,0x74,0x79,0x6C,0x65,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x22, + 0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x22,0x20,0x77,0x69, + 0x6C,0x6C,0x20,0x73,0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20, + 0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x61,0x73,0x20, + 0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,0x6B,0x65, + 0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,0x6E,0x65, + 0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,0x61,0x77, + 0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,0x77,0x65, + 0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74, + 0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,0x20,0x6F, + 0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,0x65,0x2E, + 0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31, + 0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F, + 0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E, + 0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58,0x30, + 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,0x6E,0x63, + 0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, + 0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,0x73,0x20, + 0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20, + 0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20,0x56, + 0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,0x69,0x64, + 0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x72,0x20, + 0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,0x72,0x65, + 0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69, + 0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x28, + 0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,0x74,0x68, + 0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,0x73,0x20, + 0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,0x20,0x66, + 0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67, + 0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,0x61,0x76, + 0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69, + 0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,0x6E, + 0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,0x74,0x2F, + 0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,0x79,0x2C, + 0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,0x70,0x6F, + 0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,0x75,0x74, + 0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,0x3E,0x40, + 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x69,0x78, + 0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x41, + 0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,0x75,0x62, + 0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72, + 0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,0x73,0x65, + 0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x77, + 0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,0x70,0x73, + 0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,0x73,0x20, + 0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x66, + 0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F, + 0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x6C, + 0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F,0x75, + 0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,0x64,0x6E, + 0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x2E,0x20, + 0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70,0x20, + 0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61,0x74, + 0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6D, + 0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x6C, + 0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,0x00, + 0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x41, + 0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69,0x74, + 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20, + 0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, + 0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74,0x65, + 0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40, + 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54,0x68, + 0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69,0x73, + 0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63,0x6F, + 0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69,0x6E, + 0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74,0x73, + 0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65,0x2D, + 0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20,0x64, + 0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x61,0x72, + 0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,0x6F,0x74, + 0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,0x20,0x4E, + 0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,0x2E,0x20, + 0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x2C, + 0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,0x20,0x26, + 0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61, + 0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,0x63,0x61, + 0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,0x65,0x72, + 0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,0x6C,0x75, + 0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,0x61,0x62, + 0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x20,0x62, + 0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,0x69,0x63, + 0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x6C,0x65, + 0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,0x26,0x20, + 0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,0x43,0x20, + 0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,0x2C,0x20, + 0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20, + 0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20, + 0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x69,0x6E, 0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62, - 0x75,0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44, - 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D,0x65, + 0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61,0x6E, + 0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,0x77, + 0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x74, + 0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75,0x74, + 0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63,0x6F, + 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E,0x54, + 0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E,0x73, + 0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,0x20, + 0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64, + 0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69,0x6E, + 0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F,0x76, + 0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74,0x61, + 0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69,0x6E, + 0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x6F, + 0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20,0x6E, + 0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75,0x6D, + 0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E,0x40, + 0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B,0x73, + 0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69,0x6E, + 0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F,0x2D, + 0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x6D, + 0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74,0x68, + 0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69,0x73, + 0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64,0x20, + 0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75,0x6D, + 0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C,0x75, + 0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20,0x79, + 0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74,0x61, + 0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E, + 0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61,0x62, + 0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61,0x72, + 0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72,0x65, + 0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70, + 0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D,0x61, + 0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73,0x73, + 0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C,0x6C, + 0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6F, + 0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x6C,0x6F, + 0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,0x74,0x6F, + 0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,0x66, + 0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,0x4C,0x3B, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40, - 0x4C,0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41, - 0x51,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43, - 0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20, - 0x6D,0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72, - 0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72, - 0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65, - 0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65, - 0x6E,0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20, - 0x45,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65, - 0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E, - 0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D, - 0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73, - 0x2E,0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77, - 0x6F,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72, - 0x65,0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F, - 0x20,0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65, - 0x20,0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62, - 0x65,0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E, - 0x6F,0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30, - 0x32,0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20, - 0x49,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20, - 0x41,0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41, - 0x4C,0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30, - 0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A, - 0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65, - 0x20,0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70, - 0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74, - 0x61,0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E, - 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67, - 0x65,0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20, - 0x6B,0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20, - 0x69,0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69, - 0x6E,0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61, - 0x63,0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68, - 0x61,0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F, - 0x41,0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20, - 0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F, - 0x20,0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65, - 0x6C,0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F, - 0x72,0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E, - 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30, - 0x30,0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75, - 0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73, - 0x20,0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67, - 0x67,0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A, - 0x20,0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22, - 0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75, - 0x73,0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62, - 0x6C,0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69, - 0x67,0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E, - 0x4B,0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72, - 0x6E,0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F, - 0x75,0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65, - 0x20,0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22, - 0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D, - 0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65, - 0x6F,0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68, - 0x6F,0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73, - 0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65, - 0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65, - 0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65, - 0x20,0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61, - 0x63,0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D, - 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74, - 0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40, - 0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20, - 0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E, - 0x74,0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79, - 0x3F,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E, - 0x6F,0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68, - 0x69,0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64, - 0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20, - 0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F, - 0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E, - 0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30, - 0x33,0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64, - 0x69,0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69, - 0x7A,0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65, - 0x64,0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74, - 0x69,0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58, - 0x30,0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A, - 0x20,0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68, - 0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74, - 0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F, - 0x72,0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41, - 0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C, - 0x55,0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41, - 0x70,0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69, - 0x6E,0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65, - 0x5C,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58, - 0x30,0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73, - 0x65,0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62, - 0x72,0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61, - 0x74,0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74, - 0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46, - 0x54,0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C, - 0x69,0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F, - 0x55,0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67, - 0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46, - 0x54,0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20, - 0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72, - 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72, - 0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74, - 0x6F,0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70, - 0x61,0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74, - 0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66, - 0x20,0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65, - 0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69, - 0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64, - 0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74, - 0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74, - 0x68,0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20, - 0x6E,0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20, - 0x74,0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F, - 0x6E,0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F, - 0x72,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65, - 0x72,0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65, - 0x20,0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32, - 0x30,0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43, - 0x61,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65, - 0x20,0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46, - 0x47,0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20, - 0x46,0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63, - 0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43, - 0x30,0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69, - 0x74,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72, - 0x6B,0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E, - 0x20,0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79, - 0x20,0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65, - 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43, - 0x30,0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45, - 0x64,0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F, - 0x6F,0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20, - 0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61, - 0x6E,0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65, - 0x20,0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, - 0x20,0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30, - 0x30,0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73, - 0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69, - 0x73,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74, - 0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, - 0x20,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73, - 0x63,0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30, - 0x32,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20, - 0x49,0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75, - 0x67,0x21,0x4B,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20, - 0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20, - 0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x74,0x6F,0x20,0x6F,0x6C, - 0x61,0x76,0x2E,0x73,0x6F,0x72,0x65,0x6E,0x73,0x65,0x6E,0x40, - 0x6C,0x69,0x76,0x65,0x2E,0x6E,0x6F,0x20,0x61,0x6E,0x64,0x20, - 0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,0x61, - 0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,0x4C, - 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,0x4C,0x50, + 0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51,0x06, + 0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,0x30,0x30, + 0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,0x6D,0x61, + 0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65, + 0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,0x65,0x74, + 0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x77, + 0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x3F, + 0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x45,0x6E, + 0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,0x6C,0x20, + 0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,0x20,0x43, + 0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,0x73, + 0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,0x4D, + 0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,0x6F,0x6E, + 0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,0x65,0x74, + 0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,0x20,0x73, + 0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,0x20,0x69, + 0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,0x65,0x74, + 0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,0x6F,0x74, + 0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30, + 0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,0x20, + 0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,0x41,0x4C, + 0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,0x4C,0x54, + 0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,0x32,0x41, + 0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x49, + 0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,0x20,0x47, + 0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,0x65,0x72, + 0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,0x61,0x6C, + 0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,0x65, + 0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x2B, + 0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,0x6B,0x65, + 0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,0x69,0x6E, + 0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,0x67, + 0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,0x63,0x4F, + 0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,0x61,0x6E, + 0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,0x41,0x4C, + 0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,0x69,0x6E, + 0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,0x20,0x73, + 0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,0x6C,0x73, + 0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,0x72,0x20, + 0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,0x06,0x3E, + 0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,0x30,0x31, + 0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65, + 0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,0x20,0x64, + 0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,0x67,0x79, + 0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4D, + 0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,0x53,0x6F, + 0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65, + 0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,0x65, + 0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20, + 0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,0x4B,0x3E, + 0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,0x6E,0x61, + 0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,0x75,0x20, + 0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22, + 0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,0x20,0x69, + 0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20, + 0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75, + 0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,0x6F,0x77, + 0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,0x20,0x69, + 0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,0x74,0x75, + 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61, + 0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E,0x64, + 0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,0x20,0x69, + 0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63,0x74, + 0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E, + 0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,0x65,0x2E, + 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,0x43,0x30, + 0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,0x79,0x6F, + 0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20, + 0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,0x3F,0x4D, + 0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,0x6F,0x2C, + 0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,0x69,0x73, + 0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,0x69,0x66, + 0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x69,0x6D, + 0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,0x72,0x72, + 0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,0x20,0x68, + 0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,0x33,0x35, + 0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,0x69,0x6F, + 0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,0x7A,0x65, + 0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,0x64,0x20, + 0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,0x63, + 0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32, + 0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57, + 0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20, + 0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F, + 0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F,0x72,0x65, + 0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20, + 0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,0x55,0x73, + 0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,0x70,0x70, + 0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,0x6E,0x67, + 0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x5C,0x46, + 0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,0x30,0x33, + 0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,0x65,0x72, + 0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,0x72,0x61, + 0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,0x74,0x69, + 0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,0x2F,0x46, + 0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,0x32, + 0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E, + 0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,0x55,0x53, + 0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,0x2F,0x46, + 0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,0x32, + 0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,0x77,0x69, + 0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,0x64, + 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67, + 0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72, + 0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x74, + 0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,0x20,0x62, + 0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,0x20,0x79, + 0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x63, + 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E, + 0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72, + 0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,0x20,0x77, + 0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,0x68,0x61, + 0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,0x6E,0x6F, + 0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,0x74,0x6F, + 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,0x6E,0x66, + 0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,0x72,0x20, + 0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,0x72,0x2E, + 0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,0x20,0x6D, + 0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x42, + 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E, + 0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20,0x72, + 0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x20, + 0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,0x54, + 0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,0x65,0x20, + 0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,0x30,0x30, + 0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,0x74,0x20, + 0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,0x6B,0x20, + 0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,0x20,0x50, + 0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x73, + 0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x06, + 0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43,0x30,0x30, + 0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,0x64,0x2E, + 0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,0x6F,0x6D, + 0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,0x73,0x6F, + 0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,0x6E,0x27, + 0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,0x20,0x6C, + 0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70, + 0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,0x30,0x32, + 0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x6E, + 0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,0x73,0x20, + 0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,0x61,0x74, + 0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6E, + 0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,0x63,0x61, + 0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30, + 0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,0x20, + 0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,0x67,0x21, + 0x4B,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x50,0x6C, + 0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,0x61,0x20, + 0x6D,0x61,0x69,0x6C,0x20,0x74,0x6F,0x20,0x6F,0x6C,0x61,0x76, + 0x2E,0x73,0x6F,0x72,0x65,0x6E,0x73,0x65,0x6E,0x40,0x6C,0x69, + 0x76,0x65,0x2E,0x6E,0x6F,0x20,0x61,0x6E,0x64,0x20,0x74,0x72, + 0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,0x61,0x69,0x6E, + 0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,0x4C,0x3B,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,0x4C, - 0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,0x3E, - 0x40,0x58,0x30,0x31,0x30,0x14,0x3E,0x40,0x43,0x30,0x30,0x31, - 0x53,0x61,0x6D,0x70,0x6C,0x65,0x20,0x65,0x64,0x69,0x74,0x6F, - 0x72,0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,0x32,0x4E,0x3E,0x40, - 0x58,0x30,0x31,0x30,0x2D,0x20,0x57,0x68,0x65,0x6E,0x20,0x61, - 0x20,0x6C,0x6F,0x6F,0x70,0x65,0x64,0x20,0x73,0x61,0x6D,0x70, - 0x6C,0x65,0x20,0x69,0x73,0x20,0x7A,0x6F,0x6F,0x6D,0x65,0x64, - 0x20,0x6F,0x75,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20, - 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x65,0x64,0x69,0x74,0x6F, - 0x72,0x2C,0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x75,0x6C,0x64, - 0x20,0x73,0x65,0x65,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x75, - 0x6E,0x77,0x61,0x6E,0x74,0x65,0x64,0x20,0x73,0x61,0x6D,0x70, - 0x6C,0x65,0x20,0x64,0x61,0x74,0x61,0x20,0x61,0x74,0x20,0x74, - 0x68,0x65,0x20,0x6C,0x6F,0x6F,0x70,0x2D,0x65,0x6E,0x64,0x20, - 0x70,0x6F,0x69,0x6E,0x74,0x2E,0x20,0x54,0x68,0x69,0x73,0x20, - 0x69,0x73,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x6F, - 0x66,0x20,0x61,0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x4B,0x66, - 0x6F,0x72,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x73,0x61,0x6D, - 0x70,0x6C,0x69,0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72,0x70, - 0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x77, - 0x6F,0x72,0x6B,0x20,0x66,0x61,0x73,0x74,0x65,0x72,0x20,0x69, - 0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,0x6F,0x20, - 0x6D,0x69,0x78,0x65,0x72,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74, - 0x68,0x65,0x4B,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20, - 0x46,0x54,0x32,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20, - 0x73,0x61,0x6D,0x65,0x20,0x70,0x72,0x6F,0x62,0x6C,0x65,0x6D, - 0x2E,0x20,0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x6D,0x61,0x64, - 0x65,0x20,0x69,0x74,0x20,0x73,0x6F,0x20,0x74,0x68,0x61,0x74, - 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x7A,0x6F,0x6F,0x6D, - 0x20,0x69,0x6E,0x20,0x74,0x6F,0x3B,0x73,0x65,0x65,0x20,0x74, - 0x68,0x65,0x20,0x69,0x6E,0x64,0x69,0x76,0x69,0x64,0x75,0x61, - 0x6C,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,0x69, - 0x6E,0x74,0x73,0x2C,0x20,0x69,0x74,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x6C,0x69,0x6B,0x65,0x20,0x6E, - 0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31, - 0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73, - 0x65,0x20,0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64, - 0x3A,0x01,0x3E,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20, - 0x57,0x68,0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,0x68,0x6F,0x6C, - 0x64,0x20,0x64,0x6F,0x77,0x6E,0x20,0x61,0x20,0x6B,0x65,0x79, - 0x20,0x28,0x66,0x2E,0x65,0x78,0x2E,0x20,0x70,0x6C,0x61,0x79, - 0x69,0x6E,0x67,0x20,0x61,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, - 0x29,0x2C,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65, - 0x20,0x6D,0x6F,0x76,0x65,0x6D,0x65,0x6E,0x74,0x4A,0x3E,0x40, - 0x58,0x30,0x32,0x31,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x63, - 0x68,0x6F,0x70,0x70,0x79,0x2E,0x20,0x54,0x68,0x69,0x73,0x20, - 0x69,0x73,0x20,0x72,0x65,0x6C,0x61,0x74,0x65,0x64,0x20,0x74, - 0x6F,0x20,0x74,0x68,0x65,0x20,0x69,0x6E,0x70,0x75,0x74,0x20, - 0x71,0x75,0x65,0x75,0x65,0x20,0x62,0x65,0x69,0x6E,0x67,0x20, - 0x73,0x70,0x61,0x6D,0x6D,0x65,0x64,0x20,0x77,0x69,0x74,0x68, - 0x36,0x22,0x6B,0x65,0x79,0x20,0x64,0x6F,0x77,0x6E,0x22,0x20, - 0x65,0x76,0x65,0x6E,0x74,0x73,0x2C,0x20,0x64,0x65,0x6C,0x61, - 0x79,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75, - 0x73,0x65,0x20,0x70,0x6F,0x73,0x69,0x74,0x69,0x6F,0x6E,0x20, - 0x65,0x76,0x65,0x6E,0x74,0x73,0x2E,0x4E,0x49,0x20,0x6F,0x6E, - 0x6C,0x79,0x20,0x70,0x6F,0x6C,0x6C,0x20,0x69,0x6E,0x70,0x75, - 0x74,0x20,0x6F,0x6E,0x63,0x65,0x20,0x70,0x65,0x72,0x20,0x66, - 0x72,0x61,0x6D,0x65,0x20,0x28,0x36,0x30,0x48,0x7A,0x29,0x2C, - 0x20,0x73,0x6F,0x20,0x74,0x68,0x65,0x20,0x66,0x72,0x65,0x71, - 0x75,0x65,0x6E,0x63,0x79,0x20,0x69,0x73,0x20,0x61,0x20,0x74, - 0x61,0x64,0x20,0x6C,0x6F,0x77,0x2E,0x20,0x49,0x74,0x20,0x68, - 0x61,0x73,0x2E,0x74,0x6F,0x20,0x62,0x65,0x20,0x6C,0x69,0x6B, - 0x65,0x20,0x74,0x68,0x69,0x73,0x20,0x66,0x6F,0x72,0x20,0x73, - 0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x72,0x65,0x61,0x73,0x6F, - 0x6E,0x73,0x2C,0x20,0x74,0x68,0x6F,0x75,0x67,0x68,0x2E,0x2E, - 0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x47,0x3E,0x40,0x43, - 0x30,0x30,0x32,0x2D,0x20,0x6D,0x61,0x63,0x4F,0x53,0x20,0x2F, - 0x20,0x4F,0x53,0x20,0x58,0x3A,0x20,0x22,0x48,0x61,0x72,0x64, - 0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x64,0x65,0x22,0x20,0x6D, - 0x6F,0x75,0x73,0x65,0x20,0x6C,0x6F,0x6F,0x6B,0x73,0x20,0x62, - 0x6C,0x75,0x72,0x72,0x79,0x20,0x6F,0x6E,0x20,0x72,0x65,0x74, - 0x69,0x6E,0x61,0x20,0x4D,0x61,0x63,0x73,0x06,0x3E,0x40,0x58, - 0x30,0x31,0x30,0x48,0x3E,0x2D,0x20,0x6D,0x61,0x63,0x4F,0x53, - 0x20,0x2F,0x20,0x4F,0x53,0x20,0x58,0x3A,0x20,0x48,0x6F,0x6C, - 0x64,0x69,0x6E,0x67,0x20,0x64,0x6F,0x77,0x6E,0x20,0x61,0x20, - 0x6D,0x6F,0x75,0x73,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E, - 0x20,0x77,0x6F,0x6E,0x27,0x74,0x20,0x74,0x72,0x61,0x70,0x20, - 0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75, - 0x72,0x73,0x6F,0x72,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x69, - 0x6E,0x73,0x69,0x64,0x65,0x20,0x74,0x68,0x65,0x20,0x77,0x69, - 0x6E,0x64,0x6F,0x77,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69, - 0x73,0x20,0x72,0x65,0x6C,0x61,0x74,0x65,0x64,0x20,0x74,0x6F, - 0x20,0x61,0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x20,0x74,0x68, - 0x61,0x74,0x20,0x73,0x69,0x6D,0x70,0x6C,0x79,0x20,0x64,0x6F, - 0x65,0x73,0x6E,0x27,0x74,0x20,0x77,0x6F,0x72,0x6B,0x4F,0x76, - 0x65,0x72,0x79,0x20,0x77,0x65,0x6C,0x6C,0x20,0x69,0x6E,0x20, - 0x6D,0x61,0x63,0x4F,0x53,0x2E,0x20,0x54,0x68,0x65,0x20,0x6D, - 0x6F,0x75,0x73,0x65,0x20,0x6D,0x6F,0x76,0x65,0x6D,0x65,0x6E, - 0x74,0x20,0x77,0x6F,0x75,0x6C,0x64,0x20,0x66,0x72,0x65,0x65, - 0x7A,0x65,0x20,0x66,0x6F,0x72,0x20,0x73,0x6F,0x6D,0x65,0x20, - 0x74,0x69,0x6D,0x65,0x20,0x61,0x66,0x74,0x65,0x72,0x20,0x61, - 0x20,0x6D,0x6F,0x75,0x73,0x65,0x15,0x62,0x75,0x74,0x74,0x6F, - 0x6E,0x20,0x77,0x61,0x73,0x20,0x68,0x65,0x6C,0x64,0x20,0x64, - 0x6F,0x77,0x6E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x4B, - 0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x54,0x68,0x65,0x20, - 0x22,0x63,0x6C,0x65,0x61,0x72,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x22,0x20,0x73,0x68,0x6F,0x72,0x74,0x63,0x75,0x74,0x20, - 0x28,0x73,0x68,0x69,0x66,0x74,0x20,0x2B,0x20,0x6E,0x75,0x6D, - 0x2D,0x70,0x61,0x64,0x20,0x44,0x65,0x6C,0x2F,0x27,0x2C,0x27, - 0x29,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x77,0x6F,0x72,0x6B,0x73, - 0x20,0x69,0x66,0x37,0x3E,0x40,0x58,0x30,0x32,0x31,0x6E,0x75, - 0x6D,0x20,0x6C,0x6F,0x63,0x6B,0x20,0x69,0x73,0x20,0x6F,0x66, - 0x66,0x2E,0x20,0x54,0x68,0x65,0x72,0x65,0x27,0x73,0x20,0x6E, - 0x6F,0x20,0x77,0x61,0x79,0x20,0x49,0x20,0x63,0x61,0x6E,0x20, - 0x66,0x69,0x78,0x20,0x74,0x68,0x69,0x73,0x2E,0x2E,0x2E,0x06, - 0x3E,0x40,0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30, - 0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30, - 0x30,0x32,0x4A,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x54, - 0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x63,0x61, - 0x6E,0x20,0x6D,0x69,0x6C,0x64,0x6C,0x79,0x20,0x66,0x6C,0x69, - 0x63,0x6B,0x65,0x72,0x20,0x64,0x65,0x70,0x65,0x6E,0x64,0x69, - 0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x77,0x61, - 0x76,0x65,0x66,0x6F,0x72,0x6D,0x20,0x61,0x6E,0x64,0x20,0x70, - 0x69,0x74,0x63,0x68,0x2E,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31, - 0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x62,0x65,0x63,0x61, - 0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x69,0x72,0x20,0x66,0x72, - 0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x69,0x73,0x20,0x6E, - 0x6F,0x74,0x20,0x63,0x6C,0x6F,0x63,0x6B,0x65,0x64,0x20,0x74, - 0x6F,0x20,0x65,0x78,0x61,0x63,0x74,0x6C,0x79,0x20,0x74,0x68, - 0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x72,0x61,0x74,0x65,0x4D, - 0x3E,0x61,0x74,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x74,0x68, - 0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x61,0x72,0x65, - 0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x65,0x64,0x2E,0x20,0x49, - 0x74,0x27,0x73,0x20,0x63,0x6C,0x6F,0x73,0x65,0x2C,0x20,0x77, - 0x68,0x69,0x63,0x68,0x20,0x63,0x61,0x75,0x73,0x65,0x73,0x20, - 0x61,0x20,0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x65,0x66, - 0x66,0x65,0x63,0x74,0x2E,0x01,0x3E,0x52,0x3E,0x40,0x58,0x30, - 0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,0x20,0x61,0x20,0x62,0x75, - 0x67,0x2C,0x20,0x62,0x75,0x74,0x20,0x69,0x66,0x20,0x79,0x6F, - 0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73, - 0x20,0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74, - 0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74, - 0x20,0x74,0x6F,0x20,0x36,0x30,0x48,0x7A,0x20,0x28,0x6F,0x72, - 0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,0x3E,0x40,0x58,0x30,0x32, - 0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x65,0x78,0x70, - 0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x76,0x69,0x73,0x75, - 0x61,0x6C,0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E, - 0x67,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x56,0x53, - 0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6E,0x6F,0x74, - 0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x74,0x68,0x65, - 0x6E,0x2E,0x49,0x49,0x20,0x68,0x69,0x67,0x68,0x6C,0x79,0x20, - 0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x20,0x72,0x75, - 0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D, - 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61,0x74,0x20,0x36,0x30, - 0x48,0x7A,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x27,0x72,0x65, - 0x20,0x61,0x20,0x68,0x61,0x72,0x64,0x63,0x6F,0x72,0x65,0x20, - 0x75,0x73,0x65,0x72,0x10,0x6F,0x66,0x20,0x74,0x68,0x69,0x73, - 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,0x03,0x45, - 0x4E,0x44 + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,0x4C,0x4B,0x6E, + 0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,0x3E,0x40,0x58, + 0x30,0x31,0x30,0x14,0x3E,0x40,0x43,0x30,0x30,0x31,0x53,0x61, + 0x6D,0x70,0x6C,0x65,0x20,0x65,0x64,0x69,0x74,0x6F,0x72,0x3A, + 0x06,0x3E,0x40,0x43,0x30,0x30,0x32,0x4E,0x3E,0x40,0x58,0x30, + 0x31,0x30,0x2D,0x20,0x57,0x68,0x65,0x6E,0x20,0x61,0x20,0x6C, + 0x6F,0x6F,0x70,0x65,0x64,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x69,0x73,0x20,0x7A,0x6F,0x6F,0x6D,0x65,0x64,0x20,0x6F, + 0x75,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x73,0x61, + 0x6D,0x70,0x6C,0x65,0x20,0x65,0x64,0x69,0x74,0x6F,0x72,0x2C, + 0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x75,0x6C,0x64,0x20,0x73, + 0x65,0x65,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x75,0x6E,0x77, + 0x61,0x6E,0x74,0x65,0x64,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x64,0x61,0x74,0x61,0x20,0x61,0x74,0x20,0x74,0x68,0x65, + 0x20,0x6C,0x6F,0x6F,0x70,0x2D,0x65,0x6E,0x64,0x20,0x70,0x6F, + 0x69,0x6E,0x74,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73, + 0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x6F,0x66,0x20, + 0x61,0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x4B,0x66,0x6F,0x72, + 0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x73,0x61,0x6D,0x70,0x6C, + 0x69,0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C, + 0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x77,0x6F,0x72, + 0x6B,0x20,0x66,0x61,0x73,0x74,0x65,0x72,0x20,0x69,0x6E,0x20, + 0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x6D,0x69, + 0x78,0x65,0x72,0x2C,0x20,0x61,0x6E,0x64,0x20,0x74,0x68,0x65, + 0x4B,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54, + 0x32,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x73,0x61, + 0x6D,0x65,0x20,0x70,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x2E,0x20, + 0x49,0x20,0x68,0x61,0x76,0x65,0x20,0x6D,0x61,0x64,0x65,0x20, + 0x69,0x74,0x20,0x73,0x6F,0x20,0x74,0x68,0x61,0x74,0x20,0x69, + 0x66,0x20,0x79,0x6F,0x75,0x20,0x7A,0x6F,0x6F,0x6D,0x20,0x69, + 0x6E,0x20,0x74,0x6F,0x3B,0x73,0x65,0x65,0x20,0x74,0x68,0x65, + 0x20,0x69,0x6E,0x64,0x69,0x76,0x69,0x64,0x75,0x61,0x6C,0x20, + 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74, + 0x73,0x2C,0x20,0x69,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6C, + 0x6F,0x6F,0x6B,0x20,0x6C,0x69,0x6B,0x65,0x20,0x6E,0x6F,0x72, + 0x6D,0x61,0x6C,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x17, + 0x3E,0x40,0x43,0x30,0x30,0x31,0x4D,0x6F,0x75,0x73,0x65,0x20, + 0x2F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A,0x01, + 0x3E,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x57,0x68, + 0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,0x68,0x6F,0x6C,0x64,0x20, + 0x64,0x6F,0x77,0x6E,0x20,0x61,0x20,0x6B,0x65,0x79,0x20,0x28, + 0x66,0x2E,0x65,0x78,0x2E,0x20,0x70,0x6C,0x61,0x79,0x69,0x6E, + 0x67,0x20,0x61,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x29,0x2C, + 0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x6D, + 0x6F,0x76,0x65,0x6D,0x65,0x6E,0x74,0x4A,0x3E,0x40,0x58,0x30, + 0x32,0x31,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x63,0x68,0x6F, + 0x70,0x70,0x79,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73, + 0x20,0x72,0x65,0x6C,0x61,0x74,0x65,0x64,0x20,0x74,0x6F,0x20, + 0x74,0x68,0x65,0x20,0x69,0x6E,0x70,0x75,0x74,0x20,0x71,0x75, + 0x65,0x75,0x65,0x20,0x62,0x65,0x69,0x6E,0x67,0x20,0x73,0x70, + 0x61,0x6D,0x6D,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x36,0x22, + 0x6B,0x65,0x79,0x20,0x64,0x6F,0x77,0x6E,0x22,0x20,0x65,0x76, + 0x65,0x6E,0x74,0x73,0x2C,0x20,0x64,0x65,0x6C,0x61,0x79,0x69, + 0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65, + 0x20,0x70,0x6F,0x73,0x69,0x74,0x69,0x6F,0x6E,0x20,0x65,0x76, + 0x65,0x6E,0x74,0x73,0x2E,0x4E,0x49,0x20,0x6F,0x6E,0x6C,0x79, + 0x20,0x70,0x6F,0x6C,0x6C,0x20,0x69,0x6E,0x70,0x75,0x74,0x20, + 0x6F,0x6E,0x63,0x65,0x20,0x70,0x65,0x72,0x20,0x66,0x72,0x61, + 0x6D,0x65,0x20,0x28,0x36,0x30,0x48,0x7A,0x29,0x2C,0x20,0x73, + 0x6F,0x20,0x74,0x68,0x65,0x20,0x66,0x72,0x65,0x71,0x75,0x65, + 0x6E,0x63,0x79,0x20,0x69,0x73,0x20,0x61,0x20,0x74,0x61,0x64, + 0x20,0x6C,0x6F,0x77,0x2E,0x20,0x49,0x74,0x20,0x68,0x61,0x73, + 0x2E,0x74,0x6F,0x20,0x62,0x65,0x20,0x6C,0x69,0x6B,0x65,0x20, + 0x74,0x68,0x69,0x73,0x20,0x66,0x6F,0x72,0x20,0x73,0x65,0x76, + 0x65,0x72,0x61,0x6C,0x20,0x72,0x65,0x61,0x73,0x6F,0x6E,0x73, + 0x2C,0x20,0x74,0x68,0x6F,0x75,0x67,0x68,0x2E,0x2E,0x2E,0x06, + 0x3E,0x40,0x58,0x30,0x31,0x30,0x47,0x3E,0x40,0x43,0x30,0x30, + 0x32,0x2D,0x20,0x6D,0x61,0x63,0x4F,0x53,0x20,0x2F,0x20,0x4F, + 0x53,0x20,0x58,0x3A,0x20,0x22,0x48,0x61,0x72,0x64,0x77,0x61, + 0x72,0x65,0x20,0x6D,0x6F,0x64,0x65,0x22,0x20,0x6D,0x6F,0x75, + 0x73,0x65,0x20,0x6C,0x6F,0x6F,0x6B,0x73,0x20,0x62,0x6C,0x75, + 0x72,0x72,0x79,0x20,0x6F,0x6E,0x20,0x72,0x65,0x74,0x69,0x6E, + 0x61,0x20,0x4D,0x61,0x63,0x73,0x06,0x3E,0x40,0x58,0x30,0x31, + 0x30,0x48,0x3E,0x2D,0x20,0x6D,0x61,0x63,0x4F,0x53,0x20,0x2F, + 0x20,0x4F,0x53,0x20,0x58,0x3A,0x20,0x48,0x6F,0x6C,0x64,0x69, + 0x6E,0x67,0x20,0x64,0x6F,0x77,0x6E,0x20,0x61,0x20,0x6D,0x6F, + 0x75,0x73,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x77, + 0x6F,0x6E,0x27,0x74,0x20,0x74,0x72,0x61,0x70,0x20,0x74,0x68, + 0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73, + 0x6F,0x72,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x69,0x6E,0x73, + 0x69,0x64,0x65,0x20,0x74,0x68,0x65,0x20,0x77,0x69,0x6E,0x64, + 0x6F,0x77,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20, + 0x72,0x65,0x6C,0x61,0x74,0x65,0x64,0x20,0x74,0x6F,0x20,0x61, + 0x20,0x6B,0x6C,0x75,0x64,0x67,0x65,0x20,0x74,0x68,0x61,0x74, + 0x20,0x73,0x69,0x6D,0x70,0x6C,0x79,0x20,0x64,0x6F,0x65,0x73, + 0x6E,0x27,0x74,0x20,0x77,0x6F,0x72,0x6B,0x4F,0x76,0x65,0x72, + 0x79,0x20,0x77,0x65,0x6C,0x6C,0x20,0x69,0x6E,0x20,0x6D,0x61, + 0x63,0x4F,0x53,0x2E,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75, + 0x73,0x65,0x20,0x6D,0x6F,0x76,0x65,0x6D,0x65,0x6E,0x74,0x20, + 0x77,0x6F,0x75,0x6C,0x64,0x20,0x66,0x72,0x65,0x65,0x7A,0x65, + 0x20,0x66,0x6F,0x72,0x20,0x73,0x6F,0x6D,0x65,0x20,0x74,0x69, + 0x6D,0x65,0x20,0x61,0x66,0x74,0x65,0x72,0x20,0x61,0x20,0x6D, + 0x6F,0x75,0x73,0x65,0x15,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20, + 0x77,0x61,0x73,0x20,0x68,0x65,0x6C,0x64,0x20,0x64,0x6F,0x77, + 0x6E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x4B,0x3E,0x40, + 0x43,0x30,0x30,0x32,0x2D,0x20,0x54,0x68,0x65,0x20,0x22,0x63, + 0x6C,0x65,0x61,0x72,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x22, + 0x20,0x73,0x68,0x6F,0x72,0x74,0x63,0x75,0x74,0x20,0x28,0x73, + 0x68,0x69,0x66,0x74,0x20,0x2B,0x20,0x6E,0x75,0x6D,0x2D,0x70, + 0x61,0x64,0x20,0x44,0x65,0x6C,0x2F,0x27,0x2C,0x27,0x29,0x20, + 0x6F,0x6E,0x6C,0x79,0x20,0x77,0x6F,0x72,0x6B,0x73,0x20,0x69, + 0x66,0x37,0x3E,0x40,0x58,0x30,0x32,0x31,0x6E,0x75,0x6D,0x20, + 0x6C,0x6F,0x63,0x6B,0x20,0x69,0x73,0x20,0x6F,0x66,0x66,0x2E, + 0x20,0x54,0x68,0x65,0x72,0x65,0x27,0x73,0x20,0x6E,0x6F,0x20, + 0x77,0x61,0x79,0x20,0x49,0x20,0x63,0x61,0x6E,0x20,0x66,0x69, + 0x78,0x20,0x74,0x68,0x69,0x73,0x2E,0x2E,0x2E,0x06,0x3E,0x40, + 0x58,0x30,0x31,0x30,0x0C,0x3E,0x40,0x43,0x30,0x30,0x31,0x56, + 0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,0x32, + 0x4A,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x54,0x68,0x65, + 0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x63,0x61,0x6E,0x20, + 0x6D,0x69,0x6C,0x64,0x6C,0x79,0x20,0x66,0x6C,0x69,0x63,0x6B, + 0x65,0x72,0x20,0x64,0x65,0x70,0x65,0x6E,0x64,0x69,0x6E,0x67, + 0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x77,0x61,0x76,0x65, + 0x66,0x6F,0x72,0x6D,0x20,0x61,0x6E,0x64,0x20,0x70,0x69,0x74, + 0x63,0x68,0x2E,0x4D,0x3E,0x40,0x58,0x30,0x32,0x31,0x54,0x68, + 0x69,0x73,0x20,0x69,0x73,0x20,0x62,0x65,0x63,0x61,0x75,0x73, + 0x65,0x20,0x74,0x68,0x65,0x69,0x72,0x20,0x66,0x72,0x65,0x71, + 0x75,0x65,0x6E,0x63,0x79,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74, + 0x20,0x63,0x6C,0x6F,0x63,0x6B,0x65,0x64,0x20,0x74,0x6F,0x20, + 0x65,0x78,0x61,0x63,0x74,0x6C,0x79,0x20,0x74,0x68,0x65,0x20, + 0x73,0x61,0x6D,0x65,0x20,0x72,0x61,0x74,0x65,0x4D,0x3E,0x61, + 0x74,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x74,0x68,0x65,0x20, + 0x73,0x63,0x6F,0x70,0x65,0x73,0x20,0x61,0x72,0x65,0x20,0x72, + 0x65,0x6E,0x64,0x65,0x72,0x65,0x64,0x2E,0x20,0x49,0x74,0x27, + 0x73,0x20,0x63,0x6C,0x6F,0x73,0x65,0x2C,0x20,0x77,0x68,0x69, + 0x63,0x68,0x20,0x63,0x61,0x75,0x73,0x65,0x73,0x20,0x61,0x20, + 0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x65,0x66,0x66,0x65, + 0x63,0x74,0x2E,0x01,0x3E,0x52,0x3E,0x40,0x58,0x30,0x31,0x30, + 0x2D,0x20,0x4E,0x6F,0x74,0x20,0x61,0x20,0x62,0x75,0x67,0x2C, + 0x20,0x62,0x75,0x74,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x72, + 0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72, + 0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20, + 0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x74, + 0x6F,0x20,0x36,0x30,0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35, + 0x39,0x48,0x7A,0x29,0x4F,0x3E,0x40,0x58,0x30,0x32,0x31,0x79, + 0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x65,0x78,0x70,0x65,0x72, + 0x69,0x65,0x6E,0x63,0x65,0x20,0x76,0x69,0x73,0x75,0x61,0x6C, + 0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20, + 0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E, + 0x63,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62, + 0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x74,0x68,0x65,0x6E,0x2E, + 0x49,0x49,0x20,0x68,0x69,0x67,0x68,0x6C,0x79,0x20,0x72,0x65, + 0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x20,0x72,0x75,0x6E,0x6E, + 0x69,0x6E,0x67,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E, + 0x69,0x74,0x6F,0x72,0x20,0x61,0x74,0x20,0x36,0x30,0x48,0x7A, + 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x27,0x72,0x65,0x20,0x61, + 0x20,0x68,0x61,0x72,0x64,0x63,0x6F,0x72,0x65,0x20,0x75,0x73, + 0x65,0x72,0x10,0x6F,0x66,0x20,0x74,0x68,0x69,0x73,0x20,0x70, + 0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,0x03,0x45,0x4E,0x44 }; #endif