From 9c56c3d01b8e4d83bc4abe8d105ecda1d4774066 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 14:32:47 +0900 Subject: [PATCH 01/27] [WIP] K063260 skeleton --- CMakeLists.txt | 1 + .../vgsound_emu/src/k053260/k053260.cpp | 101 ++-- .../vgsound_emu/src/k053260/k053260.hpp | 73 ++- src/engine/dispatchContainer.cpp | 4 + src/engine/instrument.cpp | 4 + src/engine/instrument.h | 1 + src/engine/platform/k053260.cpp | 475 ++++++++++++++++++ src/engine/platform/k053260.h | 96 ++++ src/engine/song.h | 3 +- src/engine/sysDef.cpp | 10 + src/engine/vgmOps.cpp | 42 +- src/gui/dataList.cpp | 4 + src/gui/debug.cpp | 20 + src/gui/doAction.cpp | 3 +- src/gui/gui.h | 1 + src/gui/guiConst.cpp | 4 + src/gui/insEdit.cpp | 17 +- src/gui/presets.cpp | 41 ++ src/gui/settings.cpp | 1 + src/gui/sysConf.cpp | 20 + 20 files changed, 837 insertions(+), 84 deletions(-) create mode 100644 src/engine/platform/k053260.cpp create mode 100644 src/engine/platform/k053260.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 78a68aa8..7105990b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -551,6 +551,7 @@ src/engine/platform/k007232.cpp src/engine/platform/ga20.cpp src/engine/platform/sm8521.cpp src/engine/platform/pv1000.cpp +src/engine/platform/k053260.cpp src/engine/platform/pcmdac.cpp src/engine/platform/dummy.cpp diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp index bf056b81..2ee4efac 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp @@ -8,18 +8,19 @@ #include "k053260.hpp" -void k053260_core::tick() +void k053260_core::tick(u32 cycle) { m_out[0] = m_out[1] = 0; if (m_ctrl.sound_en()) { for (int i = 0; i < 4; i++) { - m_voice[i].tick(); + m_voice[i].tick(cycle); m_out[0] += m_voice[i].out(0); m_out[1] += m_voice[i].out(1); } } + /* // dac clock (YM3012 format) u8 dac_clock = m_dac.clock(); if (bitfield(++dac_clock, 0, 4) == 0) @@ -34,62 +35,59 @@ void k053260_core::tick() m_dac.set_state(bitfield(dac_state, 0, 2)); } m_dac.set_clock(bitfield(dac_clock, 0, 4)); + */ } -void k053260_core::voice_t::tick() +void k053260_core::voice_t::tick(u32 cycle) { if (m_enable && m_busy) { bool update = false; // update counter - if (bitfield(++m_counter, 0, 12) == 0) + m_counter += cycle; + if (m_counter >= 0x1000) { if (m_bitpos < 8) { m_bitpos += 8; m_addr = bitfield(m_addr + 1, 0, 21); m_remain--; + if (m_remain < 0) // check end flag + { + if (m_loop) + { + m_addr = m_start; + m_remain = m_length; + m_output = 0; + } + else + { + m_busy = false; + } + } } + m_data = m_host.m_intf.read_sample(bitfield(m_addr, 0, 21)); // fetch ROM if (m_adpcm) { - m_bitpos -= 4; - update = true; + m_bitpos -= 4; + const u8 nibble = bitfield(m_data, m_bitpos & 4, 4); // get nibble from ROM + if (nibble) + { + m_output += m_host.adpcm_lut(nibble); + } } else { m_bitpos -= 8; } - m_counter = bitfield(m_pitch, 0, 12); - } - m_data = m_host.m_intf.read_sample(bitfield(m_addr, 0, 21)); // fetch ROM - if (update) - { - const u8 nibble = bitfield(m_data, m_bitpos & 4, 4); // get nibble from ROM - if (nibble) - { - m_adpcm_buf += bitfield(nibble, 3) ? s8(0x80 >> bitfield(nibble, 0, 3)) - : (1 << bitfield(nibble - 1, 0, 3)); - } + m_counter = 0x1000 - bitfield(m_pitch, 0, 12); } - if (m_remain < 0) // check end flag - { - if (m_loop) - { - m_addr = m_start; - m_remain = m_length; - m_adpcm_buf = 0; - } - else - { - m_busy = false; - } - } // calculate output - s32 output = m_adpcm ? m_adpcm_buf : sign_ext(m_data, 8) * s32(m_volume); + s32 output = (m_adpcm ? m_output : sign_ext(m_data, 8)) * s32(m_volume); // use math for now; actually fomula unknown - m_out[0] = (m_pan >= 0) ? s32(output * cos(f64(m_pan) * PI / 180)) : 0; - m_out[1] = (m_pan >= 0) ? s32(output * sin(f64(m_pan) * PI / 180)) : 0; + m_out[0] = (output * m_host.pan_lut(m_pan, 0)) >> 7; + m_out[1] = (output * m_host.pan_lut(m_pan, 1)) >> 7; } else { @@ -244,7 +242,8 @@ void k053260_core::voice_t::keyon() m_addr = m_start; m_remain = m_length; m_bitpos = 4; - m_adpcm_buf = 0; + m_data = 0; + m_output = 0; std::fill(m_out.begin(), m_out.end(), 0); } @@ -259,12 +258,12 @@ void k053260_core::reset() elem.reset(); } - m_intf.write_int(0); + //m_intf.write_int(0); std::fill(m_host2snd.begin(), m_host2snd.end(), 0); std::fill(m_snd2host.begin(), m_snd2host.end(), 0); m_ctrl.reset(); - m_dac.reset(); + //m_dac.reset(); std::fill(m_reg.begin(), m_reg.end(), 0); std::fill(m_out.begin(), m_out.end(), 0); @@ -273,20 +272,20 @@ void k053260_core::reset() // reset voice void k053260_core::voice_t::reset() { - m_enable = 0; - m_busy = 0; - m_loop = 0; - m_adpcm = 0; - m_pitch = 0; - m_start = 0; - m_length = 0; - m_volume = 0; - m_pan = -1; - m_counter = 0; - m_addr = 0; - m_remain = 0; - m_bitpos = 4; - m_data = 0; - m_adpcm_buf = 0; + m_enable = 0; + m_busy = 0; + m_loop = 0; + m_adpcm = 0; + m_pitch = 0; + m_start = 0; + m_length = 0; + m_volume = 0; + m_pan = 4; + m_counter = 0; + m_addr = 0; + m_remain = 0; + m_bitpos = 4; + m_data = 0; + m_output = 0; m_out[0] = m_out[1] = 0; } diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp index a8668a0d..feaffeac 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp @@ -25,7 +25,7 @@ class k053260_intf : public vgsound_emu_core virtual u8 read_sample(u32 address) { return 0; } // sample fetch - virtual void write_int(u8 out) {} // timer interrupt + //virtual void write_int(u8 out) {} // timer interrupt }; class k053260_core : public vgsound_emu_core @@ -33,7 +33,19 @@ class k053260_core : public vgsound_emu_core friend class k053260_intf; // k053260 specific interface private: - const int pan_dir[8] = {-1, 0, 24, 35, 45, 55, 66, 90}; // pan direction + const s32 m_pan_lut[8][2] = { + {0x00, 0x00}, + {0x7f, 0x00}, + {0x74, 0x34}, + {0x68, 0x49}, + {0x5a, 0x5a}, + {0x49, 0x68}, + {0x34, 0x74}, + {0x00, 0x7f} + }; // pan LUT + + const s8 m_adpcm_lut[16] = + {0, 1, 2, 4, 8, 16, 32, 64, -128, -64, -32, -16, -8, -4, -2, -1}; // ADPCM LUT class voice_t : public vgsound_emu_core { @@ -50,20 +62,20 @@ class k053260_core : public vgsound_emu_core , m_start(0) , m_length(0) , m_volume(0) - , m_pan(-1) + , m_pan(4) , m_counter(0) , m_addr(0) , m_remain(0) , m_bitpos(4) , m_data(0) - , m_adpcm_buf(0) + , m_output(0) { m_out.fill(0); } // internal state void reset(); - void tick(); + void tick(u32 cycle); // accessors void write(u8 address, u8 data); @@ -81,7 +93,7 @@ class k053260_core : public vgsound_emu_core inline void length_inc() { m_length = (m_length + 1) & 0xffff; } - inline void set_pan(u8 pan) { m_pan = m_host.pan_dir[pan & 7]; } + inline void set_pan(u8 pan) { m_pan = pan & 7; } // getters inline bool enable() { return m_enable; } @@ -97,21 +109,21 @@ class k053260_core : public vgsound_emu_core private: // registers k053260_core &m_host; - u16 m_enable : 1; // enable flag - u16 m_busy : 1; // busy status - u16 m_loop : 1; // loop flag - u16 m_adpcm : 1; // ADPCM flag - u16 m_pitch : 12; // pitch - u32 m_start = 0; // start position - u16 m_length = 0; // source length - u8 m_volume = 0; // master volume - int m_pan = -1; // master pan - u16 m_counter = 0; // frequency counter - u32 m_addr = 0; // current address - s32 m_remain = 0; // remain for end sample - u8 m_bitpos = 4; // bit position for ADPCM decoding - u8 m_data = 0; // current data - s8 m_adpcm_buf = 0; // ADPCM buffer + u16 m_enable : 1; // enable flag + u16 m_busy : 1; // busy status + u16 m_loop : 1; // loop flag + u16 m_adpcm : 1; // ADPCM flag + u16 m_pitch : 12; // pitch + u32 m_start = 0; // start position + u16 m_length = 0; // source length + u8 m_volume = 0; // master volume + int m_pan = -1; // master pan + u16 m_counter = 0; // frequency counter + u32 m_addr = 0; // current address + s32 m_remain = 0; // remain for end sample + u8 m_bitpos = 4; // bit position for ADPCM decoding + u8 m_data = 0; // current data + s8 m_output = 0; // ADPCM buffer std::array m_out; // current output }; @@ -152,6 +164,7 @@ class k053260_core : public vgsound_emu_core u8 m_input_en : 2; // Input enable }; + /* class ym3012_t { public: @@ -177,7 +190,9 @@ class k053260_core : public vgsound_emu_core std::array m_in; std::array m_out; }; + */ + /* class dac_t { public: @@ -205,6 +220,7 @@ class k053260_core : public vgsound_emu_core u8 m_clock : 4; // DAC clock (16 clock) u8 m_state : 2; // DAC state (4 state - SAM1, SAM2) }; + */ public: // constructor @@ -213,8 +229,8 @@ class k053260_core : public vgsound_emu_core , m_voice{*this, *this, *this, *this} , m_intf(intf) , m_ctrl(ctrl_t()) - , m_ym3012(ym3012_t()) - , m_dac(dac_t()) + //, m_ym3012(ym3012_t()) + //, m_dac(dac_t()) { m_host2snd.fill(0); m_snd2host.fill(0); @@ -233,7 +249,7 @@ class k053260_core : public vgsound_emu_core // internal state void reset(); - void tick(); + void tick(u32 cycle); // getters for debug, trackers, etc inline s32 output(u8 ch) { return m_out[ch & 1]; } // output for each channels @@ -245,6 +261,11 @@ class k053260_core : public vgsound_emu_core return (voice < 4) ? m_voice[voice].out(ch & 1) : 0; } + protected: + inline s32 pan_lut(const u8 pan, const u8 out) { return m_pan_lut[pan][out]; } + + inline s32 adpcm_lut(const u8 nibble) { return m_adpcm_lut[nibble]; } + private: std::array m_voice; k053260_intf &m_intf; // common memory interface @@ -254,8 +275,8 @@ class k053260_core : public vgsound_emu_core ctrl_t m_ctrl; // chip control - ym3012_t m_ym3012; // YM3012 output - dac_t m_dac; // YM3012 interface + //ym3012_t m_ym3012; // YM3012 output + //dac_t m_dac; // YM3012 interface std::array m_reg; // register pool std::array m_out; // stereo output diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index c30d7f23..319630d6 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -78,6 +78,7 @@ #include "platform/ga20.h" #include "platform/sm8521.h" #include "platform/pv1000.h" +#include "platform/k053260.h" #include "platform/pcmdac.h" #include "platform/dummy.h" #include "../ta-log.h" @@ -501,6 +502,9 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do case DIV_SYSTEM_PV1000: dispatch=new DivPlatformPV1000; break; + case DIV_SYSTEM_K053260: + dispatch=new DivPlatformK053260; + break; case DIV_SYSTEM_PCM_DAC: dispatch=new DivPlatformPCMDAC; break; diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index faa9f86c..c51805ab 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -930,6 +930,10 @@ void DivInstrument::putInsData2(SafeWriter* w, bool fui, const DivSong* song) { break; case DIV_INS_PV1000: break; + case DIV_INS_K053260: + featureSM=true; + featureSL=true; + break; case DIV_INS_MAX: break; diff --git a/src/engine/instrument.h b/src/engine/instrument.h index c53688ec..932d44ff 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -80,6 +80,7 @@ enum DivInstrumentType: unsigned short { DIV_INS_POKEMINI=47, DIV_INS_SM8521=48, DIV_INS_PV1000=49, + DIV_INS_K053260=50, DIV_INS_MAX, DIV_INS_NULL }; diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp new file mode 100644 index 00000000..47e7636d --- /dev/null +++ b/src/engine/platform/k053260.cpp @@ -0,0 +1,475 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "k053260.h" +#include "../engine.h" +#include "../../ta-log.h" +#include + +#define rWrite(a,v) {if(!skipRegisterWrites) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} + +#define CHIP_DIVIDER 64 +#define TICK_DIVIDER 4 + +const char* regCheatSheetK053260[]={ + "FreqL", "0", + "FreqH", "1", + "LengthL", "2", + "LengthH", "3", + "StartL", "4", + "StartM", "5", + "StartH", "6", + "Volume", "7", + NULL +}; + +const char** DivPlatformK053260::getRegisterSheet() { + return regCheatSheetK053260; +} + +inline void DivPlatformK053260::chWrite(unsigned char ch, unsigned int addr, unsigned char val) { + if (!skipRegisterWrites) { + rWrite(8+((ch<<3)|(addr&7)),val); + } +} + +// TODO: this code is weird +// make sure newDispatch didn't break it up +void DivPlatformK053260::acquire(short** buf, size_t len) { + for (int i=0; i32767) lout=32767; + if (lout<-32768) lout=-32768; + if (rout>32767) rout=32767; + if (rout<-32768) rout=-32768; + buf[0][i]=lout; + buf[1][i]=rout; + + for (int i=0; i<4; i++) { + oscBuf[i]->data[oscBuf[i]->needle++]=(k053260.voice_out(i,0)+k053260.voice_out(i,1))>>1; + } + } +} + +void DivPlatformK053260::tick(bool sysTick) { + unsigned char panMask=0; + for (int i=0; i<4; i++) { + chan[i].std.next(); + if (chan[i].std.vol.had) { + chan[i].outVol=((chan[i].vol&0x7f)*MIN(chan[i].macroVolMul,chan[i].std.vol.val))/chan[i].macroVolMul; + chWrite(i,7,chan[i].outVol); + } + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { + if (!chan[i].inPorta) { + chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); + } + chan[i].freqChanged=true; + } + if (chan[i].std.pitch.had) { + if (chan[i].std.pitch.mode) { + chan[i].pitch2+=chan[i].std.pitch.val; + CLAMP_VAR(chan[i].pitch2,-32768,32767); + } else { + chan[i].pitch2=chan[i].std.pitch.val; + } + chan[i].freqChanged=true; + } + if (chan[i].std.panL.had) { // panning + chan[i].panning=4+chan[i].std.panL.val; + if (!isMuted[i]) { + panMask|=1<=0 && samplesong.sampleLen) { + DivSample* s=parent->getSample(sample); + if (s->centerRate<1) { + off=1.0; + } else { + off=8363.0/s->centerRate; + } + } + DivSample* s=parent->getSample(chan[i].sample); + chan[i].freq=0x1000-(int)(off*parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER)); + if (chan[i].freq>4095) chan[i].freq=4095; + if (chan[i].freq<0) chan[i].freq=0; + if (chan[i].keyOn) { + unsigned int start=0; + unsigned int length=0; + if (chan[i].sample>=0 && chan[i].samplesong.sampleLen) { + start=sampleOffK053260[chan[i].sample]; + length=start+s->length8; + } + if (chan[i].audPos>0) { + start=start+MIN(chan[i].audPos,s->length8); + } + start=MIN(start,getSampleMemCapacity()-31); + length=MIN(length,getSampleMemCapacity()-31); + rWrite(0x28,keyoff); // force keyoff first + rWrite(0x2a,loopoff); + chWrite(i,2,length&0xff); + chWrite(i,3,length>>8); + chWrite(i,4,start&0xff); + chWrite(i,5,start>>8); + chWrite(i,6,start>>16); + if (!chan[i].std.vol.had) { + chan[i].outVol=chan[i].vol; + chWrite(i,7,chan[i].outVol); + } + rWrite(0x28,keyon); + if (s->isLoopable()) { + rWrite(0x2a,loopon); + } + chan[i].keyOn=false; + } + if (chan[i].keyOff) { + rWrite(0x28,keyoff); + rWrite(0x2a,loopoff); + chan[i].keyOff=false; + } + if (chan[i].freqChanged) { + chWrite(i,0,chan[i].freq&0xff); + chWrite(i,1,chan[i].freq>>8); + chan[i].freqChanged=false; + } + } + } + if (panMask) { + updatePanning(panMask); + } +} + +void DivPlatformK053260::updatePanning(unsigned char mask) { + if (mask&3) { + rWrite(0x2c, + (isMuted[0]?0:chan[0].panning)| + (isMuted[1]?0:chan[1].panning<<3)); + } + if (mask&0xc) { + rWrite(0x2d, + (isMuted[2]?0:chan[2].panning)| + (isMuted[3]?0:chan[3].panning<<3)); + } +} + +int DivPlatformK053260::dispatch(DivCommand c) { + switch (c.cmd) { + case DIV_CMD_NOTE_ON: { + DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA); + chan[c.chan].macroVolMul=ins->type==DIV_INS_AMIGA?64:127; + if (c.value!=DIV_NOTE_NULL) chan[c.chan].sample=ins->amiga.getSample(c.value); + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); + } + if (chan[c.chan].sample<0 || chan[c.chan].sample>=parent->song.sampleLen) { + chan[c.chan].sample=-1; + } + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + } + chan[c.chan].active=true; + chan[c.chan].keyOn=true; + chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } + break; + } + case DIV_CMD_NOTE_OFF: + chan[c.chan].sample=-1; + chan[c.chan].active=false; + chan[c.chan].keyOff=true; + chan[c.chan].macroInit(NULL); + break; + case DIV_CMD_NOTE_OFF_ENV: + case DIV_CMD_ENV_RELEASE: + chan[c.chan].std.release(); + break; + case DIV_CMD_INSTRUMENT: + if (chan[c.chan].ins!=c.value || c.value2==1) { + chan[c.chan].ins=c.value; + } + break; + case DIV_CMD_VOLUME: + if (chan[c.chan].vol!=c.value) { + chan[c.chan].vol=c.value; + if (!chan[c.chan].std.vol.has) { + chan[c.chan].outVol=c.value; + chWrite(c.chan,7,chan[c.chan].outVol); + } + } + break; + case DIV_CMD_GET_VOLUME: + if (chan[c.chan].std.vol.has) { + return chan[c.chan].vol; + } + return chan[c.chan].outVol; + break; + case DIV_CMD_PANNING: + chan[c.chan].panning=MIN(parent->convertPanSplitToLinearLR(c.value,c.value2,7)+1,7); + if (!isMuted[c.chan]) { + updatePanning(1<chan[c.chan].baseFreq) { + chan[c.chan].baseFreq+=c.value; + if (chan[c.chan].baseFreq>=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } else { + chan[c.chan].baseFreq-=c.value; + if (chan[c.chan].baseFreq<=destFreq) { + chan[c.chan].baseFreq=destFreq; + return2=true; + } + } + chan[c.chan].freqChanged=true; + if (return2) { + chan[c.chan].inPorta=false; + return 2; + } + break; + } + case DIV_CMD_LEGATO: { + chan[c.chan].baseFreq=NOTE_PERIODIC(c.value+((HACKY_LEGATO_MESS)?(chan[c.chan].std.arp.val-12):(0))); + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + break; + } + case DIV_CMD_PRE_PORTA: + if (chan[c.chan].active && c.value2) { + if (parent->song.resetMacroOnPorta) chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA)); + } + if (!chan[c.chan].inPorta && c.value && !parent->song.brokenPortaArp && chan[c.chan].std.arp.will && !NEW_ARP_STRAT) chan[c.chan].baseFreq=NOTE_PERIODIC(chan[c.chan].note); + chan[c.chan].inPorta=c.value; + break; + case DIV_CMD_SAMPLE_POS: + chan[c.chan].audPos=c.value; + chan[c.chan].setPos=true; + break; + case DIV_CMD_GET_VOLMAX: + return 127; + break; + case DIV_CMD_MACRO_OFF: + chan[c.chan].std.mask(c.value,true); + break; + case DIV_CMD_MACRO_ON: + chan[c.chan].std.mask(c.value,false); + break; + case DIV_ALWAYS_SET_VOLUME: + return 1; + break; + default: + break; + } + return 1; +} + +void DivPlatformK053260::muteChannel(int ch, bool mute) { + isMuted[ch]=mute; + updatePanning(1<rate=rate; + } +} + +void DivPlatformK053260::poke(unsigned int addr, unsigned short val) { + rWrite(addr&0x0f,val); +} + +void DivPlatformK053260::poke(std::vector& wlist) { + for (DivRegWrite& i: wlist) rWrite(i.addr&0x0f,i.val); +} + +unsigned char* DivPlatformK053260::getRegisterPool() { + return regPool; +} + +int DivPlatformK053260::getRegisterPoolSize() { + return 48; +} + +const void* DivPlatformK053260::getSampleMem(int index) { + return index == 0 ? sampleMem : NULL; +} + +size_t DivPlatformK053260::getSampleMemCapacity(int index) { + return index == 0 ? 2097152 : 0; +} + +size_t DivPlatformK053260::getSampleMemUsage(int index) { + return index == 0 ? sampleMemLen : 0; +} + +bool DivPlatformK053260::isSampleLoaded(int index, int sample) { + if (index!=0) return false; + if (sample<0 || sample>255) return false; + return sampleLoaded[sample]; +} + +void DivPlatformK053260::renderSamples(int sysID) { + memset(sampleMem,0,getSampleMemCapacity()); + memset(sampleOffK053260,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); + + size_t memPos=1; // for avoid silence + for (int i=0; isong.sampleLen; i++) { + DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffK053260[i]=0; + continue; + } + + int length=MIN(65535,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT)); + int actualLength=MIN((int)(getSampleMemCapacity()-memPos),length); + if (actualLength>0) { + sampleOffK053260[i]=memPos-1; + for (int j=0; jdata8[j]; + } + } + if (actualLength +#include "vgsound_emu/src/k053260/k053260.hpp" + +class DivPlatformK053260: public DivDispatch, public k053260_intf { + struct Channel: public SharedChannel { + unsigned int audPos; + int sample, wave; + int panning; + bool setPos; + int macroVolMul; + Channel(): + SharedChannel(127), + audPos(0), + sample(-1), + wave(-1), + panning(4), + setPos(false), + macroVolMul(64) {} + }; + Channel chan[4]; + DivDispatchOscBuffer* oscBuf[4]; + bool isMuted[4]; + int chipType; + unsigned char curChan; + unsigned int sampleOffK053260[256]; + bool sampleLoaded[256]; + + unsigned char* sampleMem; + size_t sampleMemLen; + k053260_core k053260; + unsigned char regPool[48]; + void updatePanning(unsigned char mask); + + friend void putDispatchChip(void*,int); + friend void putDispatchChan(void*,int,int); + + public: + void acquire(short** buf, size_t len); + int dispatch(DivCommand c); + void* getChanState(int chan); + DivMacroInt* getChanMacroInt(int ch); + DivDispatchOscBuffer* getOscBuffer(int chan); + unsigned char* getRegisterPool(); + int getRegisterPoolSize(); + void reset(); + void forceIns(); + void tick(bool sysTick=true); + void muteChannel(int ch, bool mute); + int getOutputCount(); + void setChipModel(int type); + void notifyInsChange(int ins); + void notifyWaveChange(int wave); + void notifyInsDeletion(void* ins); + void setFlags(const DivConfig& flags); + void poke(unsigned int addr, unsigned short val); + void poke(std::vector& wlist); + const char** getRegisterSheet(); + const void* getSampleMem(int index = 0); + size_t getSampleMemCapacity(int index = 0); + size_t getSampleMemUsage(int index = 0); + bool isSampleLoaded(int index, int sample); + void renderSamples(int chipID); + int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); + void quit(); + DivPlatformK053260(): + DivDispatch(), + k053260_intf(), + k053260(*this) {} + private: + void chWrite(unsigned char ch, unsigned int addr, unsigned char val); +}; + +#endif diff --git a/src/engine/song.h b/src/engine/song.h index 8b6da13b..bc2dc750 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -127,7 +127,8 @@ enum DivSystem { DIV_SYSTEM_YM2203_CSM, DIV_SYSTEM_YM2608_CSM, DIV_SYSTEM_SM8521, - DIV_SYSTEM_PV1000 + DIV_SYSTEM_PV1000, + DIV_SYSTEM_K053260 }; struct DivGroovePattern { diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index fbb718cb..f236fcd2 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1855,6 +1855,16 @@ void DivEngine::registerSystems() { } ); + sysDefs[DIV_SYSTEM_K053260]=new DivSysDef( + "Konami K053260", NULL, 0xfe/*placeholder*/, 0, 4, false, true, 0x161, false, 1U<writeC(0xff); break; case DIV_SYSTEM_GA20: - for (int i=0; i<3; i++) { + for (int i=0; i<4; i++) { w->writeC(0xbf); // mute w->writeC((baseAddr2|5)+(i*8)); w->writeC(0); @@ -573,6 +573,16 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0); } break; + case DIV_SYSTEM_K053260: + for (int i=0; i<4; i++) { + w->writeC(0xba); // mute + w->writeC(baseAddr2|0x2f); + w->writeC(0); + w->writeC(0xba); // keyoff + w->writeC(baseAddr2|0x28); + w->writeC(0); + } + break; default: break; } @@ -928,6 +938,11 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(baseAddr2|(write.addr&0x7f)); w->writeC(write.val); break; + case DIV_SYSTEM_K053260: + w->writeC(0xba); + w->writeC(baseAddr2|(write.addr&0x3f)); + w->writeC(write.val&0xff); + break; default: logW("write not handled!"); break; @@ -1093,6 +1108,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p DivDispatch* writeRF5C68[2]={NULL,NULL}; DivDispatch* writeMSM6295[2]={NULL,NULL}; DivDispatch* writeGA20[2]={NULL,NULL}; + DivDispatch* writeK053260[2]={NULL,NULL}; for (int i=0; ichipClock; + CHIP_VOL(40,0.4); + willExport[i]=true; + writeK053260[0]=disCont[i].dispatch; + } else if (!(hasK053260&0x40000000)) { + isSecond[i]=true; + CHIP_VOL_SECOND(40,0.4); + willExport[i]=true; + writeK053260[1]=disCont[i].dispatch; + hasK053260|=0x40000000; + howManyChips++; + } + break; case DIV_SYSTEM_T6W28: if (!hasSN) { hasSN=0xc0000000|disCont[i].dispatch->chipClock; @@ -1964,6 +1995,15 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p w->writeI(0); w->write(writeGA20[i]->getSampleMem(),writeGA20[i]->getSampleMemUsage()); } + if (writeK053260[i]!=NULL && writeK053260[i]->getSampleMemUsage()>0) { + w->writeC(0x67); + w->writeC(0x66); + w->writeC(0x8e); + w->writeI((writeK053260[i]->getSampleMemUsage()+8)|(i*0x80000000)); + w->writeI(writeK053260[i]->getSampleMemCapacity()); + w->writeI(0); + w->write(writeK053260[i]->getSampleMem(),writeK053260[i]->getSampleMemUsage()); + } } // TODO diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 2a37c7e8..859a0d0d 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -438,6 +438,10 @@ void FurnaceGUI::drawInsList(bool asChild) { ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_PV1000]); name=fmt::sprintf(ICON_FA_GAMEPAD "##_INS%d",i); break; + case DIV_INS_K053260: + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_K053260]); + name=fmt::sprintf(ICON_FA_BAR_CHART "##_INS%d",i); + break; default: ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_INSTR_UNKNOWN]); name=fmt::sprintf(ICON_FA_QUESTION "##_INS%d",i); diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 49d568b3..7a01edf8 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -53,6 +53,7 @@ #include "../engine/platform/ga20.h" #include "../engine/platform/sm8521.h" #include "../engine/platform/pv1000.h" +#include "../engine/platform/k053260.h" #include "../engine/platform/dummy.h" #define COMMON_CHIP_DEBUG \ @@ -545,6 +546,13 @@ void putDispatchChip(void* data, int type) { COMMON_CHIP_DEBUG_BOOL; break; } + case DIV_SYSTEM_K053260: { + DivPlatformK053260* ch=(DivPlatformK053260*)data; + ImGui::Text("> K053260"); + COMMON_CHIP_DEBUG; + COMMON_CHIP_DEBUG_BOOL; + break; + } default: ImGui::Text("Unimplemented chip! Help!"); break; @@ -1083,6 +1091,18 @@ void putDispatchChan(void* data, int chanNum, int type) { COMMON_CHAN_DEBUG_BOOL; break; } + case DIV_SYSTEM_K053260: { + DivPlatformK053260::Channel* ch=(DivPlatformK053260::Channel*)data; + ImGui::Text("> K053260"); + COMMON_CHAN_DEBUG; + ImGui::Text("* Sample: %d",ch->sample); + ImGui::Text(" - pos: %d",ch->audPos); + ImGui::Text("- panning: %d",ch->panning); + ImGui::Text("- macroVolMul: %.2x",ch->macroVolMul); + COMMON_CHAN_DEBUG_BOOL; + ImGui::TextColored(ch->setPos?colorOn:colorOff,">> SetPos"); + break; + } default: ImGui::Text("Unimplemented chip! Help!"); break; diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 4e6cdec5..47579864 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -1344,7 +1344,8 @@ void FurnaceGUI::doAction(int what) { i==DIV_INS_SNES || i==DIV_INS_ES5506 || i==DIV_INS_K007232 || - i==DIV_INS_GA20) { + i==DIV_INS_GA20 || + i==DIV_INS_K053260) { makeInsTypeList.push_back(i); } } diff --git a/src/gui/gui.h b/src/gui/gui.h index 7dddb53e..9fcabf6c 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -193,6 +193,7 @@ enum FurnaceGUIColors { GUI_COLOR_INSTR_POKEMINI, GUI_COLOR_INSTR_SM8521, GUI_COLOR_INSTR_PV1000, + GUI_COLOR_INSTR_K053260, GUI_COLOR_INSTR_UNKNOWN, GUI_COLOR_CHANNEL_BG, diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 214eb468..15b4e8c7 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -131,6 +131,7 @@ const char* insTypes[DIV_INS_MAX+1]={ "Pokémon Mini/QuadTone", "SM8521", "PV-1000", + "K053260", NULL }; @@ -822,6 +823,7 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={ D(GUI_COLOR_INSTR_POKEMINI,"",ImVec4(1.0f,1.0f,0.3f,1.0f)), D(GUI_COLOR_INSTR_SM8521,"",ImVec4(0.5f,0.55f,0.6f,1.0f)), D(GUI_COLOR_INSTR_PV1000,"",ImVec4(0.4f,0.6f,0.7f,1.0f)), + D(GUI_COLOR_INSTR_K053260,"",ImVec4(1.0f,0.8f,0.1f,1.0f)), D(GUI_COLOR_INSTR_UNKNOWN,"",ImVec4(0.3f,0.3f,0.3f,1.0f)), D(GUI_COLOR_CHANNEL_BG,"",ImVec4(0.4f,0.6f,0.8f,1.0f)), @@ -1005,6 +1007,7 @@ const int availableSystems[]={ DIV_SYSTEM_GA20, DIV_SYSTEM_SM8521, DIV_SYSTEM_PV1000, + DIV_SYSTEM_K053260, DIV_SYSTEM_PCM_DAC, DIV_SYSTEM_PONG, 0 // don't remove this last one! @@ -1113,6 +1116,7 @@ const int chipsSample[]={ DIV_SYSTEM_GA20, DIV_SYSTEM_PCM_DAC, DIV_SYSTEM_ES5506, + DIV_SYSTEM_K053260, 0 // don't remove this last one! }; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index abac70c1..92692ce5 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4338,7 +4338,8 @@ void FurnaceGUI::drawInsEdit() { ins->type==DIV_INS_SNES || ins->type==DIV_INS_ES5506 || ins->type==DIV_INS_K007232 || - ins->type==DIV_INS_GA20) { + ins->type==DIV_INS_GA20 || + ins->type==DIV_INS_K053260) { if (ImGui::BeginTabItem((ins->type==DIV_INS_SU)?"Sound Unit":"Sample")) { String sName; if (ins->amiga.initSample<0 || ins->amiga.initSample>=e->song.sampleLen) { @@ -5078,7 +5079,8 @@ void FurnaceGUI::drawInsEdit() { } if (ins->type==DIV_INS_FM || ins->type==DIV_INS_SEGAPCM || ins->type==DIV_INS_MIKEY || ins->type==DIV_INS_MULTIPCM || ins->type==DIV_INS_SU || ins->type==DIV_INS_OPZ || - ins->type==DIV_INS_OPM || ins->type==DIV_INS_SNES || ins->type==DIV_INS_MSM5232) { + ins->type==DIV_INS_OPM || ins->type==DIV_INS_SNES || ins->type==DIV_INS_MSM5232 || + ins->type==DIV_INS_K053260) { volMax=127; } if (ins->type==DIV_INS_GB) { @@ -5167,7 +5169,7 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_TIA || ins->type==DIV_INS_AMIGA || ins->type==DIV_INS_SCC || ins->type==DIV_INS_PET || ins->type==DIV_INS_SEGAPCM || ins->type==DIV_INS_FM || ins->type==DIV_INS_K007232 || ins->type==DIV_INS_GA20 || - ins->type==DIV_INS_SM8521 || ins->type==DIV_INS_PV1000) { + ins->type==DIV_INS_SM8521 || ins->type==DIV_INS_PV1000 || ins->type==DIV_INS_K053260) { dutyMax=0; } if (ins->type==DIV_INS_VBOY) { @@ -5267,6 +5269,7 @@ void FurnaceGUI::drawInsEdit() { if (ins->type==DIV_INS_SEGAPCM) waveMax=0; if (ins->type==DIV_INS_K007232) waveMax=0; if (ins->type==DIV_INS_GA20) waveMax=0; + if (ins->type==DIV_INS_K053260) waveMax=0; if (ins->type==DIV_INS_POKEMINI) waveMax=0; if (ins->type==DIV_INS_SU || ins->type==DIV_INS_POKEY) waveMax=7; if (ins->type==DIV_INS_PET) { @@ -5385,6 +5388,11 @@ void FurnaceGUI::drawInsEdit() { panMax=7; panSingleNoBit=true; } + if (ins->type==DIV_INS_K053260) { + panMin=-3; + panMax=3; + panSingleNoBit=true; + } if (ins->type==DIV_INS_SU) { panMin=-127; panMax=127; @@ -5475,7 +5483,8 @@ void FurnaceGUI::drawInsEdit() { ins->type==DIV_INS_VBOY || (ins->type==DIV_INS_X1_010 && ins->amiga.useSample) || ins->type==DIV_INS_K007232 || - ins->type==DIV_INS_GA20) { + ins->type==DIV_INS_GA20 || + ins->type==DIV_INS_K053260) { macroList.push_back(FurnaceGUIMacroDesc("Phase Reset",&ins->std.phaseResetMacro,0,1,32,uiColors[GUI_COLOR_MACRO_OTHER],false,NULL,NULL,true)); } if (ex1Max>0) { diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 3354914c..33924b84 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -1245,6 +1245,42 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" } ); + ENTRY( + "Konami Rollergames", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + ENTRY( + "Konami Rollergames (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + ENTRY( + "Konami Golfing Greats", { + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // 3.58MHz + } + ); + ENTRY( + "Konami Lightning Fighters", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + ENTRY( + "Konami Over Drive", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + ENTRY( + "Konami Asterix", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, "clockSel=1"), // "" + } + ); ENTRY( "Konami Hexion", { CH(DIV_SYSTEM_SCC, 1.0f, 0, "clockSel=2"), // 1.5MHz (3MHz input) @@ -2449,6 +2485,11 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_ES5506, 1.0f, 0, "channels=31") } ); + ENTRY( + "Konami K053260", { + CH(DIV_SYSTEM_K053260, 1.0f, 0, "") + } + ); CATEGORY_END; CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound."); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 207c8838..7edaeb0f 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1954,6 +1954,7 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_INSTR_POKEMINI,"Pokémon Mini"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_SM8521,"SM8521"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_PV1000,"PV-1000"); + UI_COLOR_CONFIG(GUI_COLOR_INSTR_K053260,"K053260"); UI_COLOR_CONFIG(GUI_COLOR_INSTR_UNKNOWN,"Other/Unknown"); ImGui::TreePop(); } diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 77bc6c72..31f66e0a 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -1784,6 +1784,26 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } break; }*/ + case DIV_SYSTEM_K053260: { + int clockSel=flags.getInt("clockSel",0); + + ImGui::Text("Clock rate:"); + if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { + clockSel=0; + altered=true; + } + if (ImGui::RadioButton("4MHz",clockSel==1)) { + clockSel=1; + altered=true; + } + + if (altered) { + e->lockSave([&]() { + flags.set("clockSel",clockSel); + }); + } + break; + } case DIV_SYSTEM_SWAN: case DIV_SYSTEM_BUBSYS_WSG: case DIV_SYSTEM_PET: From 09726e6290a4ccdbd5360dcb80339e6472dd3d00 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 14:34:10 +0900 Subject: [PATCH 02/27] Fix pitch --- extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp index 2ee4efac..9c8d9434 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp @@ -80,7 +80,7 @@ void k053260_core::voice_t::tick(u32 cycle) { m_bitpos -= 8; } - m_counter = 0x1000 - bitfield(m_pitch, 0, 12); + m_counter = (m_counter - 0x1000) + bitfield(m_pitch, 0, 12); } // calculate output From dee28d218e302fabede1282aefae0634e8612f7e Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 14:55:10 +0900 Subject: [PATCH 03/27] Implement sample playback Fix register viewer Minor optimize --- .../vgsound_emu/src/k053260/k053260.cpp | 10 ++-- .../vgsound_emu/src/k053260/k053260.hpp | 22 ++++----- src/engine/platform/k053260.cpp | 49 +++++++++++++------ src/engine/platform/k053260.h | 1 + 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp index 9c8d9434..990c1fc3 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp @@ -244,7 +244,7 @@ void k053260_core::voice_t::keyon() m_bitpos = 4; m_data = 0; m_output = 0; - std::fill(m_out.begin(), m_out.end(), 0); + std::fill_n(m_out, 2, 0); } // key off trigger @@ -260,13 +260,13 @@ void k053260_core::reset() //m_intf.write_int(0); - std::fill(m_host2snd.begin(), m_host2snd.end(), 0); - std::fill(m_snd2host.begin(), m_snd2host.end(), 0); + std::fill_n(m_host2snd, 2, 0); + std::fill_n(m_snd2host, 2, 0); m_ctrl.reset(); //m_dac.reset(); - std::fill(m_reg.begin(), m_reg.end(), 0); - std::fill(m_out.begin(), m_out.end(), 0); + std::fill_n(m_reg, 64, 0); + std::fill_n(m_out, 2, 0); } // reset voice diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp index feaffeac..bfb7ea00 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp @@ -70,7 +70,7 @@ class k053260_core : public vgsound_emu_core , m_data(0) , m_output(0) { - m_out.fill(0); + std::fill_n(m_out, 2, 0); } // internal state @@ -124,7 +124,7 @@ class k053260_core : public vgsound_emu_core u8 m_bitpos = 4; // bit position for ADPCM decoding u8 m_data = 0; // current data s8 m_output = 0; // ADPCM buffer - std::array m_out; // current output + s32 m_out[2]; // current output }; class ctrl_t @@ -232,10 +232,10 @@ class k053260_core : public vgsound_emu_core //, m_ym3012(ym3012_t()) //, m_dac(dac_t()) { - m_host2snd.fill(0); - m_snd2host.fill(0); - m_reg.fill(0); - m_out.fill(0); + std::fill_n(m_host2snd, 2, 0); + std::fill_n(m_snd2host, 2, 0); + std::fill_n(m_reg, 64, 0); + std::fill_n(m_out, 2, 0); } // communications @@ -267,19 +267,19 @@ class k053260_core : public vgsound_emu_core inline s32 adpcm_lut(const u8 nibble) { return m_adpcm_lut[nibble]; } private: - std::array m_voice; + voice_t m_voice[4]; k053260_intf &m_intf; // common memory interface - std::array m_host2snd; - std::array m_snd2host; + u8 m_host2snd[2]; + u8 m_snd2host[2]; ctrl_t m_ctrl; // chip control //ym3012_t m_ym3012; // YM3012 output //dac_t m_dac; // YM3012 interface - std::array m_reg; // register pool - std::array m_out; // stereo output + u8 m_reg[64]; // register pool + s32 m_out[2]; // stereo output }; #endif diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 47e7636d..f42a532d 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -22,20 +22,32 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if(!skipRegisterWrites) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} +#define rWrite(a,v) {if(!skipRegisterWrites && a<0x30) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} -#define CHIP_DIVIDER 64 -#define TICK_DIVIDER 4 +#define CHIP_DIVIDER 16 +#define TICK_DIVIDER 64 // for match to YM3012 output rate const char* regCheatSheetK053260[]={ - "FreqL", "0", - "FreqH", "1", - "LengthL", "2", - "LengthH", "3", - "StartL", "4", - "StartM", "5", - "StartH", "6", - "Volume", "7", + "MainToSub0", "00", + "MainToSub1", "01", + "SubToMain0", "02", + "SubToMain1", "03", + "CHx_FreqL", "08+x*8", + "CHx_FreqH", "09+x*8", + "CHx_LengthL", "0A+x*8", + "CHx_LengthH", "0B+x*8", + "CHx_StartL", "0C+x*8", + "CHx_StartM", "0D+x*8", + "CHx_StartH", "0E+x*8", + "CHx_Volume", "0F+x*8", + "KeyOn", "28", + "Status", "29", + "LoopFormat", "2A", + "Test", "2B", + "CH01_Pan", "2C", + "CH23_Pan", "2D", + "ROMReadback", "2E", + "Control", "2F", NULL }; @@ -49,8 +61,14 @@ inline void DivPlatformK053260::chWrite(unsigned char ch, unsigned int addr, uns } } -// TODO: this code is weird -// make sure newDispatch didn't break it up +u8 DivPlatformK053260::read_sample(u32 address) { + if ((sampleMem!=NULL) && (address& wlist) { - for (DivRegWrite& i: wlist) rWrite(i.addr&0x0f,i.val); + for (DivRegWrite& i: wlist) rWrite(i.addr&0x3f,i.val); } unsigned char* DivPlatformK053260::getRegisterPool() { + regPool[0x29]=k053260.read(0x29); // dynamically updated return regPool; } diff --git a/src/engine/platform/k053260.h b/src/engine/platform/k053260.h index c449206f..3b21cb4d 100644 --- a/src/engine/platform/k053260.h +++ b/src/engine/platform/k053260.h @@ -58,6 +58,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { friend void putDispatchChan(void*,int,int); public: + virtual u8 read_sample(u32 address) override; void acquire(short** buf, size_t len); int dispatch(DivCommand c); void* getChanState(int chan); From 8f783e604a4cd2c0bd2ae870b90a9e462a8490a1 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 15:48:30 +0900 Subject: [PATCH 04/27] Minor fix --- src/engine/platform/k053260.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index f42a532d..801325f8 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -159,6 +159,7 @@ void DivPlatformK053260::tick(bool sysTick) { } if (chan[i].audPos>0) { start=start+MIN(chan[i].audPos,s->length8); + length=MAX(1,length-chan[i].audPos); } start=MIN(start,getSampleMemCapacity()-31); length=MIN(length,getSampleMemCapacity()-31); From f56e09606a741ab0408bf892c390c8202f026dc6 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 15:49:12 +0900 Subject: [PATCH 05/27] More fixes --- src/engine/platform/k053260.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 801325f8..dd8364fa 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -161,8 +161,8 @@ void DivPlatformK053260::tick(bool sysTick) { start=start+MIN(chan[i].audPos,s->length8); length=MAX(1,length-chan[i].audPos); } - start=MIN(start,getSampleMemCapacity()-31); - length=MIN(length,getSampleMemCapacity()-31); + start=MIN(start,getSampleMemCapacity()); + length=MIN(65535,MIN(length,getSampleMemCapacity())); rWrite(0x28,keyoff); // force keyoff first rWrite(0x2a,loopoff); chWrite(i,2,length&0xff); From f7768dafe3937dc0b95829cb2659959502ff0cbb Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 23:01:57 +0900 Subject: [PATCH 06/27] Fix K053260 VGM output --- src/engine/vgmOps.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 4445ef93..d68302b5 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -1627,12 +1627,12 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_K053260: if (!hasK053260) { hasK053260=disCont[i].dispatch->chipClock; - CHIP_VOL(40,0.4); + CHIP_VOL(29,0.4); willExport[i]=true; writeK053260[0]=disCont[i].dispatch; } else if (!(hasK053260&0x40000000)) { isSecond[i]=true; - CHIP_VOL_SECOND(40,0.4); + CHIP_VOL_SECOND(29,0.4); willExport[i]=true; writeK053260[1]=disCont[i].dispatch; hasK053260|=0x40000000; From 9b877764c41db500bb05cf7f0c40a1b80d1a1d8a Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 2 Apr 2023 23:33:34 +0900 Subject: [PATCH 07/27] Fix build --- extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp index 990c1fc3..b1c56a8d 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp @@ -42,7 +42,6 @@ void k053260_core::voice_t::tick(u32 cycle) { if (m_enable && m_busy) { - bool update = false; // update counter m_counter += cycle; if (m_counter >= 0x1000) From 048728b496017cdf344e675e55d6514e549efe00 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 3 Apr 2023 00:34:09 +0900 Subject: [PATCH 08/27] Add reverse playback support --- .../vgsound_emu/src/k053260/k053260.cpp | 6 ++++-- .../vgsound_emu/src/k053260/k053260.hpp | 9 +++++++- src/engine/platform/k053260.cpp | 21 ++++++++++++++++--- src/engine/platform/k053260.h | 3 ++- src/engine/sysDef.cpp | 5 ++++- src/gui/debug.cpp | 1 + 6 files changed, 37 insertions(+), 8 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp index b1c56a8d..59d8af8f 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.cpp @@ -49,7 +49,7 @@ void k053260_core::voice_t::tick(u32 cycle) if (m_bitpos < 8) { m_bitpos += 8; - m_addr = bitfield(m_addr + 1, 0, 21); + m_addr = m_reverse ? bitfield(m_addr - 1, 0, 21) : bitfield(m_addr + 1, 0, 21); m_remain--; if (m_remain < 0) // check end flag { @@ -69,7 +69,7 @@ void k053260_core::voice_t::tick(u32 cycle) if (m_adpcm) { m_bitpos -= 4; - const u8 nibble = bitfield(m_data, m_bitpos & 4, 4); // get nibble from ROM + const u8 nibble = bitfield(m_data, m_reverse ? (~m_bitpos & 4) : (m_bitpos & 4), 4); // get nibble from ROM if (nibble) { m_output += m_host.adpcm_lut(nibble); @@ -169,6 +169,7 @@ void k053260_core::write(u8 address, u8 data) case 0x28: // keyon/off toggle for (int i = 0; i < 4; i++) { + m_voice[i].set_reverse(bitfield(data, 4 + i)); if (bitfield(data, i) && (!m_voice[i].enable())) { // rising edge (keyon) m_voice[i].keyon(); @@ -276,6 +277,7 @@ void k053260_core::voice_t::reset() m_loop = 0; m_adpcm = 0; m_pitch = 0; + m_reverse = 0; m_start = 0; m_length = 0; m_volume = 0; diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp index bfb7ea00..9eb81363 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp @@ -59,6 +59,7 @@ class k053260_core : public vgsound_emu_core , m_loop(0) , m_adpcm(0) , m_pitch(0) + , m_reverse(0) , m_start(0) , m_length(0) , m_volume(0) @@ -91,6 +92,11 @@ class k053260_core : public vgsound_emu_core inline void set_adpcm(bool adpcm) { m_adpcm = adpcm ? 1 : 0; } + inline void set_reverse(const bool reverse) + { + m_reverse = reverse ? 1 : 0; + } + inline void length_inc() { m_length = (m_length + 1) & 0xffff; } inline void set_pan(u8 pan) { m_pan = pan & 7; } @@ -114,10 +120,11 @@ class k053260_core : public vgsound_emu_core u16 m_loop : 1; // loop flag u16 m_adpcm : 1; // ADPCM flag u16 m_pitch : 12; // pitch + u8 m_reverse : 1; // reverse playback u32 m_start = 0; // start position u16 m_length = 0; // source length u8 m_volume = 0; // master volume - int m_pan = -1; // master pan + s32 m_pan = 4; // master pan u16 m_counter = 0; // frequency counter u32 m_addr = 0; // current address s32 m_remain = 0; // remain for end sample diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index dd8364fa..b35bc5a2 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -133,7 +133,7 @@ void DivPlatformK053260::tick(bool sysTick) { } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { unsigned char keyon=regPool[0x28]|(1<=0 && chan[i].samplesong.sampleLen) { start=sampleOffK053260[chan[i].sample]; - length=start+s->length8; + length=s->length8; + if (chan[i].reverse) { + start+=length; + keyon|=(16<0) { - start=start+MIN(chan[i].audPos,s->length8); + if (chan[i].reverse) { + start=start-MIN(chan[i].audPos,s->length8); + } + else { + start=start+MIN(chan[i].audPos,s->length8); + } length=MAX(1,length-chan[i].audPos); } start=MIN(start,getSampleMemCapacity()); @@ -314,6 +323,12 @@ int DivPlatformK053260::dispatch(DivCommand c) { chan[c.chan].audPos=c.value; chan[c.chan].setPos=true; break; + case DIV_CMD_SAMPLE_DIR: { + if (chan[c.chan].reverse!=(bool)(c.value&1)) { + chan[c.chan].reverse=c.value&1; + } + break; + } case DIV_CMD_GET_VOLMAX: return 127; break; diff --git a/src/engine/platform/k053260.h b/src/engine/platform/k053260.h index 3b21cb4d..42ae0565 100644 --- a/src/engine/platform/k053260.h +++ b/src/engine/platform/k053260.h @@ -29,7 +29,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { unsigned int audPos; int sample, wave; int panning; - bool setPos; + bool setPos, reverse; int macroVolMul; Channel(): SharedChannel(127), @@ -38,6 +38,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { wave(-1), panning(4), setPos(false), + reverse(false), macroVolMul(64) {} }; Channel chan[4]; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index f236fcd2..0ce88965 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1862,7 +1862,10 @@ void DivEngine::registerSystems() { {"CH1", "CH2", "CH3", "CH4"}, {DIV_CH_PCM, DIV_CH_PCM, DIV_CH_PCM, DIV_CH_PCM}, {DIV_INS_K053260, DIV_INS_K053260, DIV_INS_K053260, DIV_INS_K053260}, - {DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA} + {DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA, DIV_INS_AMIGA}, + { + {0xdf, {DIV_CMD_SAMPLE_DIR, "DFxx: Set sample playback direction (0: normal; 1: reverse)"}} + } ); sysDefs[DIV_SYSTEM_DUMMY]=new DivSysDef( diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 7a01edf8..b1cdb292 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -1101,6 +1101,7 @@ void putDispatchChan(void* data, int chanNum, int type) { ImGui::Text("- macroVolMul: %.2x",ch->macroVolMul); COMMON_CHAN_DEBUG_BOOL; ImGui::TextColored(ch->setPos?colorOn:colorOff,">> SetPos"); + ImGui::TextColored(ch->reverse?colorOn:colorOff,">> Reverse"); break; } default: From 40f3455357fc9f8c2e4f7fd45a41559752a97e3a Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 3 Apr 2023 00:35:02 +0900 Subject: [PATCH 09/27] Fix build --- src/engine/platform/k053260.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index b35bc5a2..1705f156 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -22,7 +22,7 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if(!skipRegisterWrites && a<0x30) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} +#define rWrite(a,v) {if((!skipRegisterWrites) && (a<0x30)) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} #define CHIP_DIVIDER 16 #define TICK_DIVIDER 64 // for match to YM3012 output rate From 04f208c535677985d203b3301cad9c2a0767b580 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 3 Apr 2023 06:34:05 +0900 Subject: [PATCH 10/27] Fix build again --- src/engine/platform/k053260.cpp | 6 +++--- src/engine/platform/k053260.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 1705f156..04cec849 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -22,7 +22,7 @@ #include "../../ta-log.h" #include -#define rWrite(a,v) {if((!skipRegisterWrites) && (a<0x30)) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} +#define rWrite(a,v) {if(!skipRegisterWrites) {k053260.write(a,v); regPool[a]=v; if(dumpWrites) addWrite(a,v);}} #define CHIP_DIVIDER 16 #define TICK_DIVIDER 64 // for match to YM3012 output rate @@ -374,7 +374,7 @@ DivDispatchOscBuffer* DivPlatformK053260::getOscBuffer(int ch) { } void DivPlatformK053260::reset() { - memset(regPool,0,48); + memset(regPool,0,64); k053260.reset(); rWrite(0x28,0); // keyoff all channels for (int i=0; i<4; i++) { @@ -434,7 +434,7 @@ unsigned char* DivPlatformK053260::getRegisterPool() { } int DivPlatformK053260::getRegisterPoolSize() { - return 48; + return 64; } const void* DivPlatformK053260::getSampleMem(int index) { diff --git a/src/engine/platform/k053260.h b/src/engine/platform/k053260.h index 42ae0565..c0c3f5a9 100644 --- a/src/engine/platform/k053260.h +++ b/src/engine/platform/k053260.h @@ -52,7 +52,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { unsigned char* sampleMem; size_t sampleMemLen; k053260_core k053260; - unsigned char regPool[48]; + unsigned char regPool[64]; void updatePanning(unsigned char mask); friend void putDispatchChip(void*,int); From d9c64e7c8c0e9db253f8f6f6b38cd9a357bbfcf1 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 3 Apr 2023 06:42:37 +0900 Subject: [PATCH 11/27] Fix typecasting --- src/engine/platform/k053260.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 04cec849..a082be6d 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -70,7 +70,7 @@ u8 DivPlatformK053260::read_sample(u32 address) { } void DivPlatformK053260::acquire(short** buf, size_t len) { - for (int i=0; i Date: Mon, 3 Apr 2023 06:44:00 +0900 Subject: [PATCH 12/27] Minor optimize --- src/engine/platform/k053260.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index a082be6d..7005f18d 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -63,8 +63,7 @@ inline void DivPlatformK053260::chWrite(unsigned char ch, unsigned int addr, uns u8 DivPlatformK053260::read_sample(u32 address) { if ((sampleMem!=NULL) && (address Date: Mon, 3 Apr 2023 07:02:56 +0900 Subject: [PATCH 13/27] Fix Mac compile --- src/engine/platform/k053260.h | 53 +++++++++++++++++------------------ 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/engine/platform/k053260.h b/src/engine/platform/k053260.h index c0c3f5a9..ce531f3d 100644 --- a/src/engine/platform/k053260.h +++ b/src/engine/platform/k053260.h @@ -60,33 +60,32 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf { public: virtual u8 read_sample(u32 address) override; - void acquire(short** buf, size_t len); - int dispatch(DivCommand c); - void* getChanState(int chan); - DivMacroInt* getChanMacroInt(int ch); - DivDispatchOscBuffer* getOscBuffer(int chan); - unsigned char* getRegisterPool(); - int getRegisterPoolSize(); - void reset(); - void forceIns(); - void tick(bool sysTick=true); - void muteChannel(int ch, bool mute); - int getOutputCount(); - void setChipModel(int type); - void notifyInsChange(int ins); - void notifyWaveChange(int wave); - void notifyInsDeletion(void* ins); - void setFlags(const DivConfig& flags); - void poke(unsigned int addr, unsigned short val); - void poke(std::vector& wlist); - const char** getRegisterSheet(); - const void* getSampleMem(int index = 0); - size_t getSampleMemCapacity(int index = 0); - size_t getSampleMemUsage(int index = 0); - bool isSampleLoaded(int index, int sample); - void renderSamples(int chipID); - int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); - void quit(); + virtual void acquire(short** buf, size_t len) override; + virtual int dispatch(DivCommand c) override; + virtual void* getChanState(int chan) override; + virtual DivMacroInt* getChanMacroInt(int ch) override; + virtual DivDispatchOscBuffer* getOscBuffer(int chan) override; + virtual unsigned char* getRegisterPool() override; + virtual int getRegisterPoolSize() override; + virtual void reset() override; + virtual void forceIns() override; + virtual void tick(bool sysTick=true) override; + virtual void muteChannel(int ch, bool mute) override; + virtual int getOutputCount() override; + virtual void notifyInsChange(int ins) override; + virtual void notifyWaveChange(int wave) override; + virtual void notifyInsDeletion(void* ins) override; + virtual void setFlags(const DivConfig& flags) override; + virtual void poke(unsigned int addr, unsigned short val) override; + virtual void poke(std::vector& wlist) override; + virtual const char** getRegisterSheet() override; + virtual const void* getSampleMem(int index = 0) override; + virtual size_t getSampleMemCapacity(int index = 0) override; + virtual size_t getSampleMemUsage(int index = 0) override; + virtual bool isSampleLoaded(int index, int sample) override; + virtual void renderSamples(int chipID) override; + virtual int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) override; + virtual void quit() override; DivPlatformK053260(): DivDispatch(), k053260_intf(), From 74958c59fa2368e2c8f078807745a9a147d1469d Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 8 Apr 2023 08:52:16 +0900 Subject: [PATCH 14/27] Sync with master --- src/engine/platform/k053260.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index 7005f18d..ec5f26cd 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -223,7 +223,10 @@ int DivPlatformK053260::dispatch(DivCommand c) { case DIV_CMD_NOTE_ON: { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA); chan[c.chan].macroVolMul=ins->type==DIV_INS_AMIGA?64:127; - if (c.value!=DIV_NOTE_NULL) chan[c.chan].sample=ins->amiga.getSample(c.value); + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].sample=ins->amiga.getSample(c.value); + c.value=ins->amiga.getFreq(c.value); + } if (c.value!=DIV_NOTE_NULL) { chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); } From 0e072b62b3cc883785be966a2ff7e4e0caf7ea79 Mon Sep 17 00:00:00 2001 From: cam900 Date: Tue, 2 May 2023 15:14:46 +0900 Subject: [PATCH 15/27] Fix sample cutoff with looping --- src/engine/platform/k053260.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index ec5f26cd..396316d6 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -470,7 +470,7 @@ void DivPlatformK053260::renderSamples(int sysID) { continue; } - int length=MIN(65535,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT)); + int length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_8BIT)); int actualLength=MIN((int)(getSampleMemCapacity()-memPos),length); if (actualLength>0) { sampleOffK053260[i]=memPos-1; From 4efd3591d2eb6ee4520fe01a7031ab02deba49a2 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 26 Jun 2023 19:59:57 +0900 Subject: [PATCH 16/27] Add silence to avoid popping noise --- src/engine/platform/k053260.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index edd9400b..da7b58f2 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -477,6 +477,7 @@ void DivPlatformK053260::renderSamples(int sysID) { for (int j=0; jdata8[j]; } + sampleMem[memPos++]=0; // Silence for avoid popping noise } if (actualLength Date: Mon, 26 Jun 2023 20:00:29 +0900 Subject: [PATCH 17/27] Fix offset --- src/engine/platform/k053260.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/platform/k053260.cpp b/src/engine/platform/k053260.cpp index da7b58f2..7ba1cc2c 100644 --- a/src/engine/platform/k053260.cpp +++ b/src/engine/platform/k053260.cpp @@ -471,7 +471,7 @@ void DivPlatformK053260::renderSamples(int sysID) { } int length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_8BIT)); - int actualLength=MIN((int)(getSampleMemCapacity()-memPos),length); + int actualLength=MIN((int)(getSampleMemCapacity()-memPos-1),length); if (actualLength>0) { sampleOffK053260[i]=memPos-1; for (int j=0; j Date: Wed, 28 Jun 2023 20:05:53 +0900 Subject: [PATCH 18/27] Loop point ignored in K053260 --- src/gui/sampleEdit.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index f68fd7a8..28ce24d2 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -246,6 +246,13 @@ void FurnaceGUI::drawSampleEdit() { } } break; + case DIV_SYSTEM_K053260: + if (sample->loop) { + if (sample->loopStart!=0 || sample->loopEnd!=(int)(sample->samples)) { + SAMPLE_WARN(warnLoopPos,"K053260: loop point ignored (may only loop entire sample)"); + } + } + break; default: break; } From d33d487ab9c90a512dcfd811e6aca2925607cf37 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 29 Jun 2023 21:35:53 +0900 Subject: [PATCH 19/27] Add warning --- src/gui/sampleEdit.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 16eecfc8..0c470177 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -273,6 +273,9 @@ void FurnaceGUI::drawSampleEdit() { SAMPLE_WARN(warnLoopPos,"K053260: loop point ignored (may only loop entire sample)"); } } + if (sample->samples>65535) { + SAMPLE_WARN(warnLength,"K053260: maximum sample length is 65535"); + } break; default: break; From 5e0fb78a90eae211cceffb8bdbc4d300d10dfa87 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 10 Jul 2023 19:57:45 +0900 Subject: [PATCH 20/27] Use allocated ID --- src/engine/sysDef.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 2cc3ccf1..6d8a308e 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1865,7 +1865,7 @@ void DivEngine::registerSystems() { ); sysDefs[DIV_SYSTEM_K053260]=new DivSysDef( - "Konami K053260", NULL, 0xfe/*placeholder*/, 0, 4, false, true, 0x161, false, 1U< Date: Sun, 16 Jul 2023 11:00:20 -0700 Subject: [PATCH 21/27] Relinking and new stuff. --- doc/2-interface/README.md | 1 + doc/2-interface/menu-bar.md | 62 +++++++++++++++------------------ doc/2-interface/order-list.md | 29 +++++++++++++++ doc/2-interface/order-list.png | Bin 0 -> 73955 bytes doc/8-advanced/inputlatch.md | 11 ++++++ doc/8-advanced/inputlatch.png | Bin 0 -> 7986 bytes doc/8-advanced/opmask.md | 7 ++++ doc/8-advanced/opmask.png | Bin 0 -> 77408 bytes 8 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 doc/2-interface/order-list.md create mode 100644 doc/2-interface/order-list.png create mode 100644 doc/8-advanced/inputlatch.md create mode 100644 doc/8-advanced/inputlatch.png create mode 100644 doc/8-advanced/opmask.md create mode 100644 doc/8-advanced/opmask.png diff --git a/doc/2-interface/README.md b/doc/2-interface/README.md index 6de22e92..cb1588dd 100644 --- a/doc/2-interface/README.md +++ b/doc/2-interface/README.md @@ -9,6 +9,7 @@ the default layout of Furnace is depicted below. primary topics: - [menu bar](menu-bar.md) +- [order list](order-list.md) - [play/edit controls](play-edit-controls.md) - [instrument/wavetable/sample list](asset-list.md) - [song information](song-info.md) diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index 822f3889..a55518d2 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -154,8 +154,8 @@ it's not really useful, unless you're a developer and want to use a command stre - if a column is already selected, it will select the entire channel. - if a channel is already selected, it will select the entire pattern. -- **operation mask**: this is an advanced feature. see [this page](../3-pattern/opmask.md) for more information. -- **input latch**: this is an advanced feature. see [this page](../3-pattern/inputlatch.md) for more information. +- **operation mask**: toggles which columns will be affected by the listed commands. [more information here.](../8-advanced/opmask.md) +- **input latch**: determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - **note/octave up/down**: transposes notes in the current selection. @@ -176,7 +176,7 @@ it's not really useful, unless you're a developer and want to use a command stre - **invert values**: `00` becomes `FF`, `01` becomes `FE`, `02` becomes `FD` and so on. - **flip selection**: flips the selection so it is backwards. -- **collapse/expand amount**: allows you to specify how much to collapse/expand in the next options. +- **collapse/expand amount**: allows you to specify how much to collapse/expand in the next commands. - **collapse**: shrinks the selected contents. - **expand**: expands the selected contents. @@ -188,7 +188,7 @@ it's not really useful, unless you're a developer and want to use a command stre - **expand song**: same as expand, but affects the entire song. - it also changes speeds and pattern length to compensate. -- **find/replace**: opens the Find/Replace window. see [this page](../3-pattern/find-replace.md) for more information. +- **find/replace**: shows [the Find/Replace window](../8-advanced/find-replace.md). - **clear**: allows you to mass-delete things like songs, instruments and the like. @@ -199,46 +199,42 @@ it's not really useful, unless you're a developer and want to use a command stre - **basic mode**: toggles [Basic Mode](basic-mode.md). - **visualizer**: toggles pattern view particle effects when the song plays. - **reset layout**: resets the workspace to its defaults. -- **settings...**: opens the Settings window. these are detailed in [settings.md]. +- **settings...**: shows the Settings window. these are detailed in [settings.md]. # window -- **song information**: shows/hides the Song Information window. -- **subsongs**: shows/hides the Subsongs window. -- **speed**: shows/hides the Speed window. -- **instruments**: shows/hides the instrument list. -- **wavetables**: shows/hides the wavetable list. -- **samples**: shows/hides the sample list. -- **orders**: shows/hides the Orders window. -- **pattern**: shows/hides the pattern view. -- **mixer**: shows/hides the Mixer window. -- **grooves**: shows/hides the Grooves window. -- **channels**: shows/hides the Channels window. -- **pattern manager**: shows/hides the Pattern Manager window. -- **chip manager**: shows/hides the Chip Manager window. -- **compatibility flags**: shows/hides the Compatibility Flags window. -- **song comments**: shows/hides the Song Comments window. +all these commands show or hide their associated windows. -- **instrument editor**: shows/hides the Instrument Editor -- **wavetable editor**: shows/hides the Wavetable Editor. -- **sample editor**: shows/hides the Sample Editor. +- [song information](song-info.md) +- [subsongs](song-info.md) +- [speed](song-info.md) +- [instruments](../4-instrument/README.md) +- [wavetables](../5-wave/README.md) +- [samples](../6-sample/README.md) +- [orders](order-list.md) +- [pattern](../3-pattern/README.md) +- [mixer](mixer.md) +- [grooves](grooves.md) +- [channels](channels.md) +- [pattern manager](pat-manager.md) +- [chip manager](chip-manager.md) +- [compatibility flags](compat-flags.md) +- [song comments](comments.md) -- **play/edit controls**: shows/hides the Play/Edit Controls. -- **piano/input pad**: shows/hides the Piano/Input Pad window. -- **oscilloscope (master)**: shows/hides the oscilloscope. -- **oscilloscope (per-channel)**: shows/hides the per-channel oscilloscope. -- **volume meter**: shows/hides the volume meter. -- **clock**: shows/hides the clock. -- **register view**: shows/hides the Register View window. -- **log viewer**: shows/hides the log Viewer. -- **statistics**: shows/hides the Statistics window. +- [piano](piano.md) +- [oscilloscope](osc.md) +- [oscilloscopes (per-channel)](chanosc.md) +- [clock](clock.md) +- [register view](regview.md) +- [log viewer](log-viewer.md) +- [stats](stats.md) # help - **effect list**: displays the effect list. - **debug menu**: this menu contains various debug utilities. - unless you are working with the Furnace codebase, it's not useful. -- **inspector**: this options opens the Dear ImGui Metrics/Debugger window. +- **inspector**: this option shows the Dear ImGui Metrics/Debugger window. - unless you are working with the Furnace codebase, it's not useful. - **panic**: this resets all chips while the song is playing, effectively silencing everything. - **about...**: displays the About screen. diff --git a/doc/2-interface/order-list.md b/doc/2-interface/order-list.md new file mode 100644 index 00000000..b838d811 --- /dev/null +++ b/doc/2-interface/order-list.md @@ -0,0 +1,29 @@ +# order list + +the order list is a playlist for patterns. + +![order list](order-list.png) + +along the top are the available channels. their abbreviations can be set in the [channels window](../8-advanced/channels.md). the highlighted channel follows the channel the pattern view cursor is in. + +along the left are the order numbers. these are referenced with the `0Bxx` command. the highlighted row follows the order the pattern view cursor is in. + +each entry in the table is the pattern that will play during that order. these can be changed according to the order edit mode. + +hovering over a pattern number will pop up a tooltip showing the name of that pattern, if it has one. + +The buttons are as follows: +- **Add new order**. +- **Remove order**. +- **Duplicate order**: adds a new order with patterns matching the selected one directly below it. right-click to "deep clone"; this copies all patterns involved to new ones. +- **Move order up**: swaps the selected order with the one above it. +- **Move order down**: swaps the selected order with the one below it. +- **Duplicate order at end of song**: same as "Duplicate order" except the new order is added at the bottom of the list. +- **Order change mode**: selects how much of the order will change with an edit. only applies if "Order edit mode" is set to "Click to change". + - **one**: only current channel's pattern will change. + - **entire row**: all patterns in the order will change. +- **Order edit mode**: selects the method of changing orders. + - **Click to change**: a click will add one to the pattern number. a right-click will subtract one. + - **Select and type (don't scroll)**: select a pattern and type. + - **Select and type (scroll horizontally)**: as above, but after entering two digits, the cursor moves to the next channel. + - **Select and type (scroll vertically)**: as above, but after entering two digits, the cursor moves to the next order. diff --git a/doc/2-interface/order-list.png b/doc/2-interface/order-list.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ead8c06fd9cdc8fb7546222ceb2dda7ebaf28c GIT binary patch literal 73955 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:+n3HUDvqG&A% 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 z

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 literal 0 HcmV?d00001 diff --git a/doc/8-advanced/inputlatch.md b/doc/8-advanced/inputlatch.md new file mode 100644 index 00000000..fd7acf52 --- /dev/null +++ b/doc/8-advanced/inputlatch.md @@ -0,0 +1,11 @@ +# input latch + +![input latch menu item](inputlatch.png) + +input latch determines which data are placed along with a note. as in the pattern view, the columns are note (not changeable), instrument, volume, effect type, and effect value. +- `&&` fills in the currently selected instrument. +- `..` ignores the column. +- all columns (except note) can be reset with a right-click. +- **Set**: sets latch according to the data found at the cursor. +- **Reset**: resets all columns to default (selected instrument, ignore others). +- only the first effect type and effect value may be latched. diff --git a/doc/8-advanced/inputlatch.png b/doc/8-advanced/inputlatch.png new file mode 100644 index 0000000000000000000000000000000000000000..3100ca4fb08cb09c849403d7f73b2ed2898a1ec6 GIT binary patch literal 7986 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 literal 0 HcmV?d00001 diff --git a/doc/8-advanced/opmask.md b/doc/8-advanced/opmask.md new file mode 100644 index 00000000..6e6ca725 --- /dev/null +++ b/doc/8-advanced/opmask.md @@ -0,0 +1,7 @@ +# operation mask + +![operation mask popup](opmask.png) + +the operation mask toggles which columns will be affected by the listed commands. as in the pattern view, the columns are note, instrument, volume, effect types, and effect values. the effect toggles apply to all effect columns. + +click any area to toggle it. a `---` or `--` means the listed command will ignore any data in that column. \ No newline at end of file diff --git a/doc/8-advanced/opmask.png b/doc/8-advanced/opmask.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5c350e7a48083e75779e696ec4bf13e87f361b GIT binary patch literal 77408 zcmZU)18`+c*ex8JC${ZLCZ5=~ZB1<3w#|u?iEZ1~#I}=r-ur#^*RA?b_1RT>pVPZ` z?e3?0J!`EeLP1U(5e^p)1Ox<8QbI%t1OyBl`0a!N170DuR_p-*Wu%f65ma&4yI5h7 z8n8$2-AiLrKiSu@w`_-_l&0b2glaH9&187cX$uar*6s91dV-;7s=_^Nf+46Q3(wpC{MpyJfBoPru*`f3LjmN|PfVF9uecH~dD3q{NNJRf#5;GLNF9ZY~c;t3DCW3sxTd5i zVw-jL)vMNSwihg^kwfw0QKU^dvo>kqia9+Ra(ph@;7&a(c52j9NioT?AlOM3alJc} zVrLcC9X-Y{=bc|MDn>}i7uWpEG=m-DT@&-AIhjh)3UA^M{BoCKiYi_p4**Tc;ZbR? zd!13LCi>Ordp|8S;)h}#T7JFbw>w~xRS3m27D{qfG!Sb@DpR&7!IJiLKJ{p$dvK*T zv8VLo2g4P`+7X6Q40KpYNlD)^b0n(73EO(j)I`|BdBrLSH1*amaPQB1SMLl{ zfsB-lWwCSu86TUT{q#Kzj`weRd@}vQJMvla@;Y+42X2p)l>z6VPzJvqT{~Q(e$xCS zBYrJ3Uu!S1+xWXr!+vKqrtR7;N?^f=f}2`Zsz9A%Vq|UYb-mpMjZAps&U+d6_xDD# z&->HO#J*$OOztnQyML0Zs!LR|R<^d=HM$-C{vgQ6ac{(l7@r_t zSdoj3`dY0z4tjEHy7@s5{3zY*6ZcMq&tY*rWC^|#oG9FqNE{CoNcc*f@fMFd=Q{i# z(X~cx&EcG1XZ{>HY5i%CI6DX60_?LA%C`?xAe717PB6`8^~#nL-EyvQs4oZ_6xLA) zES}kBm09+afu4T3R-fNtUqn>DDljlGK0dy~?fQ(9M((4$oLV5w$k@n;6l!d2jD%6U z*~a7HMDdm0$s}<6+l16_d}6{HI9A)++mXUstq#Uln{B{p%UwN8Ek>;Q@yV7i;bFQ| z98ZCqq>mEA^F&0%YGm-QR+`F>=i@DBaAM{9%(}fM;0sL*d1{Pq6BpzD{f)V+3!tR| z9jl9g?(t2`csOaNQ~?oleU(#RXZ#GeJ!$XwOvG|*IQb{8O4zy5R(WOJ>u+r(qgNdh z!g_RofAHYX7QNk~<(r|ljBvQa_Fui)k``2J55kO;P-vyq_8aZa`J;Wt)BLrTWC`g4 zPXw+GPKSAKtV0VyEslz2H}ZU$HahP1J}-EQ70!>8aYOgp=U5V)I``L$m)K?=Z|bD9 zSO=GfF$i=H|7vUfN#k<0}4NEjKBe7i(NMg8*@7Z;~Q3!3is2BbgV z9*nH5t+fu4Vg%_L85!AQ5eHYm!^4k6k{#y2nCym`JfrD1~-3f#}lQ55qhN-vgO$_Y(B4t?Hd-g<#j?Mu#%u&s7 zL=1`1@`&31*6Or<*%3WJMK$S}$N>sPsUop^YXaeKF_GT~Ds^IB-cGH4&+P2%R)?G2 zRy&5dgS-37zp*6McW7v6a8VEtW)4AyR`1ulv!zPIgUIOU;EJ;}ec$@#=9(}_@}xOL zYRBDP(34-Y(u{hYoYu=#y}bhIi@OJSn3zzRXum-5`hI}&?gBm|Chm`C(1bHGGO9Hj zp{N^vZ?Fr@ZFhMw>9qR4h#TO^XfrZ0@_#-kf0EFPv4FuU1RI)aj??h?JvN_hP4N_k zMZ?1)?v&S_nnC$2Ot&zoWZ$pYp09PznqrS%jHs*FIq(+;ynD-;Yh$ew5R5;0jggO0DV%Kd4{E!HUOX@Z#a<|)*;Y@F4? z3^q|+i60>21rdrNGii9}5%l0(Dl}dL>*MEf{is?PT>Fw#HNY`kxEI8fkny;$97vBR*_ZF4*XzOr%r+@uBIj1(nBo%TcuBeScmt{x(pKEB`D z+=O|VBi-dfIeXa~2m{VaI0!Hgo>?%305~>)K?>tJ^lpKq` zNZCq=oNT?(L8o>PG=s)-$V=CeTCP|XpDxE#z4B|nxE3-=zJ8}|yxX+gGfEn~5JjoG$!v>(i>t zEKZj(Q&YpF*OF?ncjfnd2*+0L0DzzeC?&?ngG{8%R|DTAcwYXRz|frO=WHbN%H#RU z`Po^rt)MDc-CpfL<~hy~wODL%1{u7mpkhQ{njB@V4!)7~lt!ZmhlT4WlAP%(DuyqG z_;2XHXzoR;LJE{n7z?;RC=@>>b$KYT^2NH21ZYdyVB=9RWRW^VH8AF6H4V=GAzbQb zrrNgAt*c(c2c;(E8;%5){VVLWpDIu|CU9~@fp}3XNCXWt1Gh20KbnH=^)KI6b+HQb z!jMw9l_KW~wl6&c##5zQb@KWW5?C7TEM9pz7@#$Y{rCDwgRc>zLBx8&-Q69t`lm3? z5Dd8-68&05AIrmh*uypK^Zv0Vj+c?#sgFHwP=pdGCaimk2>j6eaN?m(ZWc*OxPzwp zP|7VSNTOdzcxPn@0i6QL$-^)fG>#CAXsIKSK2Pavm&fIO8bZP(37iRdtRQr%LdumM zT51H}1gX}_&qC4ZosRY_n~|sC))PW!wioHnTxmn-4&M#p?}wV28tRGhac8$CAy{$k z!3=Bf7VBl1js-H7QI!mfv(l(vaKe4n@F_$lg^2VqMi79@+*XMA#lCqfi2%|DN5yaj z>Oe(!xnWPDym5nqF);%yH}=j3_Zen!6#t zq(Q6%eeH_~aqmDOBqt@GKEs-0+KhK(r-v>y2w(6Bh(Or@+2ew19Q#lfOc{iAD;eMo74{wXLDZcxK1%Ws>+^sDw^WtMQjVY56K=i`XJ}L9)Ou zz6^U&BxI9p6e%Dz-&O;b_F;f=y}kbYM%izoyP((3lt!r&LLcl19E1PbinRef6K>Ad zma;^VqRBf^hanv&8QRozYdJM0Vi<|OZ>51?qo|QP(Eby=r^n{JZ-S|qac6d203N(v zFxcAvFUl!O%lp@-S26|$hCR~Pg+0GUFA7(BLV{qvqA@<`131_;+~WN(6;n zVl}=_BcWbm5sV1^?!n5#*=Vpgji?Z9$t)v}6%QP8yOkq6xRC*|f(Q~V48CBStF-i>2is9Bi8~=4tM`cBAODSJ1%HhkIg- zN77s`{{<_;l+nId{=%h^|97dTrgpwu4SrBPo&ZUh^KL?FdUF(H~C z0MX_5&9|>>V`GD2T$@e`Ne4YmataSdXxPL$#|Xp+lD596QlzN0BqseF!lr-AWSvb0 z_sS6?dqSMb_AnQQabfWt+PH15j-6Ig@B?9h;oC#6%}k(pHy%|0_`tJpJ;Mlt`ggSy zMJYwm*{GAVw7^`$=$+gK$+qt}xT_@6cJKc05PpXs*0bP+=jC16s}#itGuXS=)cGI0 z8;4JWLhy>+CPtX2GJFU3{S2YZDL^BjvxkhTN&HL_Z2%q&Hh~!av@u_v*nA%dEDKoj z135gK2Ejj??8U&jP{w1kDay&x@qEKZ?V|w>bKmXrUMOrl~fSY|E$UGV978Of)p@Q~5A z5w3y=%J;hoRz8v^dqxyMRLm9v-Ra!blZLDquXX@yZm42$I@SF(hD7= z5q*^t7Dm|)Kryl)3Q?zV7&5I#x=po}Ebek%(0E&qByM7~tl=6g^pj|Z=jpD#XfU*G zizYjR9zDcJo12YmUAA48gy7J}hK z^JHLnD(}JsnyvOE(-!{}0>%SXbS*?eF{q(?gOZccOC*pq+INql2D>8LeH|QFoQb`s z30k~O0}W9pz&Js39ooh-ImALgFDq-i1MdV)#1eLda4{^H>C~#Qd0eY{WDL;2{}S&y zOr$dW{Q2|IEE31%1gjqel326JDy6K9O3tct z8m+Wg-?Z>4f%OMy2`B=Hmj45kT)AkD&kx0}5E_GDQQ_erxFih_mU2>3Y@rxrd2s%+ zQOZA*n(1}h(GQ5NAWB&&sQ=qB&YmfD@SHri8a$lLqR}En@W_yRabsNZLYLkS`N2d{ zo^E^ipZuO)PVE}m-kpCa8qFuCog&VpE4|Prj4+7Q>}->45MF5a)6o%Ypm|%68!YlJ zHUefQezpGF?u|?f9;vI4>JX_SS|Ws1JnQ~9+U1+2Q?p}4V(0CI_0@Kg9MSlxK&6pn z7m6hs+#~pl`-updksP;A9t}s%e)qcJH2i+{01mYdth|x~rrxV8lB`2%uQXc1>xDvk zu=Ivlq467_9Mr%=+~SbwmwAmJ1|HcR@a@MxTD*4-Z9(H#HVDkN=X62HiD@yXbGZ3A zsZG{bv1)g~bUWAoiWnK3Ox&k_WhT7t?ezQvi3l!NFo|w)btLNiCxO@kqE94VSCf!;f7jO`lZdYdsE>B55F?-Pyrj#U4uv7Bg*~KdA8m z9L5(^JS@=IA(52&1W>RD7b4JP0I6$*VZ~d3G$bfxC8?Ab#*?#mbA?}E$CK@paaoOb?ojY(UQJXnOJIZr@Jo(ObJgkkaH(s>$TMS&mF2zrcN!7vcWlPG z;b7sd6HbQvz4sX^VCDSa+4Xf6x73sUhXAMT$>>#hweiJkIHWjPu0&l8uiBVMx5%6R z@yf~Rx>4Wpbs?i@q^GKSFtrdo(J9GevHigb- z&;PgYhUaTLq35O?86dA$PhZ2mCo@7GB%AEi6a)qU0s#vW2=Tv1K`?(}P!PeynLMTR zer}M-buAqon6Uo+>st&sW$b)1Pyrw{3?y{P|Mv*&o=s+X@Mnuq>6g02cM!FVVa+-u z!PxMycnD3ER{-&U9e}s|f4ceC*Vmt(o{~%UGnOdPFfLm))ggm}gC`{=Ipo=}Oiv>rBZujZAKpz)P7V$Z@&%b#S<%|&P8?74D8r5TSLkfb; z?(FDSt7#jqK|#O@B$D6X-#a-uojP+na|wch`0Vw57+uTc7t(KVeDyL9_+P+;qgZL| zgVA19WMo$O9F>`+zAIH|Xg2Ssc4#uL?W?6qSy);zX82l}Sw-SScC;1*Rt|^HQ7_3 z8LBP1x_w%{dK1~r0HX3O=N>U~rg=rci2ma7Nf#(d!y~T4$GaZi%@GN~JF!ONIpCRA z3Kn!TbV$QzM6mcV;!;dPW?iVwHu1;~AKiQ_1H}POyHs*{n5`bacGO;BnY)wVT$dX0iXy&dDh%D!Sfe`G&`j z&;v5gh%hj%j)&tw_JXc6Br8kX-rgRV45Km^78bs6x7h7qB8PiEp4Cel7#R5aeyuf{ zuZa}Rg)3PA!OZ1)lXx_?phDDtkKwjWIbgo&K~LyQNM^UtiGazEh{PI*Utf=*Nq<$yHSF%Zo)K-}ds=s+t)pySPwM+wEAN zhTK|aqFjqt@0-ekWw@+pua%^loM~BU`+MvCrSj@Z{R49<@5h;EqC-=1JR6Y1zXa?> zatBE3ofi+S7IC3{s{5CRG%C&FE4q7DdC)_&b71ti= z?}>i(V}uEh=v)m~X#bqKSf)XQHWhzaTiHg4jB3Fsoog38suR4W!7Y(ejkYG8goZK5 zi=bLAkPS7z6x#ZfuTt)KsIy}#UwR|WS*lN(_9JwKN18ml&4vohe)?kY;`t1$J&*d+ z$8+7uYQNii-TiL+c(&yAeC6WckigXH`}sCoAiRg52&Y^sbGqJi9ta7K$)IIYw*;h| z_7W`@N~?9+=CjoXhRxm{PDw~e8o&bT^;+%sQW>;^VIR&{;@~CD6V)RlBfCGJHki6! z3hU|=RKRFcq{iu#X;bcuJUzKJ^){M+C#fIJxoF-Mp`#@6S;q5I;rkZa0by5*{Y23`vsYMfBn^(`wf^Z%PO!`0{>y zr0~5Xi(YK|iKN3`27*KPY`)t9hnQ}l=apV19hTOsY*&zIfV3s{GW_kgr9*x0P}cW{ z+4a$u<%N-W?OOnoEGH_TbaLSQbiwCnThpgDx=9(qI|;g7X=L~yx9aJGFIrIm)094{ zjLN&U@HUi!-Ba`Xn79g#j_zOmsSdcPs`rvBDyQ7}bI2FNuDCqAuT-KU+}GpjkCWk5 z*t8EF!172_N+zgVsuj|3o+bl9f(be@98$#k6(!#El%DXcdkNKwZl7e>(5=L+U+wC?5^^_4)(XLiS)S zJ@-Ax2x)pq3s@tA{~vRZ^Xh(;lS# z@O$5?xVRXf+c|uwxR~67&dck+xOP361ywf#2IBE_PLMm062Ce<#UUg_Vqk%bDiX7) zHMN5_WX|9{ri&0YvDt28vN@2WWa3>BOoz29x4nUvj#l(kEu+y1Ne*|6Q#tTu=CR6mnq5X%aK- z*br9Xf$B~!Ryw^E<;#SOg28b!S~}pjnk;s6Lo_jNP_Wg|QAoPrNA9rOQ1%HUdUFg6 z3S!hOT30)Zc)ZNe8EK5)T}t*qG{pqfT#NjPcP13v-2BE!FfXENG@CCdol4)Q$E4SZ zy#fKgQX-A@5@e6)1P=!?7z>Pu0h7CbWA=EAL(e;Y$f|YQEq40!-F=Vpe6QqunD{|k zBN2V!Kz5vv@nWZkpQS{v%To}!khIPzj_?;u2RrtEgx(Misi>p!LFU*)}jc+hbM73sA*pSB(6l2u!;)aXVJw%!~YaKglmrq^*= zg+pLEIG3jsN^ZRN^oZin>!B{6FU3nPU}jd!xSjYP$>t3Yt+l0XWS~8+caORsFA^$3 zRkSb_c;|=k&YeMeu$1rc)O3TcjkzH+`Ek(Eh^g?S4|xdhrA`1u9F~w9BDgbLhYgw>QxtFNyCW7qS^4uvHO z5mw2a??qit|_~M z&&9|{q-Ou%AR=A0fs%*?R&C+@Q32kMx)uu^efM_vDqn7o1U9NDRHB`CA@g>3PB~obE~Hx7L`9^EH%?%uMyD&?=E z??^*yc@I*pI~Gj|+!*Qbwuemo!3by}0$jVLbN8!|wdr#d-Bh8BcgG|g ztD?!EN^n>3XkFWIhqY(D8_t?VGQT0jPdj}y3|$v9!1Z2V*TFQg3Jbd2U$+j(++WwPi1mk2wlT8Tu- zlzv+Af=FiDihHp^A**JuUsXvem?Qv8BU(d_1ZBxIoIr)LQn%-1X?5#rxOMsLKIx3)c|P2>wT52zw(IH{2V%n^+FP%gbvo zPR#$MV3a&>kVDS)VWmOYVRAjfD+)DXvOm~e?QY~`pP4ZWyx^eo(69u-mgQbPe~rwFI^ zHY*Ro4vgtf?nAaT`49Ec!7nnJ#d3(((E&i#`nUS>EFHD^tACbkVAsqG+>F zbD4-gufCp!&uP1UrLvFSs!5FkgFi$9zG2UdkLDjcnB93VG14haVcNk=3}JSVcHhYe3nl2mg=sxkU{-Bkrqn}V=v|Lst;|0wc!uwT$7Vpf-7 z!hA?TUAPP_dMxv_?z}%YvSLiWdoH>jj7``c8ms2P-DMzMa6jjFa2y_$N*7#+qraaW zF{}cnUaEvdT4IBvWbhCtuEkb=6>%-BPnHEnM30FfjyqL6jyXHbpu;aMZWm^;2$8SY zLy+a*F6wA1g;2RK`>at~7;~{iL4`eo(x-Y}E4IX7azv5+-5Y~ge!)LvBQdQlTx}kv zIk{W~b}ZBS?V04pia$qZMtaY*qO0Jg!QsZ3EQJfVPZ;1P z4(vp;wUE3s2*z+JimIiMS>mBXVhA}YPkhUiN7Azklhs4J0P_5dFJ=o*+=aM;n0MtX z`x#XmC%PGOR4R?NI_@Rv&&iYYS&G+ezdYwPRemWfCSW3jgWfZg&?=gn-}K8JpvW*B zuHA8CPyx=eaSJm_;L!z>VA zbCHr3DwoL>iN}@74EhVLW|#i>2Q94{b{GUEPb*=;#BVYh4`k%=Y(xcN^&{V~C!VD$ zB)=*8(&jeK`yxH5gNT@|l-6c$V3iRzQQ;0Y{@S>nte!ITT%)OiYf85?G>Ad6TnTZt zj;Cp2LNvkrhHda2Gi<^y?*Fy#S5917C}{zhH|^c1Bz87J*dAN-K#XWtr-HF^z~(w{ z5z;kTIJ>Wdp(1(^+f6uFBL5eEEfRrmqR>7uT4y+rPOOvG?Ckgb$pK143;Lgi?wcp2 z7A;EyH&`meq=v8vNu#COeh91f@_L+?$80F12^q4Gs1Y*o*ZEZG)iawa98_8ElglLp z%1S(=MTP;GVxo`5C5`Ax8>RlaUk!&qINKrewuMk{ za&l2ZC_Ja~HqF#aU4D4;fm|nWM9{2d>wx6(stFyCXj5`QztcW!imjjLJ-q7vlgz!s z98UGBtu6ADXj`Y}PUv)|-HvhDb;)t+ouow*R@*gTII3SJzR}n1;@Z==1u zxew>z^OC0uvYJZNC7@e1ol9@2qW9%6O+UV@rlKDlhXq&n*JvyJ*lq%!r==vI+T#^qNpRU?a1v3rQ`wq zpAQqE9~NPvEdZ;>G2J5@p#IU}eoN}1Tt{%x{|qSURo}fr?{xy4Z66*e?!`rkY4UKC zASJB3Oh<&yND^Zs5lijm`F$A@)W%w`hBc18UvIP^GX@8*#^2APn7%(<>R{sH!U^s_ z>^8te6;b|eI(+_I^&AKMvhJWL!4~sfZ-Tqns$Te0r+st63atIR=b{UYZtJ=kKIV$mYynN%6h3O#cW+ z!S3F-lw+SWbo^hZKaRF2D=eiHyL!L&%?)Hq^lL(}VbDf4 zf|}t@gg5;>QxcHq@_IHi@mt$;`aG}giH%YyfI}=P&^n-qm!;df0*YfQomp^$1z%ZEKiohX6m&7+Rw>sK` za^NQh_iX8{l8{OqP~=``Hy%bvw>+B6$R_F%sSzuF#H=0|Jn+XQ<-$j$aoNjZep||b zSI169k@NG@+1NGfcInzqXH(`y7vjsbwlmkkvE8AySf)Z#TKEBk$D(XW4=G_{lM%Wu zna=K{FRzu*{qRm#Q5nnDTUiYNh{Ry&5&Fy6K^EE>u3Oa9;Wq{s;=}+S0F43%b4SoS z)xIBb_65($*EM|D@vX#xQIJx__id$gGUK$yE)nW!^vBptMmp0uhn$u5OqqAL=KYi? zR#{g{#EHm8Gj49y$$p4CH4HG zw;Fvho1|DW5y%^SU8rFxI}Ok76D>mJD;>0#1n=<}iRDH%o6)yZMLa`-0}UWhgpFU43NF(MsR!_){G9)-&WoFm@&VIRTR zi=(ny9~CBt!2qsfcU$$s!eWT+_J`aTfEyKXT<``8r2Fev#}`eve()WM&lHq9@k2f|0j-9TF+0hZ~2jND#qYQ@lch zcc&ehmP1a7A;OsuPY2BhS#C&j`nR z2RgYN0`Y@i5?Bc(hbbE^<33$mSno5#sb`!0TVBr#g_YFdDm^bBf`|Q6JSEDX6+{#{ zqxXx~9S=vRAB|y(>K+?rm%~yb#r)Po&-A#$?IFc+^Olw)Dbo5K@{99h_bOTLH*-nG zE`G;^RvR)Ux2OrUxZnG}!o+xl-FnsCZ`Co6y?L&S2#C5~EZ-!q^gc73el@i;)>;}m zQd@U(%yL9y+dk9AVGUJX&YhPxb4(NPr&5YxeUVRt4fLM!HEu56mD5dSPu1V|5uYy) zu6EW%%^c*VOJQ?2`90r`P8W@jG3yg6OVq8GQ4-wstp7YZ^=+i7TqA%~{a;!#AFPN# z|04_X-U9|j{8@BFB#{4A3jWgz{)gNbh)jOkQ$FhleU5SjB^Q*5p&Rz<&y1f0N&WynRpP6&GrA>{r?dSfQo~Fy!_0`iG{hj z`2{EpzyO#k0o8GDZ{CT9RR-X%)oM}UF)=aJnaj(|eSLia0Rf(3#DNglI5;$E6Dd*@ zGxyZVv9Ylg6%`Q?5kRU*U`4G9#M;`Lm6bKYpZIlb+eP4~hwENiFgSzZNI=+)+V?f*8}?o1&-{)XPeCL-dE0@3^)HeJwvz%!7yEeWf2iX zajJyyx#Q2VJYvSF=T;Gz<(ID_Aw>jRIVcM!?KM>I;KXvdRx&YDx_xMKom9STiNKBd z2(oahg!+1i7aKV<@wwHW-%~@h7$g{g-#a{m$UwN={qkU6E=k2a{NOd~_lgNqY`4sy zCq<^U=fvmEkwb^XP!Z`jY(&1&;<2&c$rLnHU7Ax)W543`M^vOnaQCEode6wfmXw3= zJr+z7Ass@2eaSyY#ygd1W}EHC0=-Mp7stQFNX8iFA6&xG?Roxry-$mXZc4GW#uY>j zLmG8gsIQkGUr{&7oEzJM^qO`dwcI&??7QEab3QmZN2QOj0_q|D)H%N!UL0_0i=$zj zXDOd?p03~fvKWTkU^W+qqdZ>{K-5WKw|$tv1kMR^9p(+!((k^|X@xqr;&b0prmgKNMj68)ytl1jWb4pKVArXds&i{76elE&()tWFj6Ft2>HE42aDA?jthd`+&yLf*{@2kT%yylJ!;k)P->9h z8e4_A9*H&CIrlz46Q($X#ut_(o%bACc@jrxY!B-+eSdnt66y@eiN}H}^4c=fVtmHEP@T%Rx z^N#ns6+8bT+e&70U8#+PdY%vu1OPsq@9>ZRB4Ab!ZE<7CzVnf#%^3U`l8_DG2LXer zK8}67(z7rjMp^1M{`ACz_G?S>I-1w%2*KpHCH|m2&@PTarhx^T;pUuv=hXe$j35y^>MN8IinBbMuDHN}9u`i@qmXxFghb(`w zHYOOnZ?DCS20DKWn6zeomcbqe<5;qvoWecZ#z05m^BcDtIfKpo?jfya@AsZe$Ce)-8*JE8tpK4PoeS?H*#WF^oMh75&_-N z4-z%XwU~Ku7@am%y3N5u8;%*x<)=HmLmXIv&19%G18P+7<0*7N+N~~2CY@POUEK{x z8{^>MXt&swFbb#E+3oN#4+6&sD3zsTWUN)HGnv3@*ll-m0gdCuKU7$NQkF7M7MYot z;PL(7%w68zCL|BQ;jUOhjVD-wYMTGRi_%>+q+#uPd_VTcUq^~w0;U5faH;Ly;* zW*r@!Xm|;<{J?SX!iqjnLxV=gdp(*cg_nCNi`g~0RquBfyCE0+2KHJVfwDP{YwmP? zh4NA7!9%=EZnU=1g{Y1`Qk716rh~i%Z5Y%n&Ij-{1&7pBJ^h&+gM@~_s+(TX*NR)I z6a1Wbnq~C47nx-j;rab^PTH)oDlx_e8#0Yx1qnIR8Evz$DSLIk(a^=9wT1cYOX;iN zd&Vt`HjZmP5@l)WQ`9 zwIy8-vwL(DS`1XNKu?j%Pk`oX0~jnUEECqVvooN5NBH&+kGctak7Ye{U>>?jEy*YlrdY^44x z4!+jc$j%YbB6N0mU1YOaJ(gLdP1!|p%!?0r+|(Zyfr>l$d$3~}Xhs<`PI>2FWm>PU zBuV2FlZPQuZYod~<>xFPw2bOJEkc~Hc-xp3T{i8c)l_1O?5d=pJ%jx&U%dQ{@jPvr=oE(DX^Of2pT!BmY(AP|y(A-?YGj#=7pgxzDnJG0? zU`5O$XgEGPYVmZj)?kKOHwP>b0!p;`f$>NFaI~a2t7Ul0b>V&xcV9`SX2-*PUb5)H zPnc$WxytZS(#v)`OaPj@7el8<7n!QMF<&g{eV|c6&G?KgiN; zTRVw*A!&I_9HE5l`y>trXH4teU9Hyjd81(eh|6zmy25r&;CX)RV-$gkSBmeJ7=-;f zzt0{Al(V=|VGcNNNzk;kw3Gzv0@;`>SFvFT2=AcClYk&e32#)ZIMVa^YD@BWJ`AN~ zP$n8}Ia?yT7;hDhCfC&0^63NOM3-|@Tb3I^;G`Tn9HzQ{dj<7A8jga)jqDT*MFtzu zqSWc6#4D9cn>ejRjLSrP>XZsxf`ZRq5yFOsj78I?03|BFR_m)u_o*PkBau0QR5ZOA zg8K)FAdzlF61PEu*1k^G$|X`dwvr8XdUZvXhx6X zgU~yG8rPjp&WmzB zZcJ+49p%M}2Ot(zDqJLOc2S}!of<=hyYMS}B7A}JG2g~aYA79u$MT7uOb?hQB!V?U zgfbsA&M!1Rb{6CpmxknXoxJMXWzM^HH%`+Q0owlFlPNI#?C|Y#VX8jIcPHbDdCaw z$MNr~)B+Es2R|B2P?115-sHSk8A&YGO3OBxCzqno*#3i~$0o>yg*APfMFS~LJ$l6a zJ8;wfKR#;}{Ib2IKVt$6P$N|g@cY_L-Mn6SCE&r1JpSGU_6nI?Y4{MP?R@OyqlZ3U zcWugvDO+Aj$jNQj8G_3YGGp}n1YQ|dI5Pnv3~=V==0ML!)v%IFL(22#C4Mx%5(5~j zXQV$Ai#<^uMcDPU)EKiKY@TxBmh5H>*>E`0NQ%gj>AcBDx$=`$(2sv{{%yqsZ~R$L zDwm9?AQ57M0Q+7Ai^?{*^T5Wg`l7_?NIvY2*@!y`0u42N6497#O_f7h#npyD`{TC~ z)R9Ag-L$T)uoen)$7FhTz|?IcWlV-M7{_}6fn8|Z5hh0E%*z-FsaV)w+x%e2IFe2R zm;I2CkVO4F8bkvKc>Hi`SHTQ%9y7V$jlfpXb$(ty0|b()#r~{&a)!2(EoCrt^`4`@9RD)*qE8@s42>7<=&Ds<+qxwQFpP`$~AO9>2 zofaaMq4ic>>4!G;<6dJUh`4}ZaiC=2Gg8jz=JqU^MA>H%s2NiiH(#5wKytD zOizy>^$s-8G~4Z59UKI$#bQ5(N9}Qo7_&gxlL+A=c48*x0?~BAhQ^yb0;08)j|?P6 zf=;U^p7}4E2r;O)wKkWe{aoFgP~Jtty>v9@H-x~tBz&X&J#;P zRn&4htDODGXEGbg$hPysTOTd#YqfazQ#KjS@EMHl%V+?WolFXHIIMRt>}oY(=SXD4 zYCHfXO9CMH7$-&Zb->%cN#>xkoe(L4q z^arV!+p^Gmr#I9qKWHd}5RBjo6M6z6fH*vxjF}mQwN(PKce&ei0uvjcI2y>YJvoWc zcX46E3l7Cp7?bXeG{3OG@q3*ODE(<@2xw(y%Ko-d1}^4%3BX#2&TZB$_6wLQV-lSX zcUxpEaVO=2wJ7#@%0BBgOvG4k(^hr$;~2Wm`#bou>3dN)`BOSsVWo#A_NT6mc7%v; z9t{O839EeFmc6d*5AD04Gwogcqn6o37X91D_pK+(Gx;npnK$O z(a+b=NJZruuSVcOik~Cf>UE4Y&n=PBOM;FOwXBLdD|VUARlf)k@2BQ`m|U7F8TDAT zTGvY{5E<{u%h3kiC;=WIXa>QBHoTOSPy_f5nL&gGo?#s~2P1KhF$$d&phx_HAo=aa z516@XSN@pJ-U(0+I$(vswX%DY(1r75e|d>-yKysERh0)Uwg5M#6-nKCWBuD-)ZqQ) zwWX-IBHS-c7d8kNb2Z(w4qaG^6m1v>3J?8#qZce2~~pxjaIe)o#QX{tGWK%^ZL$ze=JU+}?tdC-9DCH|4yXON+*(64sqw zDzy5U-BOLCAhInffD1}ZicG{u{(snd3!u8Xa1HO^?(T4KcXxLS1a~LF6Wrb1U4lb! zcXyW{A-Dy14|M;x?QLgTW|)Bi_7Rrs^{n@M)=y}L@{zG%IdV;=Tv6Y`vd)#5OXDt2 zIJf%qRnp+VM1|Mt^}MThO51yoderxUu%4y>_EcZSJRfa?72PH zYT7M(c=6@vC0N**`0HL}7?afA7QZI51&l{72|P){KrsnDh=RnJ-1p^Y%Gs;bppOt4 z(>7B*n&0y+QUd6tjR)?95+#~_D)8}C#fb^9m-tc`sAYtjJdR!rq{XD$jPh=9Ew5zW z?o;cU_@NL_oy)_k{U&P63d5g<0}AoQ*$q4R`1t7f+S?FS;v{(d1GmYXz9YmHCPRyh zr^A=X&_P$iFdl!}Q@c;N2ZxxnZ@dWk43el`B&19BK>fY47CV^0rLYd8CyTRoLIT>*{i2F!c{UAsL#p?kU*?FLXm{D$&39 z>hmTzk9J4P5sk`5t*EE z7g`cel*)%t7hgQ}UuOCL#E}0BBY|jeP_dR^1zRW%kaRw|@31vKJ{ZvkGRy&S(Ep1d z{}*u9H468BX??57&Ch=SFX*gw9u#Nc{n|Ky&BOh_sPg~w5Nbdy`KMO5k*WspJ6ze* zDrJifts3>fv%z2I>lQsTgwxc}ZKVkb2|+D{K^Iq3i;C)w>5iXqbU!;_r<*BP9Sw@& zG!rN8=P6p1k-lpcbn_pMTF}H+gNBy+OMQolnbhTYP}6Req&7meZ+vQ5Tiy5|{J7yg zD_l2|-rd{nPKO8Edaqg%E1s?k)TRpVPOz;*27VCejUWT`A;u{w5YyxCBq zD^W&`pB&!hI3eW~bjaH8VNjAH&p{x;I$LS^OZ3x ze!hu8@l{F;3K3kh+3*#)kV<8;3Kq(1>C|xhul}Aq4H?zhC2vyeB<=Fo4+zlR{r$2K zRIE)v$hZkH>Kd2TDrj8A&wMYk(I55Uh(B~*7=@=%XpO^F1c8~BDL>TTM{3yV)Q-Z2 zYD8UPB76FK@!Q?pyU1-RM`p}&FLZRumzU~STM9L*Qw@jk2R8+uM7KY(9@AHgr6-z) z*4X|YpS6u_thR6cvTO@@1#P`ekUP`g@U|OxjZ5_wr9Cx))QU^WUTR-8Y74MI2Q=fPrl*# z4GxMcoHtoLxO6w{hhDqO-QYy@T;18)lgxU!mk@kCeh(!bLNW|;PlQ<8Irn#-Z)FZB z+z0HV|4gRK;pLhpZDguC#$0`zNrxp0WwW5VN&|s;H=_ZRbGU`Btw#nzz|l0!3b49*{N7W;d4s_KCuFQc_btTi0V_ zV*_<0=;YUyzQ`y56NZp1E-ya@5G4@b2Dag0%U4%d4LZIf=s>0!6{fF5gxRgEm_xD^ zRBv^}i(!0X`O`+`_YRw)F8M-#>WmzA@#|hxy}3eP5;a|0lVOqgny})hWH|H9;e-RE zG<*dkqsQ~5{c6*i0~7?0MQ=^uUr@eDft;bV`ch%)LA$MI!TPGYI`r*8lDDZ$&fb3yL^2oa%}CZec|qwhU9`l;=f7K7 zSy*6cU|?V%gj(#@Aa&Mz{Y9rxpV}f!f%=FbUnrd*)LOjnV~5k(nu#vx8dypV z>;bSI3mtv#r#|nh02d)jI+QK8mnSfuL(`er6c|s?_g?4IHdsrdhQ?>^bT0U(H;^6) zd%I}2s<1gbYz*$D(4Tw9OTIoI7_Mnp=6~w*2|%)4F~?r}%kP|7k^5CyUS+8tXL)!{ z&z@CN{a>{ZT?~?)LNMX(wUsKpnDRE+$q>L@WOF*VAR@8wJQk7+@qnk4GvgjNF z`4W#rNz}Ww8)?h_6_Oq4RQY zNH@S$%X@h6rTn*;sw5X6A|y2Nj3E;xHDVp_2ZrrodWKYnOn68Vc<4%~L!`B})m3;t z-CjT8F4Lcx_%W%}ifP*nqN1Xx;gS!*UHo2mbm@~YTBZt!-CZ(VVjOM$s!j1fjBob; z8RO!n(@=G5|7s*Yw@-has;sVgc0Cdg6wCaLHaItxaSmO=M=5?0uzRO%!z{RCNiU^( zb3fNLB&!~-6`-I_p<{7MzE%PU@Wno!u7Y-3;3?Q~R!0>x_WP~-^@7Lfg zh(4n(_+-)}hJi?L@~%l+&~HhJ27x9~h;GMUjXqBDwpgaxkZx^hDPG^$m>dG$z;Z+A z+peO8orG#adGdK0b)tiDWi{@h%D@RVGNL4m8(L2aZ7C?1I?yQl#9MpM&Canw=mO2v z>Ec-P)kcPHgCXurw}H%qa!pc=h5<)`IhB;rzpN%d9Z7Am+q%$DNgF8vT|on)Q#u2O zT}eg;WhaKjC@ZPdpKn9uFII3W*78u)^VFoY_idiEX_fZWM9|S+Efi`Jh-v$tF>(fU z0vPPTaD@k^ptHodI6g*vFf@W{ONfx~3pNjQMiS6dfZ}3K4h{}#>QHh~Jyu{7&juqm zl$?F7QH&Mz87SPw_EH5}^w2~Q^(Hr8W!_814ivgkPD+v=*KWgt;|v>@G$S_G%}Heh zX-7}J$Yd#)*N_T(yRNW9X(}3BtjN#y%wX_R9YI>DtV*0|2)^I3IDx&#s?;ak?Oy&8 z8RIELG6BT|k4eWzx5K;2m}bNd`MZOSWPFb7QC80`jv%h-@0a2q^OF2rS@3>!W3(sF zi|OgRA;w2eEaB3i(V&H67nJNQpKaYG}3Y=oO}m}N};nrxq%rv%|ha0zHkbKBcpB7D~2yvMSLP!_j|K_9on#-m@4v$)T za*XJ4eu3uCS6U{5%WhSd{A4hKZv443fz`uNecjAEPqJ`v_kVl<_ z9mouc4dER0!~#}HPXV@!Cm|7_+56LnBs8t0Rxf5nKai#V0t2;4=`cb7iMYPHI>e!I zc~l$xf5Yv8eC5|Kfr!{@b01Rp9e2`=G~*A!a$A@#I#I4?7dstSua`GSia`$_g++hD zwKXEsd?JgMR+G>WU~%2nu3P1?1K~Xke3l&Jrl#=bL)S~bkC03rwhU;vDTl&n+!7$t zewiD_X9c6~JVS8q?CZEcU=q=RGx6cEDa2tSDQ#NM-K6ql^=t5xjxYw0K%FezX3B?c z#PABCjL5gf9WCDqPju<1$_IPWcYh~7P{2^p{fu}3%IoAH5?#@nM%4dH0Xi-NJGmH6 z8w%w8)qO$aH#)z9D2}QzP!i~>)U+WZ>9E0Az@HC5_a_j9x!vKOb&xW}+ICp*{5|rCs8n75E-@^4wL>f&B z1ZO;dcZ|1owwK!1(b0j1gQNVHa29xr$OeL0`%A?h7b4yyhny1A#?8U8-e`^XNuWT{ z<;Hq8&#={j#08Cd&>ygl!Cm5Fb5JBQH7sDuHkgm1@--(E!BfK0z#|xzFF~&R1FSxy zOM1_Qz za#Y$F7U?uWA-!xZYx!8IRP1jWA}ODH@(-u!`qFQV-2^Nd>3c(BUb_8OiiQ^k+;}z` zO&tvde-&L^c9H#Q6fs4$r%Gov9{Clc5D|dr(<$pIb@mh@j*j~f$}PnpIAPJx8!GiZ z1{$Bd15dgh3T%VB8_)v?im{=9!PEq8V=r`W{B z%gB=Y@OJlihuv+pZ*T_>DN3PtAq+ElGtW?fTk&z{t&uMuP#HjAAH`PFLv z)RWIcGEc^cy0E<*D7wdg0SmM7Y1-mozCKoh1_6fm)sJcyW+sICw;r!lFPm;tk)kgD z&)9VA616(+cmht?2#JLK)#*UQD-wCH604bes76f%2 zTM~S8kS03u8H2V&s}w6$bj5I>|J=`evaBi|fb zz?if6_zplcq4KePzX9(L6$4LT`9SCQotWuPRQVEg2fgOD*7VNY*wn{~X=8W)E$-iU z88?|bJ;FjzznGaBYjc{1&|=8?Ykit6MzBAUW6y4DrOHO{@`r1cQslLk`o zU9%}YZEWRbo@^@gXAD|k6O>4dL!ezN?A;HG!K;AB;zHEw-+kyH2aCAKn%ED7kJa>` zrD5aX95bvKQ-j?jr4+pTY}u6N(K632{_9sktREwctxVc>-)+@o#|c2NQHcRCfxi*y zf(WDOl)$`jq(b~pXz1Hc)}~~%-JitG5{UtAinZoM5af4pim`=-Pw1qdKYwm$g|SvK zV$rUNfPp!Jkn{BPv{UXr;!12P|w7DZ9B0O8Y>lMQ& z_I-2P9@5?tWv0wtI_PM*nj3PrjnY=4_aW2Q){4;U-Fmu+=I`mL=?XAWzLKQO!%CN& zjq4VdaY~%;OA417Vv{ZGH=I`M0!GgL*}RgfO%CjF6fSG%oX# z6ojAMZe2aPi!XwMZa)yCsL&D_{7+XdQ_SP0W+V$`)F{d2oXXuGWI3GuR-#9fuabjU zFGma8OpPc8|1^iu!N;%PP+X~1d`?h_AO`dmE7^wZ31FpCbhQ=>KNb;XltI;`Gm)kD zkJZlJ^wI&oxV^1!m?iY+TvhU>le#QUa?sI-v22hMkcb`i+30~mVdxVD?D%}pj=}GN zEKn|gl-+PB>B_SszrgPHVRF%#SViRa2pM^CG7BHIJx0T=9;6TMJfHE;vI5~qeqsUi zikcc>Kabwds#`rK1{q7gzq;@3M&GGL3P)Lce6NcyHy5`{GVGd(Orl32 z{=>Zh#r>a8z*+I1;o?8JMF2ShtR%LKDGO*dL5F2_tX|D1zl1G#0K^7{_zx0;02u~= zYX9f+|GI(+nLLU1`OE4wBZ*4{sPQi%xm;X*Y^);^63#Wi7>u^?WK0iP(~05x%9#KE z9qZyT^!|8AKCo+>^e;Q~2*s=~UU zU>s#$ne^f9GmyWP4GS|Kgh2?9qe_yaTL1lf*git$hlYm6@)uVR4-ao|{WvK)>;*h> zV$?}-+X_HZ0JtwQm1s!gc?}XkawVTaB`7kLqJAe#TLGZ(?uXV-t>hmZe0=4sePd%0 zZ&1u0E-ni#=idbYC*zp}@XFsC+)33w8|vcwsZv2=6c1zKcx#`*#-gA|a}r9&STaSh zm{Sbfm?0CY6VpgVQb%SDAGzX%Rfww^3F5vW6`3DfRL?so9__lX+Wc^bNl3lx1>wbIF zudy^lI@F)dOfBE5xm)4VRhj75InG?D=)2)>B$YXZVHzG!@rGbKFeLJp&n=2N+}Af4 zIyyS^37|rmaAoKvU}(PI^n5^9)@@`|COn=LSLlnJ+8rL*`Nt81*l4;4GXKuBNfz8iP`7DMVbGth`6oe**K0ZE` zpQ~ud{&S{oZTSQE3MgQC1`Mg>8{9a@o85wv?HwI1#ucAR0BVa_NR6phYb0z=*z^8! zIv9o$9T5@W8SYo1*Ie153RKGww8+E~ZgjS_6(F3=0p&RJi_rZ+-41}^%Jh6}Y^<)X z4xo}r-CwFX*HH;LLQE6gH$6uuCnr}oF;3T-Y&8T1m4Ovb4WNewK01ozfk2A-9uQc4 zeZ18Ee)aHR6&KRbCaZce9{+MRh$iTIVqqp$It%W4-1JsgR|gVh%z90Ajg1<2JFl>C zaF2i&;T3>EoE!^Xp5N}f<^qjz!XVG_ao?41O8`Me7cgl9YR8C9owdKcfG7LZ?1vt& zBcR7T$9s6tIU3h9c7!?>9 zwp%^IY;M56>9Y5O^uGArN$To-m3w%IQL`K!3kzTsWS*4Q=j`SqR}m7i0M_aLcz^AS zF+eerQUHi#8epI3H0cilMADvnz!l<9<>lo&jv{Mo0m=&$;Jjz#=KefpbKV_l-SW$( z1~A(tz`)dH7D5avfS*1AuO&*Bkjtj86^iK~7Jvniuor(iX`7k!Ta?zR@7UmZy&ujX zkf>`Tn2<%v!69yc7pTdjjyohi{|XtEjU^oZ4y4(vl}X3TOeqTFUiN7FDQV;0Y`o4Y zQR=IBk%`De{9LfVvNwGgLvEee^sjW!SFRQK2|H}|@VX;RTKqJ_$`N$E4U^S!};xS3Xp40bjISd2SMZud&@Kh{Nzo;hRRAz#2_S$qIr0D zh%$B73Mc}uylWc3MUII36F|9uPGc}X;qmV7E@T2ux-S@@xPg*@9=edz4_1bsj!tf~ z-T&jgD=YR5@EX(NTLAq9*tCV#1xoB$;rQR!!eFFpjC*Ikvkd`_(9HC@)dRPDQCL+6 z!u0f@D~+%m=&HleKn5#{aN7V-tpsvOs}^C4q0$Z91R>t3%E^INu1);@-D|gxA~;+R zL#SVT0QIjIiG$&2iUQlEY^-V_`Madtw`_c3+9PLaQ-+VHsd0Im+0%dB_Bvaw2iTI_@d8j}2yF470vhrkGDtGGyk-FLz7kzE zen;Fd#|mNlR)F!ys9jU7Q@>lPoQ)4hCXG)%kFtv-5c-d!k6cf!7APaXMJbwzCK2*r zTMbT4(d%Qt4!9Yh=-W$NU+XoO&xDtA0~{RVvJgdc5c4}|Ux5JWga29XH$6~+v@5h^tbO}2%tS15{)avLEFnk<*0K_Rw)R--q0bC8b zSr!F~U78pMMFu}I3$Fx|@;Sgh{X;ScExnPT%BuiajP4#Gkp+b((#>nJRFw**B806UAKwttFQiOddQ4np-jp_BmRaJ!Q_UvCJ z1t6i`jwm#Ty_C%9*oPm7r-;(OT4yS$M|Cxb2WXHH+vwD!;Ag;%D$2?z$jDS4KNy41 zFZ=hDR8{jiETe=-GFjnAI9Yu}nveRmC^sE_ot13~L@OE*1eOoF^Hu7DOP_nsl5CQ82s`wQ!7Egor$fb6Z5d zcntj@W@b%aUo2FNcuG<==~Vy+%^}@7%(o{44A90Rd8wqJ3kD9=KD$0jLfscgITxp0 z1q~-Dun0kRdOBK#bW%ME2WL~{LtO8PsruvOLsSYbeqc4(laRmsn1gJ>aX#(vB7s>SFbJL2vxxh? zeWJr%_sl}Z%h8f&0F?}re6a^A&s8Nho%{C--_BHqOQPfjbaTZ7IEqPV0SWA zdEu!#bS5-YgOj^XRPhpf$3lEqLZX4lmL8YPm_=TZ-TG*tg0A%X?>z=q-<>FiFqO5%wh82kQNim%l{QcO_fo#iiAit z#M}lnkJgiJYg=MMsZ1m>i3!}&962R3v)yk5p5;CPA>?pEsTLN>=z?GuF*2+gs5m@= zdJih-5S>6^e>|c9DSo>a{~IKJ9o;izn{k~ywQ7AZG8emS4b5S>*qqrEQUj735_dJd zjLYRaR6wzh=k1$~TxH0fH8=dw6jSpe*7KT2jry%tf<-l><#?NC{{@aL%9u}5<@q@7 zeu>+$R#;peoFK!?GU4aFq`zH0*iP%#wT7EQyhUs zIB;B@C^bnt4S@#(T;vg!WnmJ=)gq2|`D9^b7&sot-Fsqmj@5?|S)f$(Gfk)!*Y7w7 zZCC`+qdN2-nHYscAI{`fU7=nR>Jq1|bOcbv4iZ#p-f*4LPizNE&|sI)hF;t2^ZfCD z+D{{S{a(T3FZPjRZ5}yPZ>xX`MQuf7ER1+>yte?(7sHFQ$<&Bld02=&R7YcE&D!F zZn`UtiJe<-1A>y2XGfa?`|`0xc?mRR*R^Npo$Rx3Ni9YCC!BOR@5%fnX1K|NK(>-< zlA#j2)kfroU%diH1_vQh8cDR1eU55VUNxRqIb<)yhK1{(L(nXKs9Y>9432=R|6XK$ z4NV(K%t?+8nUL<{16nMr3|_}mumJJkN{QPONb-#d(5PS_Nb^iZbHPP+6&)rHE;>Ew zfVDoW*aZntQSXWCVI^#IBo8!e#a5OSUl$aR8vOagFvJ}7>AT1DU~H8>3?8b}5J8*Q z-XWeb%YyEI<8(?&qxOLhvpR&z0yFchFXCck^FV2WlI!6V0mHT!h8zyEfQ*!8i^fZU zF1t3_898p|2c0coVjAioK)DS0$z_FP(r1JO{kLE4hjF z5#WSWLb00y42*INU_@{VB(fY1XHLXS)>ZFU5UkYGny)!oWK;5DDB&BtAR~%mSBPmv zddO)oh6GAqa4>2hSGg!^j3*0E0gno%5yngi-$eE5Kqj4B5Y!m&Pwa;`MFFj(X-yb1}Tb8WdP1fF1z$k zR)EE1Tz=hs3boeV_ul+c9Bu%SI3GX@N`gXElvL6MxCPi^^zcYRM;nl-DAp{iRC(#Q9Jg%W9f0uxF@IF`?}b4 z(CSxBhBEs#D>a4b<%cl@KCK7QL+=o20Iq2<6P+5nhaw1*E@%ytE8U>LVd!t~D!1w6 zs`wy=xPRmf4RohGRpxj4UAj_1N&k7QN`-O=zD$ub=ydpA=wOEnAAS)5uebVsISL z_4c+F{cHd5aNelD{cWqv7dlGq;d*&s`NQ-wPCOfakS(rP9ty#gp(%((zJ6GyJXo=h z1+~9$n}#LxOg)^4MT3*hLI5s0o1%sVh6u0ICJ~uL3IijBj%P_Txd3II*#c3=xaSY% z*WL%0e;>yi8yI7Ytg2g&`voV)J>$k1wJlP{cY|dw;~N=}HZEK!-v44Ba5>n7364<} z2&Poc``U4H`_lWrBlDyG)01BzKfLuMk)Nm8`w%5LJ6*~aUrl&@&ik%9Z;!Si(H58O)uBLOC;;G=z;FHVbZ z{pxhxP{S5F>jA0e^owxed7N&)t)Wu2u5U+;=(_ckQAV6hk-o8h%czKvU6)914>%kV zR2hbhaE|9A8K2}3?Wvud3=uH%>+e|5I}R%a^ece&tWcK5gUX?a|A#^ThZ+B0 zsPR9{m_bQEwi3E*O_ji8fRBfZ4-z-yF%R#bG$w-qiOE9#=iB{%2M&PX5th$#m!mB8-0>1jg85_=HI|BXTa_agt% zP89-7L`q6ZFV;w@-3Wky)-^RP+41;p#Y=(BWEoNyw4DvLMGuA>fbtWCk_8*C!=t00 za0nps^hw(U&8lUI!n)R0S~n#Xm6OXyAy(YzNXtJCE6zD?orVml9GOb+!O(rcNktnQ z8$&}O#Jt6ee}Th?w5ksHRC>44>yEz*L`O#x>K(Xv+SxJLi9`0?b~QIQ+wm}tq70j{ zlg7XHY@Oay8GLD8pO{eK$TZN=sl%iK1&E&I!hP5LOgPGkz)4@M4M{PnfHXuN0wyQ1 z#f4VS3V^_&Zy=s;CMOl|ZvcO?5XYc5>xV6Z48ksPhYG<|Ymf-IlaQlHp0e<_zF2c7 zz3k2uGLdjuZ6Cdz`Q7>Wr~R>$f9vD*ee2N>a2G=6TyFJ}8T2yq@&UE2XJ=Wp zXpgR+l>AlU-=O14&-UHq=I8E1!X%P?2VlR8wxh?SA5z+8-woU*^6~afXq!SZtP3Dm zpJAvjU`aQGUBc4GWxv05cf&DX)+TqR_gK)g%xUd5$NYrr#a^r|JEohG`^_OZ{`s_i zBn`XAf8a;M6vpC1T>*kP=?7G2k*)P}9cJk3_aJ)4y9YsWHj}>_SgEMLn}qF#p1uYY z{}%RaEX}j`k*)7)Y#aJIQ?xofd8$8Qkl&3(OuSI4d$rxF*xtwMN#0Sh==pvtcDA12u;8yvduUUumqZ$thBT% z5X_{Y2qb$sZ`}gs>L2YAXIg3BM@igM($j&Ld&xv8ENsYL3Wynx>^T@$k|U6Z`j(fi&zd;;AnHR~+W>P*qW}A{dJ0cI_@Jvj#-I z0FoMS!eceUUd)=d5+2>TyxgkLC>t1%fTlx>}bY&56teScvDC%pj2 zoe8*K#CQOSQQ&B^PS4vzU~{g!)xrHtE(wPV+f2Rq%4KMkIEVaH{m7DV#fHn-BEC_H#n(;&wD^PXeYA?J5!LM+5JCyTy1CaDtZUU|1opvCp+M zIh?Po$~F(GVnn~@jl^KdL|~j_qXSAIZs;nQNlQ~ z+P5(Ogk|7-k+OWhBq&v2yvYW_(2%!F0ZTybG(cn3N-wvXYYS zx0}hnNK*1lPHWV0Jiw2-zux@y;9s>pusq%#0t~gS4u2~9ZsJ8=BDTW~qzGAE@~$&TSYR>TIiF!@Q2ijV`CF|GZ?f8PaCihhHkwCRxjGhCA0dkfsf74U zKPm}sRAYMH&&l!$HtQ^H)i?7>Sa+s1F%mou38BikR;YShTFwuK?-cniB8r}Uu+Cp? zyFX?Zr^dNON~r7m0&XbvA8&3J51lGF`?fl+a+3?j0x1K3d|>2f+9$nO&&rW_7#|L? zAN6kGJ98`#Lu(oty=QTM_2}Oisp?yh%3SaVPEQ<`Q+of;!+VO4#lgy|n$cPS>24WT`n7^8>;$YrrqyGps=BbzBIbTVOzqqaKev zy}G&r%7TA5^+RnS-I1gTnyamKiQZ0eZuvguay`wC1vIF`5$okfEyyi(bPpJ`*sgF{f=lBNOzB+c(y>H?`G~0zQ5hh zA|^;a3H3f75{+Z%c6)K(jQWb(wAoY#%8bK9$}SDuezWfch8A%Q)I?(`$hK?%6T@M{ zp%TOEfvOOh`r%D9#7N36y~v$gUn0AOzGhxY`+YdXb@lQ+F7&fnx%pa|e)pm68~J2F z_tO1OQb6chOHRqa*>B{6n$>7r2};i4I%_(ZMSH2m>oB8>_jrQXwRIHM@Zqu5>LBCS z1l6xzRjph(r2XY3-B>E@LPPo+y$8=f5dS#3yX_4H_uGl(78YhqZ*GI)pyafwbpnHn z_%W;U8({OwK{hA|hI81*OidO*;fJsd`v$z7MGD_b`bUM8CaK3Z#HUzs%1wZi6A}(>RqKP2B#S}}<&(BHOl=E(SNZ!>6$>n)Il+Hv;dj<;sXTkRBV<`OW41eWO>^Ehh z77`oaMo&+l6b~s?A4b4w1&RWa!A1E$15L@n@8SE}fw*P_XDSzMbMYy42iN1r8-U!o zTDNi2_tCHpw|K}K{Ve&%$k70Mk~>(etpMnbUVyI{k-T36nrdzm8C_U8i%UF@FOkn) zB8ix8w8{I?!KL%M3SOlRSK3Kqm5?sTIHDIU(C@d6B^!0$XNGX8wOJ?R;lfojyYAB3 z+uRv{WDLh!3Ag`#1f7UxMsctIm?of)oByQPsN{Y5>yNN_#SDQ)XBUNl-Q>Yh$oGcD;A>}TC!FQwI*a+< z)od3RVotKYJ{~yf{Tx_W4%H=Mqad$JG|@M;f(V<0CprV8K1|IPsei!)5_prnC0vBW z>#dIYUV1qQYEt5b5gTPd(Ls?6^&y-iY}|kBIRw^a+Yo|+5BFHamLNf>%Wkz!Ts+9s zVe(%Yfc}Ggw&AviG(^seq@$hoBC<5~mJG{ONb;cbvHy93+<_-s;IJNA&}ypKu7e0fq4+$C z=eUr!&Nnfu6N`wBpxN*Y^m!n3+#`kTPl;Q?l=Z_5F}w443lJ75aU5hOIcoNVT*F z$CjH)8_$*JBfmf~%sD5>ov1F^!JeoF!1YnqlYx*~Gj?7IRsJA2hhxGmuq8;N&7h0p zf&Ky$0)x6fz$&4k%?=eOK}`2d!65Ea;P5;;yCgG^)A0IShW&bzvj{>|YMDUXbkkJ8 zB)r_%j~6}xNUQze!X@lNdctDj*C4VzM!X{U>>#H-mQKr2nkbE!?4ZWQF}20;4^3YZ{a1-33*GVh znlSQcHjnxrk>AjJDI$t!|H<#91nBeeLL(HoA7hY)jmdw5b_oeuMQsD81#*geWTNT9 z;*WDIjT`a_ROe$#1SkkIw}nnZX0V6l3Sbtj_IQDWHi5PmfCQ6gddMkuWg-=zgP>sW zP2vjE0+SzdfP!<*;ADAM9IRtBc51$N@{!I*phr>S zm{N1_m+J?JF3i{`UgXyRVJ-n+T&YTMegz2dD-_#G+m0mB=&@bO- z*$El9`~9AqX-XBKNdF_{z#!hc!-q~*bxIHQP0Cm}=zCWTb6&V*rskxI^q z!=vwtiy9d=Nn!0t+>VA{5Oc#AaWr>?)R0H}K~|)y2fIq?f@>3p8yu0tgtIXaD|!Fb zs4(I;M6=v?Lb(JVZW)PMdLev#2{VZy^Q%EF)4^sj36K1AZDZfmviDe|(TLbKVz~`c zdHh+#ukCa~$dR_|t_$GcGV9G}jo(M{jpj<3ByvH*LMWsyC-ut97ji$%Ax131t)#Dy zZx6#cmi|Hd`SirU^a|{j$r$w!3%M|Dqhl_vNJvgdDOnDt)h$|oHJB#f;FS@8_YT_My(Dol{{Kr@4o5^TMrf~KC60%IYpnwZEjR&em*_!jwh=v zalOM?EXDas(rxOIyV!8skuY~$wEof zKP6psoU*v&k8$*&QHr8iB=NC3VUM-%Ok>7lJah{9LFFMNp}c|QuAofbbZGn0_|xx! zyO#hkwnvg%Of)4cOvzCPv6S$K8@y=XRu~%eUbuXre_6G0MAe8VRrk5F#^hH>1hWCd z1rWX%^A&ZIq?>EQw>_*Z~0bggZ57tIGl*$phC1M+W z@?POj$atwqLE998!I3fD3&G1WtVvX-W61P$LCF`GFK3X$8K43oAV`$E?6x8brmyzA zU`2QbKo9Cpe8miFlta+qebMDN&(WFifL$`*O+?x5Wlt5iOh9ALRtagk0IBVZY;+648T_s^7cyHEvX{}K5ov!0~R z+aL5R@H1sRsxMU}(gEnV35s1$)o~AXe2aKSe??q&t0v+$Cue8NUGHGwWF1%A7lE%n zOVed5wGrLe8msVdc2?N_K+vps@}{^S3_ zJN+Qo(j+rdI>8aOl35&jDl>H?c?-xivU`**vA5tCg_IxPXYpS!`b=a)AlUjsQw z6;{KdKdh1!A*c{BW|B#%rZ7MWH^y)!I#hFtD(TTkn16m2v&pLI^ia4q{ai|r%Nu^q zY=h>en7Zg@mpJ;UUw_+bNR<2~m?mGQdn<^N*@%r0eYEnNK%%w0fjHBQgN~1rR8hBPs;SnmCVVVt_eK4frFMOBtIl+OOy?I6&jUY)CSP^qoQ8rBe2a@vaEY>YPRM4Vg`fK zQ)J@_=+y!K0VsvnLE2I#k@la=5Q-@XE?7;<3J3>MII53#o{onM_vWY_(0BU4;5Q&} zl$;M+0*e`dyPe~OWFjO*Hbts4Fn{}PEYO?56HZ!AS?hx`e#ylQs}66)nDWx$;IN9I z>|xnyn6MD>EHwT))aa*V6u0{_SAcJ+-FV*!^^sN3@@%z9j!Mxc*SN z*01GBr(2+;6Ad~(b3=&t@|WS4$eqX%v{=e7Wv(SsEDl1T8{kQog9)^+E9!5>)Oxuxy7DRfVWP+lk=`q1k;4eGQ$C zcUtcQX%~-imV%gT^7duheL^kS8js=dGqjv@ks17Ax*?=v&thkvaYcxq zcBE%V+Ru{i7=oUaW zol=e)=!IZ9xY^O!@;YVa>Y+myZ;?xCwv{=9U^ZZxiB^QeJV%j&R@7l=ff>+Fu)B(_ zRv6NBXd~!w@4Z~D|94_WEbFILrqT_Ji{FXFqzw!tzQl1_g9YC69^^R{qi_5(b1m8# zc-z{Pdi*EFHQ*EMa-Qkpq6hQa+%+3T%xfMApJ_~CaZ7p8TgglAHtqK2`?e{5<{(f0 z^Auefd+l92wyIRpS*_3*{c@px@^$jCY-5X&Xsc*zP74QT=E`a=I)}F=T11It`odOr75ZYZj z{#o%(IywcdA>#6(4;w>j;_9W@|H0NdM#mlfTR(2t*tV_4b{ea3V>GsH+qSL7c4IWQ zZRh#*fA3xQzIgItUd_s6WzNhw=ezg*Y;50z+i|&20mB1Sjn0kt{NBNRef{MqsmMF} zZ`@2M>fk#U!Q@jWe<88JRm^@XTd;ri+)3DO+&(q?DBF4#az=*rS9xRfa6v^;MGLlj z>*Th;5gky7gf>Rol?Lmpfrp0n%gyik9?B!7?+*R#H3z#V_1` zp}42=yI66e1t`#ixkg}uMKswFxlw=pxm&HR6SLLNb?LTgnMT7{1HX*I#LtVCfwNS( z`97JFqh}NGJ*KFf;$>R$c}Cgf!TRXKA5GDCgN)wEaQVlbgX*OfyBX2gn&0SM)#kns zxZ=EG>n~J;`wbf%d`3<*GH&Y>?a*Y3gRBl;%ZLfeOwqnY9P;5;vd?9E<7tC;_JN?^Y4+HjaCvmT1yl2sa^c}{P7)oUi6d6KJQ11{)-7Bhp$d2#@(|$ z&!m`N=)PCoApXH`UO*CHwrH!CCZ&l@{i4A0lW41)ZT52*opzN^StHeULXN|G-cV+m zQi?%m-TDVYxkzblK6ip9oRdajc%w07lCz4~oVQ#;B)Stn6bzg9^>xxn_O7Wv&p11w zSWH{>!K=6HwXM-s^t-b4%-dO=9qXJi{p-cDeQlkYuE_4BY)Vsy&nA+BpAfwzjZz`@Sr%GZ_6 zodNrRq}PcIdM9*pWdlt)5FFAq&#{VGz2dt)gNV z9n^X{h|d5Bka>Qqzu;_SVE^Ot{-=-pAB|*MA|JFT8GS?6yS|AM3%=?vW+s`yZ$Hf4jv0_b>3Bot*_puL@KHN`d{`0BpFpnBw*;1dQ*WKYsvMq#4`Ex9BPx zV`Jm0swyD4et-}B2B2-j1S4kH3KC5i2y*~stXy1N&0Xe@jc5xC3#Z1^z*7(q5bp2q z<0J>1)|1{I&n_-5PETp6sA})&1q8ZFN=jNgEsOSVrRDnz3QQJ#3(`Kg18c zQ%c!5eZ<}Hv{_s)3Wcj+&HQ<>mg%zD>0%RqyXo+8xHj14Ty?QFU0~h+;$%yc!|UU8 ztVv|WMSrNUxHmxgK5S^8X;Asdi>u=9V5)#05@q|-dQ9*l0%ZI|p2M{?s5N%GA1P!Q?thM-BEMJpv z#xmE|vR;)~@?@@ZN*KxK5vq2XVhB2`Lt|K}fmY zAB{P8pWTryh-<6YTw{9wiQD-bK2m1gfyaq~q7HWeXm-i1KfYua_bQwioMj!|1!G$w= zt$p%azDK`;f-lR5^?z`g@=d%V5Ir{<_s#y0xAaP6sF9tT{?RaKd|F-pmur785b)3D zBvt`l^5Gc5h%vx${zFSk0Pr0TMqpA)2jjQmH-mqU!4XC z*Yoo;kp7<<8xx+Yy}RS&kEp7$+8v7GJ&=Yr+o;n}7V z#ERLHCxON~ z6n8MOOz72h{Vw!`a4rN4)W91z2TWT<_W_uLUm(Cr)}IC{Qe0%abHC6KftXCB5^J~_ z0W)(TfPt144_MaW`kAhQD8No2V7Lafue7+hxKaR#@$&;{>!Z@}0e;w04J+wA0-B)m zU+zy`KHl820U`%FUjsHSF2K=1PN464I?VBrOJ}17D!i|KD#}&=jp?99XoczlyRd-U zji?grPkNK1*`kOyd%!_&xmfwP-Z-Mwr@nM>{wI=u0TRCnkcPM8>s>|dKX427&ow&_;Z7`=F0|VVus7b}m8193KQdOgu)I+Gu)yd3 zqW!4%BZI$AydpjuV= zi&bcs$h+t162%RkMkzWORNB98f^hp})gvbrQ@CZQ@q>w3uW{gVm3hl%b^%E`rb7A0 zRG5Ok=Gy}Ra4Le)g9yJ01Z@dPXHkie=zP^7gf53Yslfr;Lv<6tOueSS5OicVK z?e2~g^?iYY>+o+=z_56vjC|!5C>H^0_(tdF9p_6G0q_vuy&n{NdRVnd0vD>TuBNjx zHcraOh+qUe84<9W&IM(yWyXWU$H&)B2Hd3oBp&G`nojq7l$&XYpXkjYmwhO%P{7p^ zZ2KxFbsHd|=MqU$Q>%d}PWwMYGLiwHy{TdV5)JHnfS%e<4f;dO)_^`58s3Dfd025e zP9Pj;6#5qnb^P08iTV1INkV9aSt8Je6Hw14^`(p#lk4J$eT7U9cAUV%L+!7g%J^Pm z=8oUY;hg9xlW^#=xfCU|Os`L@V8WzM93?uq%}-BuBi6V&pwN)-kFVo6eYE^%oGUkB zYmx7vD3a-itHH!(Q41KYufIe4RQgTKcq>8-V0 z>ITUS%U4L0Xnn!fSDrsD2oZDrU6kEs=Cx-uXyt9zO@*4!p^^51+=hC(K)%?^kg>H; zS;Q`eCZwd~mKm4K?GBD@hzEC6|yXYG0be(p=sqXh`5ZUaw%B>;q% z$K`@dr3o+#Xn&Ea6Bexo#OEyp$x-6i%;5GR;S%{AlbnA7+c)r-KPc*IXrn?YMmWBqoJ`l&tl*`%A(~(TQ zkymEU?U39CCX7z9JnUZ+BHrV4#?dPVG7GITc*d^ zv~vpi&n~dqViN(|<6Ei5-HPT4UzBMCgdJ?52CVkFUjw+meR)D%b|(r~1C{)f%?Agi zUkN!SE(FpHAaX}7v3#CyjJZ)MWRdDXTP>EV@neTj6i9dU>3ER(;E~Wll&)Vx`1&ru zb%3ske3X$rDu`zA!ni~^LH1hH_m}%CksAphEEEP5+1f#SdwZu-!&O1VH|KcDdR&Z6 z{>s!N4+{^2>v)y4N|9>)_8o_ZjGEl(V{FpR?SxH0NtxC`LYsqG)A8IK>_dgk|kB|#0A~t!%XVY8J4%s@WMXG^xi5toGiE{ zI@Pb=Tp&9Ot;SuGpuA=xO-+j3EL++-T#ZXNqWIw0PdI1iv=+jgtQf(2u6Q5Le0B%6 z#Qtd4g6Smc`2ji(b)&W>lMgzb!Wb-$Y_}{$|FTeR3QLd_5oPEtl|a!&AjY2`djz6? zeBECSid9FgwoZNJTNxn+AQ1K-ST|ekz)f_2GT}`H!C^iT5k(b}fx70tpeF+O9LT*M zl|JQoC1_bhQNAqTOhGL$$n*0SB*SD3i$kDR>=I`h~{>K{_CdCozpAeJP z8>0xaRe^FQ^|H@prC)6J*ujjIs`HbI3kY*pluY3fzs$pb)Gb8MEJ4RYXXT?f7yM0P zl2wFu8vE@O>hZMfx=LW$WCPE5Xn;(~k&GIE`Z3H=K2K?4lX3n-AV>}xW)fvm#=_#{ z_Hat-h$O9?ZI}3WkhX^K&%k)JY=cm@K>C9+FthzGuVV5ArXFxyQYRW38dwAfc=|9? zn&E;kuF}VvVSn|e={=E{w;0bDkT~S2v!g3+`Gsvk#?bb_87_B zkg_mQ-V>TB(K&w*MEMZWt$h4E&v0&37!UlTy*|92)j!pK)kZ|XEut#JwJE(ZAxnIMxj4sx!;!QLJQXn~9rUndA-w-VB=R&X^t)-E~c)M{*OLhbXPsv^`2 zW#$SJG$5W?jNfAwPayeC`ukD#-hU!o)(;;$`Pr>;Orj^|uJpa#jf^WOvA9`(5$AWw z+hfb>@86Iumub%UM?owlwO4&Z+_)A(Y+iR>oqEEtPlS#g_Upn*ek=#$wrZvxSDZzj zkY;G#l2A=6^E}B2a|J6vc$ZyJG6yDTjfr{GIwN3xzr5>q+#_jRqbM(hj>k2MD?-ac z0gfCV!0vVhY>K1DH1Am^9fS5vTo@mr+%{1VmnJ`t%q>65)oGrAe$s|85#O zGpR^mu~d?+x#`b^va5kW$_jp-w$D=VmnNM#Jqhdy9Yy7vpRls*RQ}3fUqITFsx7w} z^cVNb@UOyD*7HYf{Z;g(!tBUG-4)0vD1r-hiA1|fV|goP!C~6LB)`Gd&p?Yc?C7T{tF+;+I1y+Wb?5a3UkLfRPf$S=0v%SuETytcC@Z88ENI6~$rZHLFq~4&C~ABNy*IFL zxqIr)9jxSr7&bZOm->;}H``_NBx@mT8p_fGWi{`IzosBC1W?OFmq*Z`493XI$mNd_ zdJ&mAno7x#Xw(h0w3#SxSg>28D@y%}DqvwaQULS?z_1}&aZM7vJtxZ=AgnXa5cnn7cPlLm?4|o z$V$vtMb2SK$1^xbhv4vgLO%;$V{Sa>jwcGDqUKQ9`=Lbb2{BzAwn{|?b-NM;3>3(+ z)?e{u9Ohsa&a`}>FII>dxWrrrIPYuLm{L4z!CGWl(48pJRC~0LW)(}7iM3KB`p)T! zFs0>3o|HfefpqmOF(%xOW~Gy<{p?VwF)>Y1ETmu*acO{$0!c4JGc0S*@9uNOSaI3s zcc9!5J=%X9va~txC{P;;0YuRFg%PH!G5UeS<{rcN%1h#j=F{t#Ri+m|kEu(F^btti@u!eVy8=b>4$~y85WTP#%D<+^g-qxmkAY8pq402uUMc8)B#BqL zZmB$1%7&E1fppbEq8ISweNBZ8n&v#h29=HnDN;f=Nst{xDnaK+hPH zM5Gue63!KYr^jcB-%0#}^;$p#Qf^5ilg7ygMkmg4%G!4mt zTw3FHoRZK?gAAVPg=ph}oa)=qFg-O#GM8hqYd0Q06ACSxO_613`iaay<)$H}l}v}` za+~x)SJmU`qV(>@<~HhDPPY*vVQ`PQsHkXJAws(#I%ju}q#|e2K73EA zeE^0D{vQwrIuqt3-PW}5aJ%v`KUjspF$ZF77vP8qOb1d3NBL;iq(_^m07qt@r?Rqt zC&hTO#JnbhcB{e$YpxLrmaV-#$p$1F3%!Gq05E~3L`lS+I^`v)3+H|YB!^qHK+)Y354owVPI2*_652@0}@2nVhVa1eu6B73WtS36{1Lf zeRsprlK+vP6{RYx-H{Kswp^g~s_JGC~UFf!raIzH}UT|_qJ zXbPuGq5_Azz^YJ;#zi%*td)Fq>e!#u!fspT-!0mSuM;T3nBMxx^#^0f^z<(mJ>`CEA04SgiCggmw5GMYrTrCyy%f3sGFYbM!dL9;7Xr0uLS}6WvTD zaAm=G!~E=*F_pi;W{=&(fBregkUw)Y`TcwH)H?=R-r4SJ6wf&C=Wa=!fu6BhgjfIp zulFOaay|iM;jo0=l8xo1lX}aPtb8b%2CBE&K*J;1OCIR(AUp#zu7)=hv7v^H6rx8B z!OlDvYeg1-L0@RiaR|jRR~0vPHTV?h7*etNMby&HrJ)`g8-EzqA8Ypvbb5!+aT>~C4573EYqrh!UW$n zkWX)7+50Oq>cQwcFj&>KhGk=-*Ev4nWquv^_5$rh<{tE{xkgXuY0)BlJZcITjeM_^ z8UlAHpl7G4qCoSx^rm}aClM@et4KNz4FLli1&1efS%dRt`l{otbahZ>scnsgOzu>Z zL8A>lwSH3(reLl@MOi40VzH-DM+rr3V3vxQ81+e$*_|JJoj_*Utn!a@euiRN4rR>YrCRq+70^4ope{_nsJ`>wymz^!O)9a=RdTwxsG1CwM6?`?q5B%r z7_`=*C0&HSRPBAv*PbEwUKV0Fm7T+T)!nwPBQPhkOG?65xiIjb?nZ(#waqszfvavC zn2=!W4$WsQ1etDAc(L$~jnJNDTxCzTF5YAX5O*lmB`ILvRiXRIJndLkKL(ZUh8?*noqB1DZ&aCOruTCT4*hk)$s$<)Ry>Ng7*Q(>?<|A_dj6 z5(DFi2SOkoj^mG?!+KKbT9@YT5o%4A-|vHIdeoMKCp{6sBX8K}{ybgd_Wuf?h6>0t zVd@XYwm9>zLTjW_m5wOay-UB_D3(g_%%RL_$P`bnCjI^(K|p!vrF)nqpYSyOICqMJ z5wU-Hy3WN`>tOqZBg0F8_E1;}R?Pxm7!3Sv#jUrrMm>|?MXX>Z7D%&0lH>^1*@RC2 z?WE%rN%m?lCksjU^1{g2MP3dt><_9+T*5HbB}dJ(GgG)@DCiE*>Dw*-cFcjsILg*c zV}YR^lS86RgjU+$Pt)#Hb{9WlQ_Q8?dF(1M-W=pZ9Q_p`&gUI8K{+!#`<0Z7i>+hL zpC_2JZ#9mex7wsfrv57^dl$cx5;o&)-uWQe;hQjj8Yrz=r7#H^baTzC(UmX%JhZV$ z{{{GPa&=gM5XGP>-HWwlWy*k#2ZBX+vK5H2APr~@Cy-yTVKk4WNyIi zC$&yHuwEJe{ey7aER1fR##;#~@-f*t+1r zK%iZ*58&jCOiq&1Pc-lWqQ+baVxJx$A^=A`pSLGwY#}lfAUuM9`~twG0s1pAEaPB% zT^-)H?{9>FfZ%n%gI?MM7#4X7v1xS%=qPm&w_R0rIy{i0`}ekAt2d=75$+?Qap$`q z@1zO>g?mGCsuxn{@1M;M&`Kp2cRMgw+!Bt>R`-*xnBkW3GQuel!!Pw}=xH6VVQ!A5 zb@t}2_fw-VT_!3jsEECYxYjAX5B}Dr)K~xJ6_}$Z%G3l^!w*TBzRRmQQ_FK!tyQ68 z>7kg5&Y~nDtu4}aw-*0Ozk%fuGrX|YW$N=$?_k}PYgsY|>NUQVJ8;>~^{`(12F8y~ zneVVaFauen#1K>BXDM6^4raSDf`7VD)wiyiH`{IK<&k*#e$p(MYpqbnpy$M$afCvk zd2b;=4Pk%1CebW>U;e$z$O6EVcYl6(jDVY`6+uGLR61X*!36YgR|2ELx2J2~>_3VD zaJn(3DfC(zIVTd%*Uu&VYB=QtWGAbeGc=#zhAdXIrY}--Dh}g5cwQF#u!Z*V#5H>E4TGt?Alu&iSoITI2lyjA|lu_ietK$X?}ID+xHw%{ihK zzvhN+6-BK>cS=ml+er2N*N-Nd1HR0UPoW_L?Wf+Ph|7i_>Bg4thg0rGn#6Hqt(P25 z!&eNPAFW`!d*cAb*OD{Jsu$te;XS0`||9 zfw$V+lZLPz!|wFUetE1PW;Qi6aW~QIzYY7Ll3ah&B6Vmsk_eWNya8z~*qo*J<_PD*-B>=`{`u@*G9v5!xGx zb|z|f4r#({_3NpIL-o5f)CfTd>8+nOP?T76%+Vk0Lv-`Cl411w8h3m7w~Pry31v=x z!r-mgK-DP<2Y?p@a++5_VAON3G93BEIX10jldibfcZr3QyZv`?!?#635+j0dc#}Sq zdkvuv1o2d8zt%r`4GDHl0~uaAyiV}H%uK71^FhD4N9e`#LzB6&Ev91?MWDu9!_(cC)=0jnf5v3wc8!pydH8;-`^6Y0M_zqGw zrX?qxd=lq)KPO^>iKwTeGISTIeR{{|qUj?`Mm3Is|Udk=iipO4B z!%^Ag*A)mg1bp`JMu58uyjxtup-wJ?5r`7CtzIJ~O9Y#dNqKp>?P3ByQ1}e(+^chS zb2Dqzcj%komy5AuScvG@$Fx1uVxw317htVYB}q#W{t}i$LO7i*f=l~CyNDN7(vD>* zq$pM4 z#=z%#l+Hv$Xe?83o&S2iLG}fU7t%@MS8R>+?4K=OHJoWUu3TZ_7t4-o%=tM!F0{X{ z@o#OF10mIWM?{5Kf54AG^?ffL@dxeo&FLjmJYrmFwu(R(Q3H-iBOv`dPnf!{ptQ61 zR8XYgv5ePOSNgmJ4*%XE0&9cwGU6gNldB$nD#os)>^8$qWEOU?FUV?5t&`&Q-p>g>#cJ8EV9d2y{A8H4&1>tIZdS_+QZY ze}a!f;ptf$6#e||@$4Vcda%3f>&_~^C(NVvIKNS6^WfIhacrjGL!D9~gm*TqaJBDNUZiWy&3*lJ)Wt92IpSp5DL3yuGYK^J68N z5HdpScLVf8=FxB{)7tRWKeS>dz$V{bkcp11ITmI5JW=p zeBm+`pc9(#93L>{d|R|@B_+N*t8{ssW*4Rxcku!au1cpy5Q(vAB4U*qL4m`&J3^m$ zdxrwqtW{+`oA)wHL)c>rnMYFm8}XeXa@x{ee`&zRF_lR1$UhX2vE;14rknnJBL^Am z#l!8AR+PXHqgR{n)&&!3-K=OEC%boLdq;Zgkd3M66RK0wPm|fk%U_k zC*7(z-TRfL#bhPSpP7WN_mZX@wLTEu(&+L_B4Qo6@$~Yq=b_l=3T4onyc%Te->~TD z;P70|TEHU^MQaz=iN)i5rY!7#20iACTx*es=(o`y8VY?h2h^mF)N9ni!VD#-s4fYj zYYgQ3`1?*}aDULVfP~!{pEe8Ze|LdF$YgO|PUwqQ&2Tm^RaHCgX6K_k^0&+W7V-8nUKrtRw`>fJ`E$ubOs$vp&RKK>Hxk_hOayl8 zo%<1zE5r>&`6(c0mFC((oF1OOPag`IKuq3JZ3p=d;;u0p@-gUD{SHyU;`f<&iw;U2 z5oQ)sHe>S(#}WsVB>YAzOOK&MO+~@sXe~*of^KLG+X>I?B03( zC{zw7#W~`ezQQe1V*2d=ST|(-1SK{!&plFMtT7`2mII!K;+AyQx8!h-rlB8#{%T}S zL~MVKh0-eoL!CZnBiH2%FOTq35FhQ&k)m?{U6vgBV!Tqdwdu|(Wa=iRRJ3JmM}` z#{F|KgtY?8_2z3ezZToYOi~yLMT#Y8&>gS{qQtyFHq>utd3KNpR#7+r&*X+ z7|FAl%_WH)nwb-3B;!g5l9ZPp4!3py3?l0kc+ry?oa06;vxh)HRu-3Z1qBFKFMRvi zWw$#-q4(C~2Y#jU4}v*Fsx%EBLrm)m$yN*v0mg!;R!JbWkw8*8LA0@`zZOco(pWOL zL0<hH#IRK(E}TXtnr04>{tTC^)zXN|9qKCc=HD|5Lks>R5J_~ zvCNi8EKL)GzgTa2wC0xHrO_VM1w(c&%l3UHrFit&I@uMQ776JpJ2H;4mbR#yksS=- z{&`G-=!PI=yhp638nfP~dJ7_6I~2o!+!dJ~2sv5Kt4Sg&`GzB&pi4*A>#{g3U)s&W&-iq!y?BU1uRTJ$1 z6R#3v^>57OgS58?&RE|wIJSSV-~zYQcvteEv_4!`Q2Fo=QFw=vd)EYDfiQuWmY3|-c=#I6L8@VT>yK28PjE~KdC z#3|A$T&!dzPIpWz-f9ZJ^|lQxrKMJ%aOPlJ#z@?{H+bCQn+^x($o-!BXa&d7p2$(> zgdp$68az5bk7|wy4-W@S7DVQ~jvYSbL3e)kxr`9R)UDK4lmJh0ypaJ17bG&CNfz^C zCxQ_Pv|nq>{jM?L`QM#0b8GYL)qHTc!Js%=k%JAeMtzwvJLBP6u6f)0%q1~%~#O_~)WrBT1>LFhY0OLBC`5j+?6oMmx9h7EA4Zrz!D^!D;&~Wh8Ifdd#IgfdA(xEU|Fc!fg zlWh$S0XNOk!I6FYNdHfX?mjNf5r2)k=(vzrBE{?N*924f93*`9mxsD(qoBaO#DAmona1HyHSsxE&iwT^`1EeQn zFZx?=K5AJrR=KJld#3#(X!GAkD5IgukjW&0Qvq}7b^;Inh8vt7wd=VfN-*vLCaf@6 zMVjALDt-4?WSR(nXW=_Z5_Xi$Gkg&xQ7V;&P!rid{Q;4_HDo`!tJVQLw_$8)!MCql zmp*tvFSnzL^iK+BG%^&S;q9H->FHQonXtxhcxz}o(`!^;g(3_ywr8ofkxan8E=J;~21 zYN`d?-^eg@f+9n|tJP#LiVqQDFdz&c77U}OTE882Pe)pQF7}5VGX5$4$nvOvUFy8<=D}dJd>;m;kl48GIyK!^ zjFeC6goj5*RZEsR{eFX+tkpXBW8`i3QIpNxUWLau$9uaii@jP{9$PaO$0G$ z)bPno_%iWKu68w-Yf~>4^1qh(vUwg}PeW|yd#|o0J--=wL>*+f+{Ze-eu--Z`?6kp zWnREj4RS;}%JOft_@5Ere?9(JkD@OTHJUquNiCW$e|%C>ku6zeBVSjaJ`{N7|8Lls zb$+he{#Tvh!RbQ?-h@fDeM_{y;dW3T>J;z)4lsdN`Oj-%VPU0aW&$>f!m0>^x^I9z zm7N_unqCNOVrps%aG?S7A*tD35Pu^RlVZ&(g3WbQGQozwku_1`q(w)LMLNt0dO{_6UauqMNu3JI8>F3N^_(y(t{d|u!s zI8pHMQD)<;bB4k-#}+JY7+imI$htDjhoqzYs|KRa4q)1f!~ONP-8N=N$-Wy&14dye zCuMCN7Mu0D4(IWkYt}ho>l%7`d(DqqKlOmB{7nyOH4H9#*g6CF0b7eKrGhn%Nz`(6 zH|4*4r2IlSFY|Xh=%=An=d0)T3DQNeC|L*!*8746Bnee|FCrxz-&J|`xwtZ1&T^Vu z@e$U)n%bB)SWSAWV-EAiAnBDj*#rr53W5=^y;vmssZcn2&TIIScX`^H7x*~4*E>^M zo2gvN__X}C3W`oVs#TVOl5sSGeT+=Zxs=%`B9)$6{t?w2|JDFyK9_T~!-IDrX=7e_ z{yJ4_6%iOUewmR@6&U?_7q*Avxmv#|Su;RZ;9|v3Hb==zxOUkzeZ62-(=ET+dFa^# za&Y@+80fykJ$l55ZL~=LW^X!U&^_;AA(MRfScal?&0Wo2gv4Zm+5I~?B=tg3@Li8wnBLd zq3=mFsumj^Z2;&-MMcHTjH)Bb9PMTK#)Kv93;zJ4r0Co+imabWLe+w-jX8=gg5&(~0T>RJ3!#kQJPxU2!CnKxMX)FEt-ogVgp$dJq zUh9gHu+-ixF+7zQhd(hkAbGVOir3Ck%DEi=3M!V}3H{j`pCRg^R%gw#$^Y>J6+Bv# zGr-#wmyKn7dU34MnHS|TiBX`g{br>kZeO`VD=63R$C_oy5ocORE*8kGa!rriobr>1 zuVDRn9G8q1AcLW4<_Qy1NrqIICS6Ch7tOk~v~Jn9e5Y+&HDy(P=P=Lk?N_ zn>K;k0nI(7=0_H{&FN{@N|!1x2$$E6gEH!VpB{~j^pJvt`~As1V6+8J>Z)g%EXJ@K zZonZ&NJt16tMc$G9;wqLjiBsNce>q*A3XyA5-IO@fcrC|J?rT9CI@(*yfD)(DN3_{qd%Zs$w#`?ncRE$W(FbX{ z>dgDv+?*K14< z)sYniYT&fndh|?r*XL&+$47HVZpXifJkU=~s?I*2?eHsWrI?T=YkpIGxZrrP*s5&F z7oj+a`ea?&D3DXr+}V%%s7*rwLwScF9S_Ua1lPMR2{4nCUjg5+pjh2CsGn3-GB7cu z*JHj!rmDYxgx#DfD_4=Ojat=NUuXGTLsMEOeIJ&Rmv~!Z6@W>@#FX`^tV!YV2pitB zn{t991KMu-o2sx1*534xqDU#v2Ib%!22aEg1>-C^=|dtb&`~MTUsEPv&o{_TCZ^TD zM04>%vnM20bMf%({zSy*MngdnZj%D&Pe8Qi_2C>B8=DJ2)o-VHy*_}F0Ut&Vc6I=S z0g&he_yG4Ox;s2PJiu+~WsIc>76{T33=W3JzPTPIOz@vT0{TK{{U3p)q}dd%2M$ie z2?90Xzu8z{Z?W1;-|Yj0E2=dBceiLpmVggG2M2}{7*QE9sPYNWKH%$T#&`#GLjZX3 z0Gn=LK?2~SCk=7GcVF>b8Njfu+codilga)Q(svZNp}fC8ZW0XxcQe0afTtwLlS*t! zyF*)gxwQqtaZ6T-jM9JSdIs3abG#m~=L>l)D@IIAEWq@qQ&~)dd`a@pxg1IKmxyuj zHQ8qtY+2H-GpP*`?hp>>baGM?D`mKMR&_TOU@_a8T(GG~9!e-hbvL;%OU{)lu=PnF za5Glf@arJZq~yc-yPbs%o(fn-@XoQ5EQ_aOQg8^JsNQEhoFd|+lWgOp8U&HU%ozKP z3n&%}XWFcI^%FKv`=P|2T#JDZW6P(;@po^*DJlmCv0ojI-DBZii_D9EnE_w+yql^h zTCdU^JjZ1z2oer1trmw=V&d;!4)JKb>t%6>=Gku^)X+ID{3C8&x90lsT0=|TBs+1`O z5us;-gAMcpK2gk2=)!OpfZs0$FP%RbA0H3Yno{dS;ahZs9N|GbzCGE+MI$lh*A`nY zRYzbl2BU*I$)doM?x>(Ng}@J62v&8yUhrHQ0`8n#9A!uXU*^6@qs1`97R#ltXvBL@ zgP3~0e3jdg*sQ+4C*2-^-iVvK%^fT%gP+zIm^rRTmksGIDb)x^^TRfMcZ0uite1TW znk-cVcJR3W*#2&mMrgP7a(hobs0zeWv%@f+FT`6vvVX|7!>a?#}{J?eYk>;{%>&Lt>x zQZzQ!o;M#6SQV*$i;Qz~*K)UIxALdrhVr2rLYrycgY*?XoNb(V6^?n4-t|y$%2vAt z2rMGQfa!8`#5Sg67!r|E1PJP~;`%WuJkm^lh~(1y>n9_r9|RGsz6i$UKp5(v_jMJZ z^i5>(JOX9B{vV3GhVh{Y`nahjP|1-I-2VO~cReXSeKkLf9QTNd;iNySXo6@ z`|A7)H;-)Jy3<3D`u4sHiV@Y5yc&p`mlv(W%jhg;nqoL z?A+l}w1hOZP%SiT6V8btb6fC1RVBwYY>RA|_SD`ZY`hYu5!BR)jag>9LBYKrYsyhd zy&-N)v7e}rXsRNK!AXkD9jhKKmrm)r<3{K z{V)%onWF*2SwT3(c1Txflo1acI~rjn1y~~#)lnQGP$mdEl_ZfwoL9JS2x%+6 zmOxENZZE7^xNIds7F}iQmS<3pjBoNyC4E*}LjnF0;L1kH`R&&mlki?iPk%u7j-IB| z0*!6(=sMYMAmCcCLMll?ZsBeNUnsP~=QNaSD>(Vo8sHt-DC;X~wwF?iJ6Rbx zJRhZC>Ur2~_ehvlg=jnXJfP2Yc>ALcIiRnNfd2wX^$6X;e&nGnNt!e<&_wDl;D-Qe z=cYj5AMVSoQ#x6-?&SsERnR7o35Zaqq1m9W6&N!q(g65`eb5SskrfO9DtLv;vvf2= zJ;MwZk;VuY6J@Nd?O&rrW-CX`##m3`zbrrAbKXED=|s$&}Bgol4JC87!iSX zi_T8nwX`Iy(PrL#;Dh6MawOu|qQyJgOSgZ-`z+yQwen7?REivNTavZRY%#zE(}B}- zoUe20h*M;+t4%N!Nc=ptb4%xw+ysHK;1wis)mmXYQs={0k~|U1Va(OQPtpQG$->?J z3UnSEK#)O;fY9i#hM`g-DXQd%b`fy=!g_8Z!%Vy**4+BS8>R>`N+}>Rj*QbY1W>#% z=ru*Bj(82<~eQKNKtgdBAo(9u?*|V7X2~gp&S>DwNb|eJDQ?bg6Nh6*t-|C zdScFe=U$mnxYXOU^=vJjI+Q+F+~%g49uM#%EWZWyeCj&P0n@|;U zjA}q8(o}8`9TY>GaI)TWC!Qx=Nq%%*)&QkdUd++CU0nh|&~}`y}GhCtTu2qjZ(Nl8Mn?1f7us$WUM1cfJTfh7|YmYN~>-Y_PYet(q{dQE_=+~lH!m6T_wqL zEdpXFw2%dAby{Ho&~zjy4c%9|xQ2|1dIUGxWV~}W!X+L8f+#5sB`JtD+oLc;ZKzUp z>x=D6!YfsuT&@Hbt}nJ@rLX$az*?WuF$&LkOGpXG5xE>-TgA6Ng@AOuKWNzoHFDZF zjr$dv4PBF!ncE0L@=47cl}u=GH~P3tdI#S9m07BYd;Gn@9(?zH=A?4gr^k^L`#35m zb3o%Qde@)3JluQm)%vIUCyFA3vXSYH`h#QP=Baj>l7Jiy&xuAX?b=DQo@Q;Y z3&~q1e)S_jRbbh^R(y%(W5^A)_(?=X;tv}{s(r}t8p@3*MU69fTX+Sg|7Ag)ZWAX( z6^;-E*6^c%atVzs3GpvPCk~Mi#lOCrY)zzX)rH-wE88pZ&G0! zgpvl-K!d~{DH*A!fJ@oY(NGW&F>^BFTvJLqZI6AY57%}NrZ`U96$n0k+sBn;VJPcV z(gagKk=(+gB2O!W!Sv30TI?I0Xq{!GwgeYuxs4`{JGYNB!VKJmLS_N%(w2_?2 zG@wv7xmPot!7m-(xzV)^cOwU~{W?jxV&FRddiAt9#sn&Ty}*?+JY`7f%XAcGfBij( z$kP-hBgKyQ_Pt7Gsgmpys$U|ZP^Jhvt#_bxi^L4kBEzhM=7&8q|X{30+;5s|UZ5>DAa^ebb@ zm+p#jX!^rRn(&F8X;xQyIxP!F%nV4w+to)!#HW3JPH-gKdKAkY9WAoN(YllA2>LwA zol7f7H?$?rr5`;4_BAQmP7C@Qm^o$N$n<;ftMoy>cr3T7gbve<4LtQN$BWB+7K14R z=5YV;$PV3kF2`9i`|P3vHZ?+EN1L;!PQy>YZiVt(ZT47Lo$xzUGOQHiSjbx?)u7KW z_D~!d`}Y!$+~1sjmK2-HyB#^OXfU1m?F18Vo8guFLF#D+7$0GHsXLKhBficc*v(MJ z*>klXAHaO#P-!}N-UxMqBE4L|6H!@Keh3@ZN+*GK*vr7@J_8M;IH%1FgUu?y0F?^l z6&yXxUw5p>5$3%3=e18M3GBZeiNS3GV6Sl}yN(PeyrDz3P+$)o*$VxxMM`Jl9$5iKqLwIXmB<#ECQChZ(VVPxiEHK>GXiqes}!?4$cU|BU&dzh6Z) z9a7hBGVpL2-1-=%=}cIMgr{8h;gdQfi0v{VCJQBW(Z}wI((ID+wc3U+SM~qMoGE6s z-?Jv*J|QWD)a29keEo4}%P~~1R>1E#W|NbX@FX2ff#J7VD~jhfTrZGSkZ=>_#Q@d07X$?qj`Vbai}={qZ2}%6xNTwcFSI?|LZS+epqM1M zq4Zn@`SEPMF!rP&Fw*8WBc9AZ@i&RDNKl{?ckgH=Km~D-1mlLluF(R2ZEfYX6XXpd zSK3fyYmA{%K}_fCb&HrV(tu$g67s4!D=DCmtfi~676^!_Q_Ye4gPK7$tIZ%48*6N% z2b?EciV%Tv4>=mC07ZgdlhBaxWmj=TvxmQiZ5L!<{L{G`3+mEzA{pdGA{E`nc zGp#hk@Rx2g?%$6>hW0;--U=FmdR6S;yS#>0nxw_I+~Pm5)8DDI?=?zZa=y?BlSFp< zcT^usL1-4O{dkl9z1sSDjF515f+ru?nYnhp^cC+T(9vl(WM#^J`QK8^ z$1nQX9n<7A%WzI(f|i9{)mtz-THYUUBUux4m)g1qXJ2=@{dDeU=^b%XEp2kFTA%+` zCMBv1(Iz@l*!PFcnVrhNhivWpdlnLh-WMX5fe)pXs@X$RDf$!2Z?vmsgcA;v;Fg^? z3+_U?pJ0I~YLXAIbR&>~2LlW2eb~>Q+tOJ4ug&rN)WEbegILjVTO+gK)ga)rF(($R zSq0LtL|Wr0cO==9b~M0^LRsb7oqn%-;C2&3csQczGQp36GV7m$Z7uiNyUa5kl)nVKmBhZ+|` zXVI{tOznf%`w?kX4F>@K$SX59L>SfUq^QX@M~#>uMCnos7etAKv!m#XVPeie%nM@+ zL+eAhen;sq(fwI+UMx&g9vpd>B*TJ(Z-ohIzc+m{h?*uO8}X&%>GOM7jKgFC_15`& zweb;g=f`*5n%S5|zVLT^{oTT67P<^FNpua$k2`b1W~mAU$Ve<&#=KYq?iKGB4@ECC zz2n)Pt>TfNct3Lcyu8oep{qRMBC(N~Dox)if3$*Y=6*b}R;)?7#F=$88Orwjm4qU~ zCj83dLSCRqC&aoheWfG35Srgl4N1m3sKKPYET_i z*gPL4NOE zIID%$qmL9sQ*)_btKzK6A;r4waePKmgSE!;Z2iK)iNl<#ak3#^r@=hd_UyK9 z*1M10o6AF^?mctdN=i9&;N(2ELvL}DbFTBk(xzQ|qwQmgi&HSQRRS6U%sXubEh~co zp+`Zx#~F&u3!$W!89(pphy{c|s@n4Zs#bxB`TxfF0KFU#h{&a`+yRI$rB?Ge8dqCL=ob=y` z|D!+nANzt3GfvE~$&Tal?|*$Nkpd-tB0zco^*`SLVzsK(x^<@Kt~R%XO&vl{Qe6)g zL8FyWvbzahQ}nIIJ72IQNF!Q3I?5ZPYBAFLX7E|Hs@ydo$^^B(FoGOD>E)*OBDT#{TWoU%jjx{}T#+OjF;mvA!{bAe6s9KMtlXUHiP zIU+$e&m8OJpN0{zy0edU#LO&X?4Qx`X1{;jS^tbRCb!cRl`b2DzB}mZRO98*xP7{d zX$$kGNdLRfa+fLOQix8NP@n!Mcuf-#cUo2b%MYozyx#6_r=W798+f?E3ej_$^%kilhkV!V8h;yl2nw~$f1kM#w<8Dtgdp{DPruo` zE1$KfUirJy=A`bG5INh56iu}m4&+~!e7XQ&DFNJXVxWQtC=05pI6k2m7#NIKYW4Z> zVjlqd`#++N7+I|Uatlza2a4%{R{+SK*BSJ50wzQ?+IPva!nxz+@wK%s0IGwFiwl&8 zWu>J_dqd1-B9WxHu`EzuIo<6J8Bt(%2>3m7qp)jqsW1EAy`QFVrc7AUsyC^q7w(^} z`|0zg4qnd|83?7ibFc`ZUgQuK%kWbCyi~7Vq}9LYh8A_j+G0EZYV`$kfB)`b?P_ft zOBs;OIJdamdd^r|OEWfB?{qyA)ut(5^2^HaZa7EQ{0CW-8u&bp8P2gKo2{#fM>CV) za{CTs7iZaw^$oW52r^NI?;m3~J5A1fO%{Tb(Fn`r1Fyq<))TGG3g4AxfIq;Gm%|ut zE3z943Q}m((QuI?Tf-neJLOQVxs-I(!;~(UAtvK_w|u8i9U8CsobSgEVm7+#9!9Ty z^o^Q980P05P|O41LYnG7Qc|8?U$=U^+n_i}6x{*7kR4~%^cw(+2V5c8jCxu?z-C(v z^T)uzz|}aX3Fb>l zYd<#!{Ed`mg8AFKcQ_J{gVAa}eCH4@DHzd*`kqjI-udDoPsDX+s<0Ucj_U1)M0IL= z97ZL8{sUBe^J|pchkcnIV=(J&{1yU3d(T^2lYMr#1O$~twW_{|DXx1~$INU;PkrIj z%#4u-n+_P7ufT*^L)XYp>`McFsyi#$uN>7D2HTAvwsmD3EL`Z9t0_nrJf4deWr+4> ztY1fGR3GAyf}(#V>E~1}GWwo=7J1vVFw(#A?6(Mr_xfesHilk~LZT7naca)R8mE=H z@3C|cnOCSa#+DfC8i0xu336n#Oc&)x)XqETrmPuW+Kvs#Owa$*sss!g;Pil>GHMox@p1t5YDo+(TH2GDB1yE!V!*One|LMkckNM7 zP!N(4ACKHSx4ew=Ap>};wY67(i+(3l$RFr009=u)=Ql58K!w6Z01}a!kl+aDhXK(G zphp3`8_ht>aGB5$2GP1LADwXJo7pIskx`@1AS0M~iqnpb+EYhWy3a-(pY|F{MhxOO zw$gnCek(CO;}^;~!fV`O2cdALo3q(Eh$s}5;i>oAKN9?_dhrGz_$9f?*`6E@MVywQL}$YBj7*$1rR0o0d@#rXj+*9rv#;>q^s-oY^7<~!rTpEENXX^N}^69T-2tf^Gh)= zS)rg?#x*!7_KraNzAHM&FVE&c6K?q$C3@GlX@~7uctTrsHjsjQfG~Ry?Hmepv0Rb4 z6KR3y&!+{*1il7E%1MCUN_Gb5P~B~np5yT{QtzrfZAY7?`j@d9~g0g7g#qC4*o91HGa+VMWZL>NA( zK&iYPj|=1G=C7=k&8+gl0TmThIskUN$P>?vjj67#PM4!P7~*25pa_LYPiofW3NQpC zBKl%nyb+|}B4lDZtlW*qZ%^zS;hPVtgf}ktu z4532~F0?+oZd)9L;u9{hxdz3ZemEq5F3X@A1BUd6QVLHm)`3YG*20uwW8xD8oSKxq1rT+wrzr4~ zrRF6GjF$t6M5zd0#o#8hO@oRUMuTWcFq3oOV_mP{X>pwiV=MunO59m z`Fv@ai-$9sS6Uw~cNeHaUrGa1M)R>!>JSfvK`(_9#PqgDC^I?!#!lqq#%_G)zv4pF z1GA#wPQ`cU&i83{VXnuP>J=fvxTzEB4)!~A>JUl;#zX?vfmard^(GuWNR@89#(tou z_|rasnTdu*3b^0P%Tvmzpb*^N-`BYF)C-fK7&*P%S(_m&;feUX{vg2k_Y!mDf+rBG z1;C8VrwQc!^I@0l`SOu8g+bW}2-|lK>qaOA=6?4uYgNLb*Rm-=psVs>tJR<@z(S1m ztAU59scm%AknKf;48pM(=QP%h$IuN)-ui3%eYwKNmsZ2vmi_5tw7b$e5I`GVCURsA z+^N?4Ii=${zQ9s9pcYmDdB0m0e8$4wNjFh4`CyP3cY>%?!2;gDaa_Mf+}*DsFJ7hbd2~!< zvfrp07$04j>UjBzVV2;e3X1vZ`0Sign9_w;4{fE=fF(vjJhAuju|6jQZ)Qw|Yz|sW z_ZYb@vzCS4{;89DYk%ff9}Y^98@08Bq9XAYlNo~i%(T91mx!r%9V?N0WkI8 z=eC9h;ZgXDNkBj3>R2fINr@^I#q4BH|2adO(jR{huktB}tfxFkC~WL=h?I*=^tHo- zLB{)0#PJv-N%>afwhdV5_~vmqaXf2bhcm;7)JjX^`C36^n87?!|4K1ARPo_Q$YShCDIGE znY3RlwNOZ%M9KpLyzm?96*wX)^k8(n1BfOvHB=@*&HPyw=y$Q+;YgUm2!Dd2TwVKd zC(C}{9~~brnei0`zJQ@wN||!GKzR4E-gppZh)mL@@K&l(@UJNa-nES=kk_fq|0+K? z$XWGO{Qw6*9!&p4J-X#Q-8-4CmvCA#=SLyU7u7mwT__PhfeJfV#Ho^j+eUlCw{jbi zuadaCpj<#VC%J`li3rX?p%3Z|4DJCjbz@9ciowwfp#{SA8VqCA#*vI)egNArEa>h$ z78Yzs$Er4N%S25>5wmxR&F0FsmipkF?YltiZ}zk^kM1KrQ-2=0gWVv%LBR2C)8(T; zRPHzzRN_7#ug=&W1sFgN zex_v^&bK2*Jk_jlbK@UUVgdS^?H>;NQt;m4<*AR4q50r zr$T;5T^wsdG;bG1&_P9Z(5f}GXRtD);^j5CJ)*1$gZ)XSQVvL>!@r2YASp1=cvKf! ztlPaIwu#}B0;IW?j$$JOD6Ornfp-ST*`GvsE_Oqr@ujikegm11wYpY z4?*nX20V-q9N}Mp?q9w$v+)~1`2@20q|ykCsOdNhCaCR%Kk=J2uT^03VG7tt=HdwX zXzA$2y8msnC^!Woj|T9$ZFg5|UTsrQYIWZ9v56I-`LcL~ZSmWLf6m5+(NFwwY>V4G z^@H2TPE*LhM##(A*2H7bj$E?e=xV#dP50vxQPZxpnQoj@N=XeM8I$#$U%!w-l2~;{ z_qof|RnTvSOo$=QjR(8Oo4VL%dA<@9$`%`T{CEi-Yx9{AlLQskl+bkFWk=P7m>&VI> z*~t{ddymARDLne)#q?I2os757B26OAY?oohiVC>Q@jtsypz~pV3;3;gchBG#_l>Dc za)h@RlpQdxZb(Z3|b= ziakit-i*6H(9+MSU@~|Jz0e3!Nz(z<$$is4NlsF#avL#2o zuWSItn~aBx)u2_P_4l2Sa#~NU;IW#Av4Mbq#h75+mXesVd+aNk($}Z`jFAy?9?a%1 zEz^aZK_Tk-+eR+3P#xqXGA|W`7g>EfA{14x#VWMYow4#XZ-LdhcD(e?@Hw?f*u{w{ z{vD(j7Kz0T1));B0;iIO0|FJ}3#C2*y;S7(zS1!jxAf8WnIQ?ci))qc$S#FAbG~ed z3SA0TB_!REO0rN)8n=b@@Qug$2bf_}{~XESzo>npSYu zYi}R1w)3yA*Bmr^L-eEjEcJR=GbhY6mpGw59ukYAsaf-SAKe6B&C4A*{onTECl;1f zD3r8TH?^qHqYmA}6x*`KMZdo+?)aGY_4y(|6Q;;;#fA8`-d5dT__7u2_n}5o*RNq? z3Do`FgAMSdu!j0ibRVdo0$}w2o4ZG$2pzx;{X!3Fw757sYr>8418PK*M$R}O?jQE! zztjGp|2d?-$=7k=+sj5L``ab4m@!FomnLJH=xk|O+2P?KHWpUYu*otV1guck#>KtY z#<#Y){VVyoY`Z&HW2L3}B5Z!;ARO#J1 z%eh3VhcCQn^kI7o_dFQeX?#6%b^3VB{^YTYjftt$czCMMT?%)#A&dU%_i!`tS4g9P zc>capqa>+|_hy3MlQUpj^9Y8@LIzrqsqD8a!i4m$=19>^Q ziRG$URr26kI6~4TD!L}m^(^uUno#Zh9J^6F%q-gshA4=oTTKz{dZhzk=#TS-W@dxo z{eW<-ip!o@u!;UaFrr3YQ#doS)XDLqE~0;2AtJe(eHBkB@^EN=<#sz=ef@#8 zlC)DLU|b#8X8#&njgRf{P#TWRV!L}w`feZ_CR}v-ao?8gA@~zCTe2ILdXgLQZbFhG zuQ@`Oe^2@zS>+Z_bxuyh;corTc~~wraT@t#zGCm--~p)J0614^WHT*bmjke@Da{tS z*hC+{EmWrV^nAt5tRI44pz4itO7(huU zLS%b?f4zg+J~PEIC=3-rO+tOB6P|IxuxNlwf@`LAzm^Z>Cu0Eq(% z3JS#ezk1yP@1;=T|6uGuUF0vdATVq~+sJL>;qfH+`9|(#sWhJ)xfgJzM^>qOZ;&3Rqv#5!QiCBdQZX!3&>Z^m+Y`)+5-5o+u@M+uS-b^Ov z-Nk(Ab3}g+J$*{@VfCK{>!aI^<%0UrCTvn-wHuU9(c$>j*Sic0JCjVHoV>qxTJe1+ zF1JPBmecL3`u_UJ_4AFLl7UoaA39~uV|)FkC9`5SX-_mbyXyIfa#fa1IeX^fPCXXQ z>9;waxorX790}bXig|&sTug?C!`&HP$G0(2qWw#OW&!uH5B2g!;rF3dhCLXixTmc% zzI8tK>hfRDVZ>BOZ>;pZBXR|!l)zK zE>*sBddlZ{W5&nV)xAQL5)72=F|Wcf&H&JfCoroD1mQQ^9Eb&U8uwa&qVf}<8m6M8 zjC>RF)9Um48fVa|*Xxtvq^k@g@U$KLZ*(zbOT)%A6P zn5hpQtK*|Zry*MWrQi3RvAw&3f`)FR1D(g3(ZAK-naO!BW*4o+*u2Ql_O#g6q+433 zdQCo%jEcC`6|5Xvobs}UnJz>e9P2e}bl+gGR<3nJFR?Vza!uMUoF4C_w))OBCMqj# zOZf?}?av3C^xk%6wc}%Bov^E`d0pR}H_)Wzs#hHC-DBK4uD3uq`|{|i@$IXd-hT)N zh}Uk`6Y};dm^F*E)@2jV@6C;}3>pxA%smSyq)t;ib|pdog1sSO!VL%L^nhsxaEk*S z8gxb>>UKXcFruptBLHyTIF%}_bTbI(5P?KJ5CXZny9+5HASCoOCwe~olR@_8-JVdZFbqWAeINI!aecbX_G@@V^ns2n6A`*evMFxW>dNYRKEvAys%;t5C8U$Jt znruFS%R#~ayuWY_z*yp0~0%#;aMjUk~1=CRwil)Gv941g2Od!e1?YedS#;!!lcB;$a*Y2YSml6 z#|*r+H_?2*JHe_@+DD0&%P{;}_ii5HG@qjL%fD-;L?6Kn9lz}B-Lscbx%>HkvSkj^ z`!Pad1X_PU?#|-kiZV--sON>&qk{5ZeO758jHD-TftrwF*XZjWI@KkXnRVFw4GTK) zs6`h{Fb9d7ZDQ@K6PhYCq{ z$yD-yVnPYE^6=6IgSpjVD;HVezy{!~I~6!C)#{Tnh)@RMSgEk01qx3M`45RgxFuvW zbN~MBZ;Xm>TXmG)UgV#HiKo@_-SSYN7u~W3g?C^H9H9A^L6J_*pj(D2C|6vURWsGS ze_=;?-4*x^ts^xIMQC31c(`YjxL>Y$$R!sbE;cqu!Byi=ga6lnt0*Rk>1^anc*Dil zBU*OH_aEm))Ed)rm){aa@FR4no}sAA(*NkFq$-t~8JQ%#)`1pS5%N8Dnp@zFKYR_> zdyTK;GF1iyxOQTG5StBw*emnbG7>X0#0hXxpwF+bv4j^2$B19uP8QaFp!SOf26B88!56vq(IU)3?NH=1F(A(P^ z$`1gD)2^YRv0vxWFCLB6Pv&_^yAFja62)9jgGfW3v^as^m>(81+W!kim#9F#tyh{OV<5Nu#&36*E`Pz(ugLQN0^PofVvqINstr{fX zes@KC`^Kej4?Z8WB1agC!3^F=_YVthzj)hX1Aj*FyIqXA|C$z8$a4B7wn|C~76MUn zI-vdFQlc_SdmN!y5C|?#27SPjB~x-@T!n;!A_U#$>tToUVSRd5R##_dlu7XESXTen ztG~bo+>9?oj0~P??+=-vl2X1dCxj1yE)Ib?p0p=6^&=+HhG9DBFN(X(E(fE zG>AK}YhT-7mPjl57y_1w23C}>p|y4L)KVK5Nvo`A1eqAzPT|m&fpYtjsGdED;(Bc( z0zQf#Au5Jeydl=mV7J05My}@jaU=VxYe4y7y!933BB8Qe9ga0kx{4r`LhLT5w~ z4dG~IYPC(mPbeOJ9I#27FeP)`F^=9iq{`ozbKka_c0h^2O~8?Utw@)Aac9bYNU^nG ztoWfEgxlfOl9W|>xs2uixXVT8YJ+ZS@k5sAY+iftZH^qfsEXXd!`u7zh`|Ng#iPQn zBE2LjMWg}HoS?3fs6&$&Mw{f<-|Xsf46T9OTLDi9F&qjg*kZW(Zw(sdN(C^-L>8_9 z29Y^21r;`g2~|2Q_t!Q`#GkC)Di!m@`NC10=vs0#>c#al`ikr6{vwOh@A$DXv3mwz z`ELhlIDVDSiiIr~vV15qJrSmKXG+6?-lOyuU<7a=xWse&u3 z@I2Tl?f>RAIM4n#LYOt_>%&~BCUFv%Csz!)!c(7j^a>U@?Q%UM4sxZWphk)qkHmX;=TA*#Keb?ervG5^|4Sv` znR&#wJU3{6xLJf}TwpLsYwzt*W9D!#m|UM{iJiID;l6)Z0|(Zn_vBAmFFl5uT~ zfgi1ZA+CS$qd)$^5LL08xVonC25(wcNnm-tCe_X+Nw%15WkSw5^?=9vc*IHT>OMdz zD0SGjGKB)4kI(!;X{#YGiZE`v_VYIW(MC<)m++f_w>F0{3<-}CB4l(74oi?oDOgYV zr8Gr3iTXkScoaJHPh$wm{a?+GFlltuJ*6~XlwjqpnWA_pjWNDs{;(G{D?|)cPtgHB z%suI(Bvm6w@@u!C)LA{2YJX&TK9QFo^(^?1HsXa_yw$eX)2niGLA$x+$1yntBcNk2 zG#F6+D{yg=s9*CVK^wx%vh>#U$?;#(T|Dl4vxw(<35{m^U{QUeQS#F7$8YmW^}9h7 z;2Fdzk(KHy?w8KN;y0X717xff)7%4{R<4*Y{9>>{2c9w>r1j)@?$z}~Y4_tqNpO2_ zMP-X3s;FTggc}~7V5q+{n#Djap&?)wfxVFOaYzEmjp#SD6k$Hzl4i$9s_W5{2tDk4 z2S=z%4;}=VsC-!>3~1^VUigVXhgW+iCVgS`rC?0Cj)=+Gamp( z{6xOxPBTlj?BchAQLQ8Bwvh=b*fIL zR>UeVU8sg8rzjK;9`SC67@)}?1V-%Q%KUhj#UlgsG=N&ElrCzOwSr~hX_EEtojD-= znqrX&h9SZPuS~e{q0*2YsI2iJ8^~0ZWy^ETnUDApO^VLp4;7oMOhQn=(mNyRI;G#) z`?)M#Ks>6`nV85z8}WehdsVpiPd!P6xQ(pRy)0tY4hhFa;-@I&7y7IaDpGx@bv?Gy zSY#^RjE;6Z6%VANFO z+AsfugPA!2G3Pb{(UZf5=mCEI42+jpxkkB6ng$VvIRH^YCfA7k%dnVpn3{C81G7+! zhKvWiNpwsM{hPIVXwZQ9-RB`;A{b)PA5l_(=ToQG(Fi<=qoqU)B{PG}!I#;v-VApA?9hl)NohgcPW%0go=&Ob?s1kI8( zWqlsgPh4k_KYlqL#!TsCimFUar>)MhdVmpbHHNaA+`I0t``CSPWa;tmN3@ ze#~$&QV}8e8~5x#=U#ph!R>%ivCUq@Ws~0_zkC`)f+gyAxxw0#Kon4hB7ThrxT@*A zuC!(V23*P`?kWxn&nmq$00=EO%ZghI;U=C5y1^ML>K4lK{2Dz9%E+TaJaM&NbGn`U z3=tQLb`QD}pV(}%#UOoZ`)vP`t^2^ou#LB7Ib{8% zj+sU+cK6Ghx#`X&BLdt=`1FvZtKCwZvL={4N0W43YqYWRQ+v}NtZIe0N~D?wTSybF zq4P&7!6v8ISX3ZSBC3J=#A2$izJm;ZOVly z(a0-tv`6ctmXw}lKu9++W2i|NNk6O>t25H@{_O3VKO5*qh*)SIxqs#w}OKo&fU^D6gq<7l}(S&FC*Ul(R49 z<`q6$yv9GC**77*U9cKkOeEPk;+BNbK->kQJ1fzN(~$g4Gc#USL`;Ofk})3c`g21o zCzY=lS{@{T8I~edbOu_4qut`Rik`;o62ghW9kVDx+tMtv*jG-9ALXp@!o%J|92VBm z-oD==Rm2dD%)6#6Gdh53H}hlakK`98T5%e3G;aUs&%j}}U-3kX;g^KkJCAHDR%dRU zi?Wvf;L+0$*Y7XqyZYBh()Ha-nX9|<4jbNgALyzB#1O?JVQi;ush6Fyx@Bb}q0*JG zhU~lV&mIr`ppt*#7(4K^_5;;e?23&gd$2nJ77**|(5QMJ)UOIQg+H-%N4b6;hczEX zCyi-p$xNLR^cnZ*UqvPN;TWM}uT;}<7_GOb40NUsNnN1vH1a#SI7vBe)9V2w((jbx z<}$_%0%}YMoeTfC#DX`)6g&}!{D~`I=jO1WaU+6w{Rz#^kmQeEf@N;HPl^^2HD=nI z$!rpEnZR@@-~-m>pZk8F_l*#8a1q@32=*W$G8xcmDS^+* z5C7K913JjMobEr4gVT=Y`gH)!jlb!yW?}&=jTLpVB%1ZURH8eA^3VVoG%Wx}gb^%6 zxk{y|;?j6Ae7FD^7~_uFd%EqjXyzM|U#QaK)#QE1WRRJ(@EH6ffeHf_!JJ_X0tWIO zL=-%l^k+uGSQINK-_kCQ<}ZDW{Z{LHkN(6x*Ng787r(b1(A=KoDbvrMcp&7QjYKH+ z!q=rpB&ert5VgVuz!uI@bNi;nHCZWLk{8zQ%Vwab2A0mA#bx7>^j`e7KFVTiUSzLR zYbU?9_f>@&EG88sj^(RLJt(WCxvh8HJ0JfJBzjyNT+ys!diu!WBYvr2id_<6vd!7{ z69u74m1$ce{_w;<%_zDssjJ!WZo60KpW9+1tDMzi6Z6IkuXtdS_?)2MbW&SnZKEv&T zq)>AEK5#7UJb?)Gr$CZ5)W4p=f9I}&zQ8~H_`gy=&=~-}LI%^UVn%#G>f?)NmJ>3j zmrtkDqenoP6aSw``2RXXebdHZ<;EAc$1vA7WD!&LkxKo5NHhOW{MZ>Bkf42t|L3^> zNqifvxe4SkVZhB;sp+lQX#kA6FX0fu{c==$+zKQpD3HJ}ML+JfN1G}$Y{EhmA5E7w zZk-`hvY#MErp%Z|mnuV#g)RsJn!yah&PCjr^3TUR0Q_Xe12?`BMr)o93Cpur^do#ntPB`>Z1%Htx% zM|offh!Dp>Rrq<8(C&z9er|Ls#6chQYPNrOCwm)YZD8 z8D_SyJs2M>kptFSL}c_a&+HqNTz+}rP{t$IWwz&m97$bx#_c1|loL)EEZp5CF41h0 zwS+`kd9nJ{yRs2ciTjUvyiJ@%7C z@9tc@ENtQkMyB~mCfxg6VAd?MihzAR5~Rx<$4<&s0EeNu`BqG%Ra9F;;_P_l(Nk7^ zeaVq@r-pTyyTOu1AHpf5{k-F9Qf~e(r9)xyi%lkv z(jr0aIHaE3`0UQG!Imly$FBWF!A#DjF#&sw6z`7QLr) z_W2Up`iv9TX9UvrAVvE($rBDQnZ1~ZL^cxR39xQFNZDYd9N>~8z`D)0C+V|rJ@aoY zWW^m$cJ0fC_IRts;S>f0C%GKWR>6}Ohl1JU3VfxrRQN)leEsA@sE6K2fD$k_QN8@L z7t?^q#(oYHf3}Z*C%H<*ShVK{Pu`9X=P(0nx6QmGE`-zIZ|{e~u;qB!`S(W<$vB7?3GUmPjDrgM-FuHi}ZTDa6AJOL(%?_X&iQ%j7afhJs;yuAHF4#M!QAzfDis+>TsmV z#Op`rK}v60ATPJnZ`pkdU{xm+(#$bE*rUH5WvTU{&MlBKbseK$3IFxh?;d}-f4Z0wTd4pC#^ zHq|IXmVAqqsmtOsK5RH^^yacU$o<7_{=)MUN{wQ#aIV{YL-zO6$TQ6r)pHm~64 zlk^lm50aTOM$`>(S@q+5^=b|d7WMM#RHGe!0|KW<-?ckkzT5=w?d<`1uK?!V z4Ax<#ad={a0nmflp<}hi4fPv9^anJ!jWY&E;XFSK9fu5|GaKLtB+!Q_(JVJUxH5)! znOk-jb`K<7NbS?a5fb-~mRt%lmq!HZc<$s$wxJzUY=jHh#oU5PF7-#d35nZ`N2~5? z(7-iTY$(gq&hl9Cu=Z|SD%!YH#WU^P;%`S+M}J_v zgNo~Mlk6*?L~SY`>poB+By$y!M0 zKP>q2Oo3b}_jTUZXh_a?SkqF8n&tW&`k^3PbZ?hSFzmyjimlN?m$OH*k#0f7B-oqR zCDdmj`eM;b?3iR!roNpMVio<&yhe9Vb!o;HLA@NOPK>ZCTUga!1rJbJPNXAs@t(=B z{^mU9TW$e=x>5!@l!-Q8V4P&j15(i{SOf*Mj`h$q1; zJokz%5~5TXsVU|Ly~0?9ssUS#;&XJBm0Q04bsDx~=aMvT&OadfX*zPG4`{}o;fplW z1jG=IJCd3uGw*F>)}2CBR+Z?T&T|eWBQ(PkU|q@0bo?=`ac25_DmH}ENt;_)J2m0I9JF0>N45|TL$8mcCyI9@+X`A6h^2I3;X(P?4m7J&NbKj3>m|5x_`Dj}89T*U|C1Sm(h38nL3hlq)3kb}>W0#tBW0zguVZ z@uqcIyQV}ZdyG%M!!#v}qeg5XgjK3YP~jXFaK&1puoiHJRqWi%{kfd~y#hIuu$@9( z7UF0ioM^t(M7WFoHa7cnT-w@V7|VD#!jJ#2_WTLv?Sq=6 zOI=W6aEOJM4$t>ph*f9cu1xy1y0kRR4iRgS{QALV=@O6C#&jfxAm(m&e92kh>m8vs zUcoY^X>hB7zOJ;_6VjyAqDUajaYa?q=^oiPGyHk?s>Qq7fIvrHZE(dN5vvni)3~~< zDyT6XH$B2*;dvr$)Og=}j#a}M9w!hFjuD&gR-_bp+koGNN6UO=}jO-md zBDo!Kae3J&(_rABdSk#NZK~-#mgSK*4*6Du0DZAb8P8 z^6C#=O$=>rp< zp@4^pm7rks^#sAdEUGg&E0on&T5Wr7!Hj{iP$?nSAf+IWbF_Mu{hfzq3eRpuWComsJ z0`GZI70TQzm(pB12V1%FXy3FK zZzrChg}!5XXc2?RB9oI=O*jCD7$g-Fc6>5@V2?CLAO@$nuGMX#$KD)!vCmn1&L;}j z@xT>bbg|W|xYDm4ktKq=Ig%(@B z9kHr)?1|a#>AF{ZA&@xSsSIpjJ^47R2wmpi@)V?561k@wsopA1&h=l@S>DogHQQQ9 z*v7ki&*@=5yYNNTPEAQk0k}Vf366`^+CaOaJt9p9$lsP*gd62Az~OPcJUzJ_&qC4y zQi)g*@ffo#;C=IEBi^!psfd1Ne6XfiPC@>7i_hmQg7g}83j-@{#?+XmAPVMuR^;dB zvnBM;D@W&oUnK_Wsy=KR)Gi5zPt13*T<4c`#{w7g>MbiBIsNE~D|)aI4|@ z5y&eIdj>Q;3CCt$nRmNVxG{Tz-gpZlTU)AZHaG_pb9CLmm5AC+6-l%sgnh?RcevO= zi?D=yfA08dzWJP}u<0EzA*a%LnAyh>3libsMZtsvlSeW_<(T=#OIZ%Rkyu~a-=d6h zimi7RhXL725hC*nJ$-dTaj`jG=M`fHm+Ra^d$xg-D41D)=@)*PRoJ; z1%)%h5h3dP16oI+$;&Q><36h4|7q$hfZFK7uOHmq-QBG~vEc4dv^a&L#ofI~fEK4X z#fw96cXw!U_flK}{I}oxStc`?o!rgMWM}W>dG0yClg~tb*Q+j`4<{lcp8GsT% zlW+P1NQh_By$D4*oByho0?O2vKVQPGe_Cx!3jF#2X}TyjSgHf8{7N(N4Te5AzR#HP zzdT;Le;LZ=)7XW^%F&vbAc_c{h4X}srDLeXb6cVFF(Px&**Is2hok;M0FqBzH*!>)N|2wHc| zve9r)I^;23q5Rf5zv#F~Y_f-`sqq>x#$Gv#uMywRtEY(R3>@ z?(iWy#>HJli4WN_;4-=koc#7=bp@u^x~&2ac{Ba#p0S6_52Lv}As;JvKl*cAr*`=~ zjzuY{zu0Kws&$mI*b2QumiY!zzK*_LpDSCTeB~?ZU!dU+1);2fqLbQ1ONIoIICqqK zB-Bd^Tk;zehzYeEZIL1Cmm)4w*18&M(WHvua><6qJn*tI1&EQhf3sml=h1&A?}q(M z=j*_D>s)}Ek_IM5BD+7#Th7~-J8EmSHO=Oz4r}hW)|8(InHnKNNMZxm zB3_@6@BQyK?-XU{o?>dZ`6U)eHHGXMg7(8UJ5qvPNK@D z-k=3Hm@@zq1O}Q-;XoHi3Km2SG@AbR3pOrfXvz$I5e|e!Pl!5Y#fgvPmkaWd)z!H)vRvzn2}Eai4;u7Av!TA{V6<+Ek#&=d9^%SB|0eo3 z-~Tt!f1j~=_oQ8>Lz`5y;&7SfE!z3>r!8?LdYUbN`62;k6auYUiJQ5(q+|5Z4h{V) z7B&5m``ZkaUuU;?G$U5LK#M9ew*0$c+V_vMQVR3MdSu%-z9=Irpzeb!Rdw~WvAu-_ z-4`Jy^O~fz0n~D682mM42sQ^Bw{AekB_0 zWqL;mWz)N7Mmw}X@{ik;sX&(M5%!lAPe)pJF>Y(BtMj1MQh)u|+BUk9z^?CE{`o`S zaq6R?<&=THjZ-l{wvyhg1PI4=+ViBX&c4g7=BMb|(>Z=V)}BT2{QbA@2?;_;9`{ti zW?wkQR%rA)!ObL5Q;%-eWb-8X>7-cRwT*O8*i+@3!ngB&ZbG-K5q}1u2R?3>>kbPb zqr_X2{ONjtH2|G3mH{^gQ2+XibHT;`FQsl?L2HvZXGa)+iUrym>}U%vA09ggP1Dnk zLE@gf>p6ah+U8|ThZs2q+k%;X+`?KW(t*ex&Nn(5zDXvCog10;t{cz$lhnQFqMa%A zAJzm`C@00dOzU3#{=BXuu_=$KvVHJ4Sytm5=VD%Nb=z3ACVME@_}wBT64(})6lEmP zD63$1xd=*8k^r#O4Wv9v{i|BY$4x(a6?|NuR#P|IEBVjlR_7~My3MA(e+%D~HJ*>z zE4(Sz*R47ws&LZvAqle${IxS0u&yfwM2QY5A~_;nY7SXc`EL&a z;1ZywjDtXyT3xFQ8{c}K>Nh*RC$#F@+S*!`YD?l3xY2_Eo)LLj*}uU!I5-2lm4I96 z{P1x2gO;{-3SOxIGBPr_mXeYZaNO)K0@AtUr*F{8(wkP79YiCoMRtBbM^saD0e!dv z=m`qx<7YsM*WLYJOQ0#Xc%1b0YyZxbM(gcIN5_cvR|oV;MxYFzHBD5eE<$yF+8qKNqPPWk$~SC;9E`G+#GE* z(r;Ltcy8-l@PrP(ynB~Q70}eKP@O+j@=6N#S=68W+0ap4%&z3a+$2m`XuPV*T+SM# z%Zq`HVX-V#{U(xw!rteV&US*zG${L9YF;fUanAMrlyu$kvYt=NlJ@-x0x|usu{S&t zRcnU_%?fPpBYavPLrCWo$aZX%zooK`RGyNZEb#?S6o?323Z5^&1a=xlD{18CgU)nTMK|pl%)tQu{gDs!Zja<5#=NfQtD< zE@yp1Lc-FxNmExLmqC_puIDpMMbPee8KklbHO*gh=o9ny@o_7VDd)pLu#c#H1B9ko zbYTxytpgVrNNZsrvY7d&Z5>PFO0&iyKCkY4932}|Hn|VqE525?#M18rv`OYwznY!9 zY^HJm*tEhGA0Ho+Y9?Uy55(9tYWMyN$e98C{w~%(&>|pQD%W9s*v%BMFF<|BM5nd` zN{-f3OTe$yT@Ogj%+3WE%_0C-n{k_`W6K3VA=dt`qNuEl2aBCV`!RBz$O4R#BxCLM$Rj4C;z8N8b%%| zw>`9UgOw)A#_oX%MJKt@2aX;YK15jD9V@=4GI2vZQ^k^A>~tzGn0A54Jxaj}XEAh} z7xIezY6EW~{FRrEr;@9a*w@(R(~Hu*jQYE*=tvU-H}OF37ip^Z!kmGh{*L<%%E?}( z`UUVFB?X4iv#gv3IFjyg>ZwQ42)U2T;{IAGU*zb(_-x#2C-FgR=U&E5vD4qlDwpyv z-jMiOQ2&i*Q9R8&z}5J7?~KbE8AA_H<40EO*c@qO^` zv$eJ~M{IJl!oRD2*N1=4+y3CflMB2416RP~8KU6+0H7>OiG?I8tn{Ml*H=>#!2SM@ z&pmK^zLrHDhEY^f!iTX7Y~UXQgoPO5W!zgsLl|l#S#P@FC`2Wk4Zs2&$&Gw(jzDOY z3vh2YEHXifJMgncN2z9sK(AWuk|gK z(!D(i0TUiGK46)IZx^z_*(MHjTpj@g>8vCxPL_@cX4L6#g5tqAA5Vq7*{zl&;orY) zm{~ew2gteVPiZl=BT#}YEv>n0k_7m6M+ZAK_R9kZn4gUNZ5}*>AyafR zKUsEyx@yp~37n5dvarl}jpbgB9uXN?74oX_HVd5^zIgrFU|U~pPt@PtX}Q_!-27rY zhC=0cRqR(n-z~QUyAwHd|74XdwA21a;lUA*x$7Gl=}IL(h-VD?da0IbazJ($t|M;f z@y&~D(jC^0FtH8w@jF)-2f#+XdqjlUqJx0AR$5BxyJ}XXCfxgIop;qH93)PL3}Bo% zB9uhHP3Zrym!@xyORAj8-t&84Iq4(I8f8sb|J!s?i*G;y7W8!133~Am&fE{^{tq#S zHR{{EQLzf6u(AHgD=}GxhKhRFL2bhv-kt!E_His(zI>35MBnoGw11~*Ott%^E_;S&i$iSWM zM_Rwa?gh-mN1YeS37V-qOiRQcPGOavfk$nSaVvf>8uuX z0!O=DFgMQ~l&;kwEit7*n3?D$IuWj5h_vbrh!hWB&$}qZ$gJr_#p(lHef@P1uuT|c zSEMbm_0K)|Mmb)6MdL2rezXOZ|H%Ht(ED;8KxXy<%tb-s2JB>oXp&?w@)7yKNbMDI ze<`?&9O(84KlL0N<4fIbyVa$7+vEHg`iLWV#!rac<%GmZYrD$ahuz_%-w*=J>}K73$BE<|c)x`NzdH(IQpAM+EJ`3Wni6DK zYk?pHuh8euEFgC}th$FQgpR|B4p5GTzOG}2;48=_G6l7OSoQA7s8w5pCc{M~5MiYA z`urKgRFbooCQzj$E{S?nVKk*mN8#z6n;a)^u3N@@9t{1bmhby7?3-^qs#_aH8RMxk zQ*(Iyj(k&;a_#CG++06hNnr;`7@vgS53?Cp2yB|ihwnayc<|tqOgf~ar&xe%qU$_~ zPn_=*>Gr}`6BJpevRNPG-fgs{Nqh$L-SdyjTs$Gj15kuqx827NZB|u?0qZ4Lr)N49 zf(yRa{YqVAe%RJ)&T&C`Z{j^p(&2+~e8Nv%)5f-B)u89_t;~91N;LkG8v3^IS0#5L zSIEtA5cV2LafN|kY^{XQc2SdCv771i7@Yh|0(55OuDA28v)74S76!I<)!xK*7AYRKMYJYdcwSt zw-NY+Q3TIxzj*zXRtMR$Gh5Urx$@hfKdS&QFE1;eyjEc*-_n5#3Su=LH&4cuqM5E= z+XGu?=!d00+k~EKQi)fzio%k~VS=tPc`E2{<9Joa`x=anPm^YXGY2&FcD%1pVQ^`t zb!*6me)RJX9L~~|`IYn=c{#p`@IDT(lo7UZw{?IH+y0QC@`&fC9V~C#e-KoY$5xcA zhnZ*gHX9C3o2=BU&Qa)PW>UCZGV#N>)xD@KrW9%snm0yhcD`O>R*Vo!L|g&6^|_5q zunE&L!`vg1`)CRlS2|f-8DCvpN#gH~mLiKs)~ImOyMt=;-U6*{R8nH>l%CNAvwca) zchbcdsII$_;Y=npX#;(@iAjtW5)672^O#(rKSSDb#VSTn>)E&wQ|e%-C8>>3rrcq+ zN=f>@)YR4z;3C~@qK$vKT%azqvhwrLvuRvV;N?$rKbcRs+_rC~?ZRBE_|qtfEdL{- zJhZ)%NXo)#$86^`hm^uVr&KC2E2nZ_7Cuo2%6u_7?3@}2o<7=>FkV1TGBu-LxPL3W zzf_hHaQ2-7Qyg{}ksVUu)|q^sLj?^M<|AAf;~0v|&h?VBZybCR<@>e$sPx20@xuq% z-JXQk!3shA#O}pZdKAXdf(EtjXZ%P4EF$Lye370}>G$2TdO*>@&h!rDk3J^-CxS#V zAQHo|nv#|SkqLe(j$#Rv+;g07?=tJ<3KJd$fR471(ddlctMPNKW{T9l&IR^X z^pS^1J@U7&hKuPX!mn}KqX?-UF%KE#(LKAkl*qB+z2PcR0-4MCvg&VI@J9TJi zu}`8WHH?QI>ti&`{tAZ%QmhG~cs2rqNzp7^OiK$%t`<8;Lc(%X$dQZM>-;ia>1QUc zP+e+?(eQcL0q4s{><)eX5rkVOlRRWtq&r{ts@S}6Ntc?KvIthLHVe(7X<@Erd05yA z3d#Xhx3Rs#0EDzU*sdzo5Mz)j>{Uqjl1SftQM7{W@PtY%I|pjLTU>FC*=h}OXi7xI zaVisO+uMU1P5aXm+$g$+6K5m8`VhUvdi_`fBIg3-aZn9pk@eS|7^)UpdB7vv5BsYu{|I|LL^2lCaEUJ3$sd zH1>O7{2==IGy5C!5uy#^;m2L;B9|0O+H*Di-i}X3dQ+vbT?)*-8hd*eWx!_oa6Rpn z)Q*hXSl_~DzKGvq9w`V}qV?=bya%Pt;$e`hA2$uSnUp4@k7oCqG|Xka&qy*M*fIP0DKbP3 zwx{v7F|43NLSN&r;NDCS%8WXS9$tL>asVrGbZ&Rp^t8sO2txPA@kU-nB^v5*#ugFi z=Xso7f_2$;@dzhn3FJ*=Dwf1T);Lmb3=8x;+QTvxU8CB+igwIRJ_A21H%}ufM%9=1 z>__u#0xx8K#J+R>KD?}fK|(TOd_+gH4^I4&<9}OGCQpdj?&gq{Zf5t9ZkHf|7Oar) zNQ^u7-bwfJbD#4UVr5)YLkVjMYc|O>VrO#`WNu`+qF4Rb@6L@TO+T9ECx!%Q{z?S% z_;mI7m{PhO)C2EP^Zyc?l$*C+wpLwyj;*zge1!VWiT5IvC>>v?P3H2{xGYu z9tuk^gQpZ)G!VLhJs<7AS=7f27Eyj)ha#h6yMT%fM$;ADjYowM{rx=?3>yfEG{(?$ z;>d+@1C3UEVMV72n29Ws%I>Tsi79BAQlEheXEU4GmQW{rFwa7%jKra}lsh%~L*ntQ zuDH;POh2bJiPd_)8c4@lneO)wV{r2DLRIS+8wZ%oe`7}bYc7uDoPa0->5dWq&GR!f zr9*=3!dAVf7)U7U3$?xLa-b;wNFbtMm-MUPc|77hgL)}%#4s_Cln>|U|u~Z>v6T#APPn3HC zzMqO-F8oj2lj0w;yk21vp-Jz~-oNxW{VK4elQ=XKTz8|5a!jNBZz;vh2DPkQ^-V9+ zdft%2c|-`MJC}c9@lP(qTnqBg|0|^=sCg61fw+}7&7cA+VJ6Q#hdrQ0ju-*Xq71=& z4ge)Xo#Vm5eHE6Ed*;}|tO5;eNN3snJ>bhia-aP~jDL>opHZBIEw7lLK_T4yr;>@k z6VLi}!v%VJdPZ-K;J)!#M$W56uOD*TsLnS6nLsg6qN;m$w9C+49|d<>^60uapqkYV zj3oW&nPi5-pk2y%Ji&^WC?gTO!-}~r&`&(u+?ILkj%?6uJ2c2}IVF!L&(|~4lLJSd zG>(>|?>l)Vn@lZLN#59ovY4>&^F#3<9xhaH`jk-KSQ$t6a3Q1yd%+;*{MScfbqM*7 znJJElJiR5E*46qtl@9^epN0m>E~joA1>cijW$+1H@FXXC2nu;?LW~G>yO0uocAnar z=P=l8+(rWl*4agqeLOc1CKJt*b z%WKPwc`1)O`=I$>+=;C$r)zqlPn^M@HcfiQ*%VB0R-2U!r;JCT1 zXoi788`31Chk$A2PRG`t!ol!MIeDMqH1!EDy4zNJ@iJU`xVf5W65kPv; z6=nguHa4}GKHSGWhe|L%ra{7DIm$xVws5N)6p0u2*PYI|(jQU6 zU8}*h7LC4=s;G^uY_e+6jisu;WXJ_{YVX)T?=~wGUl4`pmdX#Dhwn(+ZWq37vPlb% z-MSrh(1NHbBHzBs&JtIw;MS>Bcz`2|V{g0nPOgCftlxxX+|X_8nr#~`t{Tf7 z4+v??0jDm7$O@Biakf5rx;|<+2;FdntQ?7uFpJG0ewAE9Qf3;2+pPnKP8-_OG^^N+ zLIp2K8X*njhgpc1VbOwENU7!NF(YZ)Xc-<`a1g)kymC)N@wmZZ^neprs5&AW_f9LB zHr+4VzK1DRABk-+XmqO4n&lRebf$ZXe@0>$EHy`!mBbZ2!SKnPEPGspRM?uPfzXR!T<_I?kjfLmN%U*AQ%q9R z2*EY){t0E0b^eNuEKm?MEnCSBx%H;K1*-?T-2~G|1<(wJGDU6W9ldV|`|6a~6SjQt z9r|lpiDiD^skg7xDuCXmw|9W0UD6V9!k|gAFyhnVJeDEiy>F`?m7ulS(IOVqJESqi z^TSUMzSovqM23h}>^vuO)FbKzL~a*B3XgYjg_7_4PBD-0|q7UmE!vFJCYrdcsZ*p{ix3>{HQv)ok-sVb56MC=wZh(krx0O(>4V7zw9l}=B|E{Q1VhOq0@6Bb-8j{QCErSph!(2A2aB3hW{blWo`Iw)U7A; zB1#Ur@vZ-^v?lBll{3<8znF$KG9KUck^H8>4pU|%fK9RdvFgGF+Q4@(xO6?dLWRrY z9?G?WU_aYzvs#dGcR!g=r-eX-6n`-z8;OPq-NIvg6utf_O$wms)85cDeavZcoAdb3 zmC&MLErSq3_)J7flDQV63&C~KInLi`!+T!Uf#}If?)7lAR+^(swGzeep}${%>4y<| z+1*g8BlX5EqeMhyj_Ff+6hb6}cat$pdBQS+p~ohmQY9Dgf!1`-z&WqBK(gb| z!H-2p%5+qsKQ2urKrwt|C7&$X18&~FFF6}m37j;g%7^r;yssWux%5hKT(TAOv6+Oa zGa)_sv3nvYsmekmSOW0l0tbVQ8BMs8JxU5AZcOu5K zKl;rqO^!UZa>+KVp?jG3Es;{OGzo6Nu2S<^g{?v=&!M-}R=oB5UnWIhH|YJA-K$@B zLSh=+7yJ^}XE9d3L~dl6oc?~qcoO}M3eVuKW^9wL0O!HpMreM;XaPlnDKy}@E9?4c zdQTu|QhqCptLLFpy%(}B_Tq@JlikQ#;>-^Fxv{8x1C>gKCUF)zldw23XSX!I6}IzA zJ$f7kx4^c#|4Y9@h@TQ>z>s$P;g#owGJA&>HHbl}YZlTKBI8MTha-ML5-5HXA0PKe z%-5o(3G1l3IH!7lO|r{gDm>gVOHyfUabT|1u5ljdGT{Gu{=0hmJZFYE_L0~+<7b1N zUhjz7d!tkvii_cxPK_25kGfU+U6U?HHnk1bhfVs5;DoB1&f0PIFTNbgMYUBMEmsd4 zx91v2lFX>x7a_Jy_d@SXAvV;>wjVzC6vebWfD+0X@ry{a5%Ig6?_egE*Iw4v)^H?3 zMW@Ep)&t@({ldS~W^6!@nQUz4!Ox+>*T@J+Rn)rQx zRw8y)L2Xg@%6)ubKk9fcq+kG=ME~!Ji~{UN14qG$;|FMABo6SKk`}sEmbm3}>t={g z;+r!6z4?EK{x|x+6aUY-z)>Q5S_PAj;#`yC4jjFrZ(Ade$1>kCpI0l%SYive^fU-~ ND9WnI{E#vW{U11X`Mm%D literal 0 HcmV?d00001 From b2d3f979d7aa43996900ba7ce108dff715367b8f Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Sun, 16 Jul 2023 11:14:47 -0700 Subject: [PATCH 22/27] A bit more about the menu bar. --- doc/2-interface/menu-bar.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index a55518d2..59bb8917 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -1,6 +1,6 @@ # menu bar -the menu bar allows you to select five menus: file, edit, settings, window and help. +the menu bar allows you to select from five menus: file, edit, settings, window and help. # file @@ -238,3 +238,13 @@ all these commands show or hide their associated windows. - unless you are working with the Furnace codebase, it's not useful. - **panic**: this resets all chips while the song is playing, effectively silencing everything. - **about...**: displays the About screen. + +at the end of the menu bar, more information may be shown: +- during editing, information about the data under the cursor will be shown here: + - note or note modifier. + - instrument number and name. + - volume in decimal, hex, and percentage. + - effect type and description. +- during playback, the current values of the following will be listed:\ + speed/groove @ tick rate (BPM) | order | row | elapsed time. +- if any changes or edits have been made but not yet saved, "modified" will appear. From e160fccd2a0633d130754d935ed8b7f7c85d1ff3 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Sun, 16 Jul 2023 11:28:02 -0700 Subject: [PATCH 23/27] And a hex table because why not. I'm just tickled that we have a page about hexadecimal! --- doc/1-intro/hex.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/1-intro/hex.md b/doc/1-intro/hex.md index 6139ca87..16a28bc2 100644 --- a/doc/1-intro/hex.md +++ b/doc/1-intro/hex.md @@ -95,3 +95,24 @@ now for decimal number `69420`: = 10F2C ``` + +# hex-decimal table + + hex | `0` | `1` | `2` | `3` | `4` | `5` | `6` | `7` | `8` | `9` | `A` | `B` | `C` | `D` | `E` | `F` +-----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----: + `00` | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 + `10` | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 + `20` | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 + `30` | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 + `40` | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 + `50` | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 + `60` | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 + `70` | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 + `80` | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 + `90` | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 + `A0` | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 + `B0` | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 + `C0` | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 + `D0` | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 + `E0` | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 + `F0` | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 From c995f98fe7baab4e9d44029f9b187ffe7c66a337 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Sun, 16 Jul 2023 13:37:29 -0700 Subject: [PATCH 24/27] Terminology tweaks. As requested. --- doc/2-interface/menu-bar.md | 6 +++--- doc/8-advanced/opmask.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index 59bb8917..b53aa5f7 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -154,7 +154,7 @@ it's not really useful, unless you're a developer and want to use a command stre - if a column is already selected, it will select the entire channel. - if a channel is already selected, it will select the entire pattern. -- **operation mask**: toggles which columns will be affected by the listed commands. [more information here.](../8-advanced/opmask.md) +- **operation mask**: toggles which columns will be affected by the listed operations. [more information here.](../8-advanced/opmask.md) - **input latch**: determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - **note/octave up/down**: transposes notes in the current selection. @@ -176,7 +176,7 @@ it's not really useful, unless you're a developer and want to use a command stre - **invert values**: `00` becomes `FF`, `01` becomes `FE`, `02` becomes `FD` and so on. - **flip selection**: flips the selection so it is backwards. -- **collapse/expand amount**: allows you to specify how much to collapse/expand in the next commands. +- **collapse/expand amount**: allows you to specify how much to collapse/expand in the next two menu items. - **collapse**: shrinks the selected contents. - **expand**: expands the selected contents. @@ -203,7 +203,7 @@ it's not really useful, unless you're a developer and want to use a command stre # window -all these commands show or hide their associated windows. +all these menu items show or hide their associated windows. - [song information](song-info.md) - [subsongs](song-info.md) diff --git a/doc/8-advanced/opmask.md b/doc/8-advanced/opmask.md index 6e6ca725..d0b7240c 100644 --- a/doc/8-advanced/opmask.md +++ b/doc/8-advanced/opmask.md @@ -2,6 +2,6 @@ ![operation mask popup](opmask.png) -the operation mask toggles which columns will be affected by the listed commands. as in the pattern view, the columns are note, instrument, volume, effect types, and effect values. the effect toggles apply to all effect columns. +the operation mask toggles which columns will be affected by the listed operations. as in the pattern view, the columns are note, instrument, volume, effect types, and effect values. the effect toggles apply to all effect columns. -click any area to toggle it. a `---` or `--` means the listed command will ignore any data in that column. \ No newline at end of file +click any area to toggle it. a `---` or `--` means the operation will ignore any data in that column. \ No newline at end of file From f0d51323af74ac76789dd013e19b1ce5d73d72c5 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Sun, 16 Jul 2023 13:31:22 -0700 Subject: [PATCH 25/27] Add percent sign in replace dialog. It's not clear that the "scale" option in the find/replace dialog is meant to be a percentage. This'll fix that! --- src/gui/findReplace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index 0755e791..b6fcd14c 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -39,7 +39,7 @@ const char* queryReplaceModes[GUI_QUERY_REPLACE_MAX]={ "set", "add", "add (overflow)", - "scale", + "scale %", "clear" }; From 09d226a9aa642bda19a2953b9db41c54315e5d9f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 17 Jul 2023 16:31:55 -0500 Subject: [PATCH 26/27] GUI: fix replace raw --- src/gui/gui.cpp | 24 +++++++++++++++++++++--- src/gui/gui.h | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d6e68911..332c636d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4848,6 +4848,7 @@ bool FurnaceGUI::loop() { case GUI_FILE_SAMPLE_OPEN_RAW: case GUI_FILE_SAMPLE_OPEN_REPLACE_RAW: pendingRawSample=copyOfName; + pendingRawSampleReplace=(curFileDialog==GUI_FILE_SAMPLE_OPEN_REPLACE_RAW); displayPendingRawSample=true; break; case GUI_FILE_SAMPLE_SAVE: @@ -5715,10 +5716,26 @@ bool FurnaceGUI::loop() { if (s==NULL) { showError(e->getLastError()); } else { - if (e->addSamplePtr(s)==-1) { - showError(e->getLastError()); + if (pendingRawSampleReplace) { + if (curSample>=0 && curSample<(int)e->song.sample.size()) { + e->lockEngine([this,s]() { + // if it crashes here please tell me... + DivSample* oldSample=e->song.sample[curSample]; + e->song.sample[curSample]=s; + delete oldSample; + e->renderSamples(); + MARK_MODIFIED; + }); + } else { + showError("...but you haven't selected a sample!"); + delete s; + } } else { - MARK_MODIFIED; + if (e->addSamplePtr(s)==-1) { + showError(e->getLastError()); + } else { + MARK_MODIFIED; + } } } ImGui::CloseCurrentPopup(); @@ -6756,6 +6773,7 @@ FurnaceGUI::FurnaceGUI(): pendingRawSampleUnsigned(false), pendingRawSampleBigEndian(false), pendingRawSampleSwapNibbles(false), + pendingRawSampleReplace(false), globalWinFlags(0), curFileDialog(GUI_FILE_OPEN), warnAction(GUI_WARN_OPEN), diff --git a/src/gui/gui.h b/src/gui/gui.h index dc7a4ade..8b3460fa 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1335,7 +1335,7 @@ class FurnaceGUI { String pendingRawSample; int pendingRawSampleDepth, pendingRawSampleChannels; - bool pendingRawSampleUnsigned, pendingRawSampleBigEndian, pendingRawSampleSwapNibbles; + bool pendingRawSampleUnsigned, pendingRawSampleBigEndian, pendingRawSampleSwapNibbles, pendingRawSampleReplace; ImGuiWindowFlags globalWinFlags; From 9d3b8621c5a71af41c7ddfdca4066242208009ac Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 17 Jul 2023 16:42:07 -0500 Subject: [PATCH 27/27] GUI: fix undo in select and type order change mode --- src/gui/gui.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 332c636d..cd92c003 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1418,6 +1418,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { try { int num=valueKeys.at(ev.key.keysym.sym); if (orderCursor>=0 && orderCursorgetTotalChannelCount()) { + prepareUndo(GUI_UNDO_CHANGE_ORDER); e->lockSave([this,num]() { e->curOrders->ord[orderCursor][curOrder]=((e->curOrders->ord[orderCursor][curOrder]<<4)|num); }); @@ -1436,6 +1437,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { } } e->walkSong(loopOrder,loopRow,loopEnd); + makeUndo(GUI_UNDO_CHANGE_ORDER); } } catch (std::out_of_range& e) { }