From f2c6ed286da1b0da3c22391eeb4266a87f7a7cbc Mon Sep 17 00:00:00 2001 From: "Othman H. Suseno" Date: Tue, 9 Dec 2025 15:17:58 +0000 Subject: [PATCH] feat: Add MHVTL kernel module installer and iSCSI binding guide- Add install-kernel-module.sh script for Ubuntu 24.04- Compile and install mhvtl kernel module automatically- Add MHVTL_ISCSI_BINDING_GUIDE.md with complete setup instructions- Document how to expose MHVTL devices via iSCSI- Include troubleshooting and best practices- Support for library (changer) and tape drives- Client connection examples (iscsiadm)- Backup software integration (Bacula, Amanda, Veeam)- Tested on Ubuntu 24.04.3 LTS, Kernel 6.8.0-88 --- MHVTL_ISCSI_BINDING_GUIDE.md | 698 ++++++++++++++++++ dist/adastra-vtl-installer-1.0.0.tar.gz | Bin 28866 -> 29348 bytes dist/adastra-vtl-installer/VERSION | 2 +- .../scripts/install-kernel-module.sh | 84 +++ scripts/install-kernel-module.sh | 84 +++ 5 files changed, 867 insertions(+), 1 deletion(-) create mode 100644 MHVTL_ISCSI_BINDING_GUIDE.md create mode 100755 dist/adastra-vtl-installer/scripts/install-kernel-module.sh create mode 100755 scripts/install-kernel-module.sh diff --git a/MHVTL_ISCSI_BINDING_GUIDE.md b/MHVTL_ISCSI_BINDING_GUIDE.md new file mode 100644 index 0000000..9cdaa66 --- /dev/null +++ b/MHVTL_ISCSI_BINDING_GUIDE.md @@ -0,0 +1,698 @@ +# 🔌 MHVTL iSCSI Binding Guide + +## Overview + +This guide shows you how to **expose MHVTL virtual tape library and drives via iSCSI** so remote backup servers can access them over the network. + +## 🎯 Concept + +``` +┌─────────────────────────────────────────────────────────────┐ +│ MHVTL Server (Ubuntu 24.04) │ +│ │ +│ MHVTL Processes → SCSI Devices → iSCSI Targets → Network │ +│ ──────────────────────────────────────────────────────────│ +│ vtllibrary → /dev/sg0 → Target 1 (Changer) │ +│ vtltape (drive0)→ /dev/sg1 → Target 2 (Drive 0) │ +│ vtltape (drive1)→ /dev/sg2 → Target 3 (Drive 1) │ +│ vtltape (drive2)→ /dev/sg3 → Target 4 (Drive 2) │ +│ vtltape (drive3)→ /dev/sg4 → Target 5 (Drive 3) │ +└─────────────────────────────────────────────────────────────┘ + │ + │ iSCSI (Port 3260) + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ Backup Server (Client) │ +│ │ +│ iscsiadm discover → Connect → See Virtual Tape Library │ +│ ──────────────────────────────────────────────────────────│ +│ /dev/sg0 → Library (Changer) │ +│ /dev/sg1 → Tape Drive 0 │ +│ /dev/sg2 → Tape Drive 1 │ +│ /dev/sg3 → Tape Drive 2 │ +│ /dev/sg4 → Tape Drive 3 │ +│ │ +│ Backup Software (Bacula, Amanda, etc.) → Use devices │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 📋 Prerequisites + +### 1. Ubuntu 24.04 LTS +```bash +lsb_release -a +# Description: Ubuntu 24.04.3 LTS +``` + +### 2. Kernel Headers & Build Tools +```bash +sudo apt-get update +sudo apt-get install -y linux-headers-$(uname -r) build-essential +``` + +### 3. MHVTL Installed +```bash +# Check if MHVTL is installed +which vtltape vtllibrary +# Should show: /usr/bin/vtltape and /usr/bin/vtllibrary +``` + +### 4. iSCSI Target (tgt) Installed +```bash +sudo apt-get install -y tgt +sudo systemctl enable tgt +sudo systemctl start tgt +``` + +## 🔧 Step 1: Compile & Install MHVTL Kernel Module + +### Why Kernel Module? + +MHVTL needs a kernel module to create SCSI devices. Without it, you'll see: +``` +ERROR: Could not locate mhvtl kernel module +``` + +### Compile Module + +```bash +# 1. Download MHVTL source +cd /tmp +git clone https://github.com/markh794/mhvtl.git +cd mhvtl/kernel + +# 2. Compile kernel module +make + +# Output should show: +# CC [M] /tmp/mhvtl/kernel/mhvtl.o +# MODPOST /tmp/mhvtl/kernel/Module.symvers +# LD [M] /tmp/mhvtl/kernel/mhvtl.ko + +# 3. Install module +sudo make install + +# 4. Update module dependencies +sudo depmod -a + +# 5. Load module +sudo modprobe mhvtl + +# 6. Verify module is loaded +lsmod | grep mhvtl +# Should show: mhvtl 49152 0 +``` + +### Auto-load Module on Boot + +```bash +# Add to /etc/modules-load.d/mhvtl.conf +echo "mhvtl" | sudo tee /etc/modules-load.d/mhvtl.conf +``` + +## 🔧 Step 2: Configure MHVTL + +### Check Current Configuration + +```bash +# Check device.conf +cat /etc/mhvtl/device.conf + +# Should show library and drives like: +# Library: 10 CHANNEL: 00 TARGET: 00 LUN: 00 +# Drive: 11 CHANNEL: 00 TARGET: 01 LUN: 00 +# Drive: 12 CHANNEL: 00 TARGET: 01 LUN: 01 +``` + +### Start MHVTL Service + +```bash +# Start MHVTL +sudo systemctl start mhvtl + +# Check status +sudo systemctl status mhvtl + +# Should show: +# Active: active (exited) +# Started X drives, Y libraries +``` + +### Verify SCSI Devices + +```bash +# List SCSI devices +lsscsi -g + +# Should show something like: +# [3:0:0:0] mediumx STK L700 0107 - /dev/sg0 +# [3:0:1:0] tape IBM ULT3580-TD8 0107 - /dev/sg1 +# [3:0:1:1] tape IBM ULT3580-TD8 0107 - /dev/sg2 +# [3:0:1:2] tape IBM ULT3580-TD8 0107 - /dev/sg3 +# [3:0:1:3] tape IBM ULT3580-TD8 0107 - /dev/sg4 +``` + +**Device Types:** +- `mediumx` = Library/Changer (robot) +- `tape` = Tape Drive + +## 🔧 Step 3: Create iSCSI Targets + +### Option A: Using Web UI (Recommended) + +1. **Open Web UI** + ``` + http://your-server/mhvtl-config/ + ``` + +2. **Navigate to "iSCSI" Tab** + +3. **Create Target for Library (Changer)** + ``` + Target ID: 1 + Target Name: vtl.changer + Click "Create Target" + ``` + +4. **Create Targets for Drives** + ``` + Target ID: 2, Name: vtl.drive0 + Target ID: 3, Name: vtl.drive1 + Target ID: 4, Name: vtl.drive2 + Target ID: 5, Name: vtl.drive3 + ``` + +5. **Add LUNs (Backing Stores)** + ``` + Target 1 → LUN 1 → /dev/sg0 (Changer) + Target 2 → LUN 1 → /dev/sg1 (Drive 0) + Target 3 → LUN 1 → /dev/sg2 (Drive 1) + Target 4 → LUN 1 → /dev/sg3 (Drive 2) + Target 5 → LUN 1 → /dev/sg4 (Drive 3) + ``` + +6. **Configure ACLs** + ``` + For each target: + - Allow specific IP: 192.168.1.100 + - Or allow all: ALL + ``` + +### Option B: Using Command Line + +```bash +# 1. Create target for changer +sudo tgtadm --lld iscsi --mode target --op new --tid 1 \ + --targetname iqn.2024-01.com.vtl-linux:vtl.changer + +# 2. Add changer device as LUN +sudo tgtadm --lld iscsi --mode logicalunit --op new \ + --tid 1 --lun 1 --backing-store /dev/sg0 + +# 3. Allow all initiators (or specific IP) +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 1 --initiator-address ALL + +# 4. Create target for drive 0 +sudo tgtadm --lld iscsi --mode target --op new --tid 2 \ + --targetname iqn.2024-01.com.vtl-linux:vtl.drive0 + +# 5. Add drive 0 device as LUN +sudo tgtadm --lld iscsi --mode logicalunit --op new \ + --tid 2 --lun 1 --backing-store /dev/sg1 + +# 6. Allow initiators +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 2 --initiator-address ALL + +# Repeat for other drives (sg2, sg3, sg4)... +``` + +### Verify iSCSI Targets + +```bash +# List all targets +sudo tgtadm --lld iscsi --mode target --op show + +# Should show: +# Target 1: iqn.2024-01.com.vtl-linux:vtl.changer +# LUN: 0 +# Type: controller +# LUN: 1 +# Type: passthrough +# SCSI ID: ... +# Backing store path: /dev/sg0 +# ACL information: +# ALL +``` + +## 🔧 Step 4: Configure Firewall + +```bash +# Allow iSCSI port (3260) +sudo ufw allow 3260/tcp + +# Or for specific IP +sudo ufw allow from 192.168.1.100 to any port 3260 + +# Check firewall status +sudo ufw status +``` + +## 🔧 Step 5: Connect from Client (Backup Server) + +### Install iSCSI Initiator + +```bash +# On Ubuntu/Debian +sudo apt-get install -y open-iscsi + +# On RHEL/CentOS +sudo yum install -y iscsi-initiator-utils + +# Start service +sudo systemctl enable iscsid +sudo systemctl start iscsid +``` + +### Discover iSCSI Targets + +```bash +# Discover targets from MHVTL server +sudo iscsiadm -m discovery -t st -p + +# Example: +sudo iscsiadm -m discovery -t st -p 192.168.1.50 + +# Output: +# 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.changer +# 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.drive0 +# 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.drive1 +# 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.drive2 +# 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.drive3 +``` + +### Login to iSCSI Targets + +```bash +# Login to all targets +sudo iscsiadm -m node --login + +# Or login to specific target +sudo iscsiadm -m node -T iqn.2024-01.com.vtl-linux:vtl.changer --login + +# Check session +sudo iscsiadm -m session + +# Output: +# tcp: [1] 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.changer (non-flash) +# tcp: [2] 192.168.1.50:3260,1 iqn.2024-01.com.vtl-linux:vtl.drive0 (non-flash) +``` + +### Verify Devices on Client + +```bash +# List SCSI devices +lsscsi -g + +# Should now show: +# [X:0:0:0] mediumx STK L700 0107 - /dev/sg0 +# [Y:0:0:0] tape IBM ULT3580-TD8 0107 - /dev/sg1 +# [Z:0:0:0] tape IBM ULT3580-TD8 0107 - /dev/sg2 + +# Check device details +sudo sg_inq /dev/sg0 # Should show library info +sudo sg_inq /dev/sg1 # Should show tape drive info +``` + +## 🔧 Step 6: Configure Backup Software + +### Bacula Configuration + +```bash +# Edit /etc/bacula/bacula-sd.conf + +Autochanger { + Name = "VTL-Changer" + Device = Drive-0, Drive-1, Drive-2, Drive-3 + Changer Command = "/usr/lib/bacula/scripts/mtx-changer %c %o %S %a %d" + Changer Device = /dev/sg0 +} + +Device { + Name = Drive-0 + Media Type = LTO-8 + Archive Device = /dev/nst0 + AutomaticMount = yes + AlwaysOpen = yes + RemovableMedia = yes + RandomAccess = no + AutoChanger = yes + Drive Index = 0 +} + +# Repeat for Drive-1, Drive-2, Drive-3... +``` + +### Amanda Configuration + +```bash +# Edit /etc/amanda/amanda.conf + +define changer vtl-changer { + tpchanger "chg-robot:/dev/sg0" + property "tape-device" "0=/dev/nst0" + property "tape-device" "1=/dev/nst1" + property "tape-device" "2=/dev/nst2" + property "tape-device" "3=/dev/nst3" +} +``` + +### Veeam Configuration + +1. Open Veeam Backup & Replication +2. Go to **Backup Infrastructure** → **Tape Servers** +3. Add new tape server (your backup server) +4. Veeam will auto-detect the library and drives +5. Configure tape jobs to use the VTL + +## 📊 Complete Setup Example + +### MHVTL Server Setup + +```bash +# 1. Install kernel module +cd /tmp && git clone https://github.com/markh794/mhvtl.git +cd mhvtl/kernel && make && sudo make install +sudo depmod -a && sudo modprobe mhvtl + +# 2. Start MHVTL +sudo systemctl start mhvtl + +# 3. Verify devices +lsscsi -g +# [3:0:0:0] mediumx STK L700 0107 - /dev/sg0 +# [3:0:1:0] tape IBM ULT3580-TD8 0107 - /dev/sg1 +# [3:0:1:1] tape IBM ULT3580-TD8 0107 - /dev/sg2 + +# 4. Create iSCSI targets +sudo tgtadm --lld iscsi --mode target --op new --tid 1 \ + --targetname iqn.2024-01.com.vtl-linux:vtl.changer +sudo tgtadm --lld iscsi --mode logicalunit --op new \ + --tid 1 --lun 1 --backing-store /dev/sg0 +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 1 --initiator-address ALL + +sudo tgtadm --lld iscsi --mode target --op new --tid 2 \ + --targetname iqn.2024-01.com.vtl-linux:vtl.drive0 +sudo tgtadm --lld iscsi --mode logicalunit --op new \ + --tid 2 --lun 1 --backing-store /dev/sg1 +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 2 --initiator-address ALL + +# 5. Allow firewall +sudo ufw allow 3260/tcp + +# 6. Verify +sudo tgtadm --lld iscsi --mode target --op show +``` + +### Client Setup + +```bash +# 1. Install iSCSI initiator +sudo apt-get install -y open-iscsi + +# 2. Discover targets +sudo iscsiadm -m discovery -t st -p 192.168.1.50 + +# 3. Login to targets +sudo iscsiadm -m node --login + +# 4. Verify devices +lsscsi -g + +# 5. Test library +mtx -f /dev/sg0 status + +# 6. Test tape drive +mt -f /dev/nst0 status +``` + +## 🔍 Troubleshooting + +### Issue 1: "Could not locate mhvtl kernel module" + +**Solution:** +```bash +# Compile and install kernel module +cd /tmp/mhvtl/kernel +make && sudo make install +sudo depmod -a +sudo modprobe mhvtl +lsmod | grep mhvtl +``` + +### Issue 2: No SCSI devices after starting MHVTL + +**Check:** +```bash +# 1. Module loaded? +lsmod | grep mhvtl + +# 2. Service running? +sudo systemctl status mhvtl + +# 3. Check logs +sudo journalctl -u mhvtl -n 50 + +# 4. Check config +cat /etc/mhvtl/device.conf +``` + +### Issue 3: Cannot add LUN to iSCSI target + +**Error:** `tgtadm: invalid request` + +**Possible causes:** +- Device doesn't exist +- Device is not a SCSI generic device +- Device is already in use + +**Solution:** +```bash +# Check device exists +ls -l /dev/sg0 + +# Check device type +lsscsi -g | grep sg0 + +# Check if device is in use +sudo lsof /dev/sg0 + +# Try with correct device +sudo tgtadm --lld iscsi --mode logicalunit --op new \ + --tid 1 --lun 1 --backing-store /dev/sg0 \ + --bstype=sg --device-type=changer +``` + +### Issue 4: Client cannot discover targets + +**Check:** +```bash +# 1. Firewall on server +sudo ufw status | grep 3260 + +# 2. tgt service running +sudo systemctl status tgt + +# 3. Targets exist +sudo tgtadm --lld iscsi --mode target --op show + +# 4. Network connectivity +ping +telnet 3260 +``` + +### Issue 5: Client can discover but cannot login + +**Check ACLs:** +```bash +# Show ACLs +sudo tgtadm --lld iscsi --mode target --op show --tid 1 | grep ACL + +# If no ACL, add one +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 1 --initiator-address ALL + +# Or specific IP +sudo tgtadm --lld iscsi --mode target --op bind \ + --tid 1 --initiator-address 192.168.1.100 +``` + +### Issue 6: Devices appear but backup software doesn't see them + +**Check:** +```bash +# 1. Verify device type +lsscsi -g +# Should show "mediumx" for changer, "tape" for drives + +# 2. Test with mtx (for changer) +sudo mtx -f /dev/sg0 status + +# 3. Test with mt (for tape) +sudo mt -f /dev/nst0 status + +# 4. Check permissions +ls -l /dev/sg* /dev/nst* +sudo chmod 660 /dev/sg* /dev/nst* +sudo chown root:tape /dev/sg* /dev/nst* +``` + +## 🎯 Best Practices + +### 1. Device Mapping + +Keep consistent mapping: +``` +/dev/sg0 → Target 1 → Changer +/dev/sg1 → Target 2 → Drive 0 +/dev/sg2 → Target 3 → Drive 1 +/dev/sg3 → Target 4 → Drive 2 +/dev/sg4 → Target 5 → Drive 3 +``` + +### 2. Target Naming + +Use descriptive names: +``` +iqn.2024-01.com.vtl-linux:vtl.changer +iqn.2024-01.com.vtl-linux:vtl.drive0 +iqn.2024-01.com.vtl-linux:vtl.drive1 +``` + +### 3. Security + +- Use specific IP ACLs instead of "ALL" in production +- Enable firewall rules +- Use CHAP authentication (optional) +- Isolate VTL traffic on dedicated VLAN + +### 4. Performance + +- Use dedicated network interface for iSCSI +- Enable jumbo frames (MTU 9000) +- Use 10GbE if possible +- Monitor network bandwidth + +### 5. Persistence + +Make iSCSI targets persistent: +```bash +# Save tgt configuration +sudo tgt-admin --dump > /etc/tgt/conf.d/vtl.conf + +# Auto-restore on boot +sudo systemctl enable tgt +``` + +### 6. Monitoring + +```bash +# Check iSCSI sessions +sudo tgtadm --lld iscsi --mode conn --op show --tid 1 + +# Check MHVTL status +sudo systemctl status mhvtl + +# Check device usage +lsof /dev/sg* + +# Monitor logs +sudo journalctl -u mhvtl -f +sudo journalctl -u tgt -f +``` + +## 📚 Additional Resources + +### MHVTL Commands + +```bash +# List tapes +vtlcmd -l + +# Create tape +mktape -l -m -s + +# Load tape +vtlcmd load + +# Unload tape +vtlcmd unload + +# Library status +vtlcmd status +``` + +### iSCSI Commands + +```bash +# Show all targets +sudo tgtadm --lld iscsi --mode target --op show + +# Show specific target +sudo tgtadm --lld iscsi --mode target --op show --tid 1 + +# Delete target +sudo tgtadm --lld iscsi --mode target --op delete --tid 1 + +# Show connections +sudo tgtadm --lld iscsi --mode conn --op show --tid 1 +``` + +### Client Commands + +```bash +# Discover targets +sudo iscsiadm -m discovery -t st -p + +# Login to target +sudo iscsiadm -m node -T --login + +# Logout from target +sudo iscsiadm -m node -T --logout + +# Show sessions +sudo iscsiadm -m session + +# Delete node +sudo iscsiadm -m node -T --op delete +``` + +## 🎉 Summary + +**What You've Accomplished:** + +1. ✅ Compiled and installed MHVTL kernel module +2. ✅ Started MHVTL with library and drives +3. ✅ Created iSCSI targets for each device +4. ✅ Configured ACLs for client access +5. ✅ Connected from backup server +6. ✅ Verified devices are accessible +7. ✅ Ready for backup software integration + +**Your VTL is now accessible over the network via iSCSI!** 🚀 + +Remote backup servers can now: +- See the virtual tape library (changer/robot) +- Access virtual tape drives +- Load/unload virtual tapes +- Perform backups to virtual tapes +- All over standard Ethernet network! + +--- + +**Last Updated**: December 9, 2025 +**Tested On**: Ubuntu 24.04.3 LTS, Kernel 6.8.0-88 +**Status**: Production Ready ✅ diff --git a/dist/adastra-vtl-installer-1.0.0.tar.gz b/dist/adastra-vtl-installer-1.0.0.tar.gz index 1acb2bd533a5d25374dfdcf73289f3eba4da5bda..31b15ec262bff42754562f77419063f06745123c 100644 GIT binary patch delta 27037 zcmV(}K+wO!;Q^%O0gzmOR7oU(?w;wMo}TXM8H`~Xe&8AP)4;Ao~m^`!@7^=hl3zb3%5N5})ub%Q*(qUU$?GPLdg z_Sx%$-Ix1UR0cNi+R931`?r=`iS}P@F0Vcy%_}ND_xgpm|0ZuSfAaQlkL=3!pL6IsgtS)Mt@ZZGijxZgKY#V+^3uKizmChM z0Wm%6l=@_Yy#MfYF1)erPMm;xaJ%_*Zm#cwa_|R-=VJ!_d5*wU-Q9XY-s~MNuRd

Aj&EhyDG`&uT+XE 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 MKLVs)H~@eG0IqYGf&c&j delta 26635 zcmV)1K+V6Tnw?0ajq)mm#VuQb=!9yD9a>+35I$m-QrLw`+xXOEBvp6dpAa7EAW=w)cz z|LwEa2fHu#uc!=c;I);N%=T|Bw-W8Y+FV|LK$=%ne(v=PZ~sj&-u~q6;U3wQ?LYUH zdcNg4ZPIEq8_l_`iDjE)#|UVfEH#%_>#e1F^9gCKv{&(;lMDere|7kFZ~w33vS~m} z&pM?(*&y#fJe><~Y`YUDpdQ?AKAoHEyPzEW!QuIsL4Teja8-A=UXV9?hs&#voAtw; z)oPo3Ca2UfU9Zg^Rv(eE=bDo~3=Y*e;3EB%jENoWFx8g#PmnNpe=$IIV4dLIDg2+4R8!PM zAzb$z<8;q*KBDG_mHuf$z4HTV(|+K3o3>r6HUO+{16);P~`n8KwMRkSd$NNQ+` zEoOh=qeE8UV__k#1Bi}zHGI58zD*lr(oWk`S(j8ze;BFI#6!U;a%zuYpiHmg1IEI_ z($eZ@@AveJG&u%q(-ZT0i-NB$u zR+>$&7rgoA!e;Rsk&y1Ja_b3bqf1+S0)H;>rgy6h;?;9i5CD`qHAMRI^ za28TN<^ZBG;okH(DNqg!>g+u~e6fc(VQX}t0)&;fQHe^b4=D_QUZtzprOt4r`?o*; z;V*>AnaC1lSDJPf0YJq7lOI6yhyr?nL*ReiG@KKlPF#l#IU5yjM|tzb7@1F0fRXga ze})6q`1gPPzyJAtXOaCPuNl5t^dc`iqR?3cUb|Y(!TOErC!S>{IZng4ld-N=w$Y<@ zmkS0pqqE5GXzI@f8RUJ4V%Vrm#wKXQj?}5R03PvCg1g0%lmdM2m{oamO9AF2oAif2e%(8BwMc!oQG>4WaK$$=v<{@g!gtccbDk*h(ag zgpOCp$Z|F+P53lEZB(8-spv(kZCsv4-b^bqQ**_D(kV706?o4{9@se?kn5 zNlCO;XOM)Td3}O7WFz@Za^TLum5PCrygn)Hz1g2h1mNr>`Cp%beIR#@ymQBl?C#7a z0_opfsbvVMUY|S;z$2YW66n%OA+$mv%pwJ(c#Q&Jj`f8Gi-3L#(sE#Qrc46du?BfG zXAuJ?`re!nrW93YJW6_37UaI|ZR zAl?GmD-#fSu^aDMAs>JiD@HdbmW%|$`e9Rjse19aZiAJft5iHTmo$~CK+*J*T9sYA zRahU6_z<4eTd8XK4S#G~e|^fK9+CJgan=-$Iu!yw+3~!bqK#oE%aOCYoV!QFGC$3$ z^W~AOWXJ~W0$6&!Ri$5krb(HdsaBt6)loEiS2N+Ion=iXAe4p!+qG-v&4>X&-7=we zF^vsTMJ!o_FGD*$5gvyX(GYQwp2Xh7DZCf_ zg!5TILwJIE68nZxgpVGT9{IV;CL43HhX9j-E{B~03ex&3MA#q9JoK54;_ReY4b~>B zKR7=)$6;akcmbY^*sTp?Gt=QI*?zvczyEAc+!3nT7#rpR=uS{uf}y8bou87!&DXzq zb|}EO@@b$TE*2o5e_ZM3x+)Q&NtOv5TLY`lGJ1jvf2PNi>Z3&z5A~RD94ip%0K!Lc zfyI?cj|6VMfC7EdgD_n%Esv$bq>%BZ9(+sA=QB9*D*}yA>!++(WMVHi$)2dg4-PYg z?bMWXBXAFRl5t+s%rT`=rnd62A{C0y1Lflgg$id)a-l=fe$<*YqbsDD$g)Xnu5sh(Dx6A3b5@cuM3N?>{(@e6<Ru}51e;X$7`Ih1JU6a1@=)n3^NUX=9v917~MU!bYcgez-BA+fUzzXW1Qj+9+ zil+5*?r_M-08mz?UQp9AL{dAS$_OFrs1#YWcBtc9L9y&j4wprSWy{M8sgK|>0fob~ zShTl2GI3=}^;ZuUdzQ1VCSH| z2LBFYM8X#b5@Udi#2A)@X4VB=g{r8hZZ$(FgVd@9E+e6BT$6;^RP<|sSTQrY#?9zc zJr(p~zWJO|`RO;GqhhA9o}OU)c=Qo*N!=!#is*k+QXi3!2K@5Hb5vOP8Hk^u`oTR@ z+!JaPf3p{J`IbV|2{d6eG8{8yDq?k3Lu}JMb8Ocz6G2CMF;pbB(D%EP-HKD{*=`T$ zIP{Ec!PnY*j`-mb`79TNA?D)PhR~}T8cmKo@z4i<^LkID>3L=qe%Fw!0;)LMiKM_(vG>niYOPWjhsR%sURS}RKked53 z#tzgcK3e!g_iW#dM(SFXH`2s2loo~I&!6=BFkTHNwtfDviqq5lMl~_d(s#$_*Q@{z zUrFbBD4}uB#Z?byo)yqTfUI$RKpRr0R!cLoB6e|~UoLoc;_2uv{6uR_Gp|5$yR08^F*8#eVI z62ZT93lt~?tz?xte&D&zN%yb6|L@MC_)a#lR?r<(2NXRj(5F-CH5!dDsHW(Y0UuUl zJRF0Q6`86L4Ti1>q1CIG2Zyn>-h3Ic-%jMxs>0E%vo!#KhO!YoV(~{G9pEUle->Lg z4iQe9{Qbep{RZDUVhzq~DrKY3dsWppPU#WnDMl>PptksoW$@-=AKbMCL5`t;MZ%4L zZ(#ju^KmfK2n^M9vurEeZ3x#kxsRqqdrGJHX$GQxIk&vRw*Jq5A_tt(!>G~K*ak(# zd}!!KSmy!w)YDGS)2;LvLD0~Be@)p8nwWz@J%Jz=2{08Wd=-FCCO+yFNQj74;5}-) zXAP(ZqoPnhR@p2H$C$np1fyZY5^6&eUbq271W`)#XY#~*Ox2J`C zMiGq=W`11A7*rIOhfb_CRVOdQ@}<~iWj99948{qKb38M*$uQ32ig>^^e=uRaOBrQB z;ntaD(Z#R>DZT8jnqwj7Bf&=Xt1!FOd@C!|Qfg_!TvdxKK|cD|X6*!*QqR9)OIOHg z(#oZXi2`-Y!kidfxm{;*3`JhYae0Y7KF1myZXw66Z;3*y1M3r&o7FU+fjdU1rRMlk zHjrnX41;2@pLfOLv+5JLf3o35mh+F684M9}xtUASaIBG(U)8rEUfXp@v$5Ne$bs5=Q#)2F3)eK`qI%ofm1 zS2Ui5&{UKu`6B}DAT^%-XmY*hip=VlqrvPs>afr$B{RkS;lKMxf6oUVD6>ywGe(sj zcj$I90(v5yl^I1%yQAnCAM zGG)V7=x8!Fo_m(#xCBZ>1F$(Wd7Z$Nn}6a9;woLfqNm}2GXOqhV0LrSaG_d=gFi~( z;6{`XXXKjTf5TC;1Rgh)zHWz7-n$^!S2iygdn<%V!2zJCShZ@L<7(zkG2Oc%b{Lg( zbyDw#;CJH;#(Hj$^1z|#G6J@NWe2=N_z9oHr_h4KL+Xu+R~Ir+nGc4bY0o{Q-ZpsU zYVLs-Mwu7n3$+cceuF=isv2=4WvS8yRqWdn6RI6mf0WxQ$z*|Syj%^~v^JV;!B3~mlM{#_Z zYBtfJe~EdlWBoi9UaE6nFvpdyK{VwO)1-D{Y@TJFDP1HVLDK_g;T%tIVt?ETdrZ=7 zh<(+0HUkONIiGa_9@!4h8eJk`87G;TA7?#S6f>`#c`I~Bu5Oa9n&-p3vT-7VQ1)g? zLu!JQ(9=8{aWOLmLzh_8JVJfJnS0QFQP7pxf2$Kn$15hN9Bs_{Vm98+=+BVYUMBs zM|7i%UA)JKBj@e%>6P8#BS`7@_-KYK|03Ib1o8ZhKK;@gVg$M5mY7)O3ib=h`ef`F ze;Sq9EhK2PKLB_UKO&%M0^YoUYb4 z;QG@cE%LkH31#Y%Rwy6@Bc8D{fo0yDBJOe|h2HyKbcsO|FOo-EH%a1S%M;Hv6mIXGZ9V zFWU@_mkJ{6OIv>VCAd*cCnE=lH*SF&6>`8vZ=d}7*Ch5+&c=83bMd-b;?h`Ly(bpy zvHtI?VXrUV#R;z1{8X;TOVmq!OJ~~IE63}-vv(8D-r^#rZ%SVXZ{a)hiP&@Wf5LEp zD30~yJK;C_7bcoa(jw*9`^N8*l@@6~#=#9OT`QeP!Aho6DJq$AN$H4^l9pCUl}}Gc z*ozf?ds0aJ)K!W;J*8 z(Co%mEs4E5mKm*1N~e8N_~?8@f7l{1#cmcOhiLZ1@zI%XY7$MENJif-jghk>|kw_$Vpqd`+J4G3iNw?9V35FsK7?Be_3bYMVu`t z>cVX&mRiH>_QjmStzc3s9b(_62$OZ~yB=clcZ(}P0iKNlf7H7?q3GOLGVywYHlds% zfC&R7>nEpp{kn>)uJ11jeS|-JANhQdX>Mh71`XG*J=l?nVb+W=h{NdpEn#W8Gt0Kc zyH8neZ|}{%&!)yUxA*+Ue^ZUq*;-s@t+hS9gPh7D+Dd~HV&wg8*i_5&%M-52Cq626kP%g_wGaXS7$JSc~ker^YZC*%zRgzVMK;wUrh230LBCb$NMZ=|O9?)mm#V zuQb=!9yD9)t@Y*u(wwQ(lGg+m;Sut{bKM{huITw4y*dwfe_n1Me*fwj!DjBxb?}4O zprIQT>QwLs7;T=j?too4@O^TgPlJuho5Szwk1O#ovE`QkHnZ_*Zn^9ij7vIDMN_Fdd*^nKh8+gap%b#N3BxQ-DX?gw9cM*P6__{o3a!jYWg z$$>z<=NV4&2y+HEY<2(k=YRPVE;vvaf%|D-+%_wz`jZ}Gw$gno4sKxk`s8a@6={hL zw`vXZk2J(eqX4!0g$*IaUx@{i?iXOQCAu19 zwv(a&cf{1Fo<)Ld87V`_^83D}A;FgK72wiOqLU<%pRori?CjGQJBxtaof91qG&4_8 zJ3i%+hh=V5l1(X}$(GF26aiT09-UUlmq5q=_#aui36Ik_Y6= z2LNp|f7VJUv(kOT({{%MNH$ZPvE}fv>VvQ*a5GIe-PyFop#{n+%uJm(YUxtrVw>3p~P|A3JKj2rb5Axo;=PJkKIik%bmB5N-MxCWmddUyV4bJW1pQ} zNm25gWVy9^!z}YK6ip?5&d#u)cWe2zC*a5If4$kCol~Tg#pe1AbID(L4vqo)yg0A? z9C691peC6;IQ$3Y0QJW=%&d4bd!;L0<3209lAh#uZ@t-6PmEu?VUGFhC>*lHR-UpkwZ;;+ZF+Bk^c5q$8 zNb$o>5uaVq`%a#+U5W8o&kU(`MD-g3f5x6QVzErPCBQIEej>MS2LOLL)nEVgZ}P=d zo2JP{lc+#)wSQsLsd43%wcH>7mk0Y74WyK|W4l9dE^uNDh{GpQTwh-R6+d?M>cS|6 z>g^1sG)KguDd+q7`9A1b#w{IrDTwX8eZ^L{@UXw8~NllKW;;8Pos2y?1SHBUuu~{29NZ2BLiliiZD2j)VnVqB2fto;r>>+^0pc|w(t8r{>T-zV+^^N1*bA2~%ti2I8 z{J{=8!e9Kw5sv%8Kjr*_{Rz%Te^qr=KLGHd$IKFQ4h3{qWo2b$Wo2b$WnOz(zda(v z;X#T|C=0B>GtSw_5PCh2GE`;2npl%+gIb3YRuT%2w2DtQ;qT)LzqvAqcF%KR8QZ{r zfT6Dq=et+?FN;s`?`$A&y+uNN;*peb6M%^P<$7bNpnCx(#S$FfYsWLPZ%3*D>V$kxG*<`!=rZbNfSz)o!;YM)S1$_zbsn|p`s20q8#Lo!g_ zE$<&v;L|&ZPpL7Ras6(2Wwb!+UZWctr5$cPVPcu_VegYES(xxi|+TFIxD)CW9^Tr#mB%Hgg*ROKxHEsJr-hHTD zk52r769vPjsExe-*ONqg_DO>DS2j)(tSG%xC1v7ZL29g2dqT&jMis(N8vM*o!$oV` zRa8`vcLkaPV_$tOe=>-2o2OcnHUF!O%+>b<|MJiO@NfBGHvbFR}Gh_k5W@dfJ0j@$E322IhXp!{Epp-UIa zVTqqMd$R6~>~Mp|cClQ((gr)HBjoK~%(5}CH+@bIC-Zqme=`_FF0&ajW#lz7qlLo= z`x_V(g5_>J=#-V9;6T7}y6)KSL6?Z&N%4?v2ht>P8}v1fWv|@FwDdg=fXVyQ1u#{g zaNxsvZ;ApCX?v$Z4@ALQ5hmRKAP(q_jy7DJx^@Yna3ufpCdO30Z*Y6Hyo|_-<6s1> z!0X{V5e7ZK43@~LdUCXw)wVi4%$9dSI9DaW7V5zwOK*eKb~IuX|3CT|6k~4 z0tRj@;msJd3Lb!N>Mi_sq?-(WYlyZR-usd8t|HMs_!TD|rk5_G-ikkm0W;avPkL=n zM-;}rKE>39z5eNqu79n?AZ@W*fv1)5WX83Mc2OtjSLnA@Xk=-AP=NHe`ogD{yef|L zRb;M|6*rN#b{OY>EpqnHe^O49aX>5HAN*FNtc(_TYf@Ih`<$e#5!0~v#283^bQ1|= zLbgRv?NPm4TX|Tnm21_iz}9wlW)nx-dphJGR4ZaV^0{>fmw&Ml>O)DP5A8FNh-*2U z*Tg^lw_1>4tkQTcPU!tq$B7wjxT#Q_Gok!1|NNi+4{gMy0FXDuc@_gw9B}h9wC^S& z8{OUw*#A{i97}DgS;NY589C$@Q1k#!#~#^sFr1Zm|L||M zg#jud?KXP;@HhbOpAolQb|u-0BXUd9^;7D!$WXY!v476NKG=ElI^C-x+M$WUlCp~! z;S?_&koOWtb_^wUFnUx8<4VGU9G3GBqO+Ol!W|9B#Z9x4Y)tn5%I8~*DPt*N++;f? zvH8rlQ@6oj+r}k2n2O}3_Tkqqd3Dc`ZgE##ya?9S#FFf%?BPuOln_y}>J{1ON~#$D z#ORMI5`Sbj2yja3?G*kpP@gHH>F~+__rJ$6O8w9mhu+yB=mjUf_{-n^=Qy0@X%r2c zm5K}}T*hr?{2gOiQt=5vU9D+v1-E3(Rj~e@;mQX z9Bmg0@UL_1hF)^l)R%#n(OALtOIZPl7s`dgy?f%B=SE{#{t5+0STSKOp!8CQr!sCK zm)uUL!l@rC+9zXyVab?CCviw26&;q}>m6gpu8&Im`~OY63_9qBcC^h7aZ1{Os?zre z|9>Nlu#VsEiJhPgecbfUy??T+ACRv2DJr@^2hoW4LQT9y~pA66e$3-?4YDhyAD!Z{EL9X|}p;ptn0qwg_^E?5Zm z&tM`5XDEtu-@V%ZrnR}fUumBrn_H}1ESU3PN?~gr6nP#XBg0}8^!=YD{eQPQFd^RR zsP%6V^|ma6L)QyN%ylHH%20hYLV-y?L4ro@Q)El6h6xHt54>KEm7J zzqYyz-xK*Cs!O%I_5Wjhn%FOyzQj=mH-~tuDel#mR~p{&*Yd62AL;iiORGx{Mh&b^-Hh21b-j(Qf}h)+wSrsuc`r~FQ@ase0h`V>}z z5x1y-{!%DBkfh}eeN$Aqczo-Ke;)_$@P0l$k{H4xfZ@XgG8+-6(ofo>$ z9fTARxGPaI?t}nr&mB1@cozf&OsUpb?szAQisqtve^Jqyu2ty-Vnk#Rd?lN<@;!oe zPCftRG-`@kS&nJnAAiITtJU*UB14%oa!5*;$c;{p-BN9NQPdlYVyV6;s^v$^3vnkp zqhRRp64xfFicMucj}3G14ZtEF^{w?J{~igV5(pQz4M{?2@07`9_xb z*&)@Cx?~ResoM!IpcLM(5i9V2>P{7U!T&4Q7Oei4^;TVyLVsJ1x;^h51O5?Yn%}*2 zWcn3AYUs8-=h%xbJWu8rqf4KT54;lUtDmYJPFx~RYbM`e_y`;&x+Rw$UQ2RFQY9_} zR?Bs+Y&TO@NlntNRm%@obK0|KV@xB?Uy@Io6IYqktQtD&-lQgIOz~j{9C<|8y4E#Ur)K`7Ssb%zMmxiqXQm~kYKEvmRUl*CU{F#|u$F_F)`8TVHY8Q@7PQfQ zoN~B3ZGVbWztd6Dc=n|rDKqpy$IQBDfJ?G4cGr>`*^J`UjTO>F?IEC5t7qU=Ux*v9 zIVxT-S^it(xcd5=7B|rTQf*NzKSDf~Gw?WVWG!U%*?Cf*O{BXNvzhkcN(u&iCKn(0 z2JrjC9tWf9jr#-Oosl>6+^B@|4ipto+&~2a>3>+NFT=cF6t(VXVZmIz%yl&OlFDE6 z@SDTd9O4;nI8~qBsHQB!)`GO6RGI0sbAm*m@&+G{heL1F)=OZ|!|R+5>M(M3tuANu zp1igetw%BjP-4uinVJ>|azk+o0%11(O7i6_nn70Ao86#24zmcrZzLIlafE8Ox$fCp zq6i5Ky(J0ozlM{JC~JRb$?H6fD@b!hZqt^zVq(*>WPa1t&R`{G=)rT zm<#5&+iBNV>MI7KO6ul!+P2|L?zT2|2} z7cyb7<+XCER;HmkA74>SDH8Nh8xuwzI#--~NhECr>ozR_S#*EOppw?CmS){0=4={ZmV z=;6c@B4H_G+hUooyC+prUjFJS9XpExDL*5#LeJ|)6!(QmY_v%R**sGm>ftq1%Iixj z=B_1cRgVq3Gnju2O8HM~MDHj9jUz9fpITl%Nn>p?Z*4DaVZ8f=e$yST(Sav3w z*D@r;)7F6G&MNaJ*a}TGk*cKCdu}Vs#Aj(banuJ{$P9mPmKg4yI}AN)kiO-~fCSj+ zbkY9ZnYg7g#{osibvF7b4Dz@vW8*RVa+K2Or|d*?<@uy7s@V-PAw-sPE_opCn4{RC z9_9kb)yFdJx(0xUlqdY{m*e<^5?*3n3& zq`*%~bu?8&jX+XkSIs1iV1!Y&)vMMW*>yAa57RoVt7=QY_4=jYq=f0jX^&>~PknxW z)6Ycz4|nL7ho{4vwlUfNW2wH>Sh@56{6wF}e+7R7T;T0o38X(w4hQ4qH|bu6-zMFq z@?#hb=0U6$Dizz`t}wUpYWLapb98kQYhpfj^P2y!Hbdsc0oy4^64_) zfbxH^x(q5rG#Y!n^gtuey-4i6Iye*<#=kJf_k!01lA?ubUB@e-k6Y`+i&|2wgr#|) zXR}hF!t)CnBBLZ>yninMyU>eD{NVLGuSN53G=^ULG~kxJ0k!mcUT#(9#o80mb$fWw zGf!cW>B;=|;M_%pYUKSi_QD8Yv6KRmMAUzyIc@}Ln`jl#3orbreJV<_kU|5MA2A=g z=U$69>hn!47xAgQv84dYGOB4(Pez`5_I1I4hR%s;XyygANwwv5nwGpjWI#w>`}z%YbU)lngAXV9OwvQy_nH z;G7gtGn_pGoP}5v6)#0D8AEU;EU;__8WdS*20S#05^xmh4LCr2zcYn6puDwupDV~i7taD!(XrU{s+FU24)Lefsj#xIoe#6w68+p-qG}ypx&YH3tc<;P+35d`M zM066loxX6KUauo49w~h9V`&-3%yELD2v36xQGfDf4YoqEjYSjmf}}mlcC*DV)}YM= zLxoI_g?@#fjDfM=8-w)Bg(Zi)n2{1HSS9S-V3ow12nc;%#0W2FNak!{WG#Q?cTUB< zG^p5Sk77BJYhp0&_2esmu)eW#;Hf2ru$JV2O#penm(;kpp_oGxrb!Z{*>L2Yw8&4n zG++6nY^C%==c|RLD3!ljn5$qvuqON?{h1d`Ae#6VqRA3w?_R&b_0KB)wN>~R>sN{b zuTzjo(%{heg9ujOl0x)#?ahC}V!AY~2Ut8B`Te+XJ+m-~CuWLj#!I)|lP|4zZ|wf$ z43zG!@ZfivhT_XFg*`k!gkS9(?KXLQ^uVNs!v^!3yYS|#uRa`B07#(OVI;k`Cg7H6 z6?L=O8ntU?VKFnmf`-+jw$0(MnUfPgq%Kl)TU5z<3)totcB7^BHU)oCf4|*26a(+w zID8KS^qxI{d4#ZL=4?m|60uThkm9NEizz53Pq?WQO+uL<5-o9vV-z$0yi!B(m1>IK z%GFA*6Si_emuo`3Uci(E?4%0L@07+M{z^~e#0%}HH-~dLU0-T?0D#9f`5a{Qyt!Z? z5|5`Y6tk-RhufR;QzU;pwklZ)aay=p!*X&EE&PzS9k31S%z{LMkzc#c&+E<~s?MWw z%X#w^&!StvP?07wFl8|@4aqtGCzKDx{Mej?Ur`R{oVvoaCc@ze*r!`EnR#Y?W8huj zMFT+jeh0tMD?J*ZSd{CVM5D$0LVR3z1%t0_HeH&J@* zSx&F}@D3D5i`jTmcZ96k1$E?dK2Z<4&e8$Cq;wya@gG_9WtSdPR^IaqC|Z+H0xl`>r& zck-Fl<%_twjQf9?g22zSR`B@EXR(G80UqC0qZo{q!#Z9;e_)E-aDA4sVTW#XdLs?u z-XAGsYbiW|t;zeagZji9(8li}quvUpidLN%a!5iYVXcy-B|vpNVbYJSCp5Uq-dI)U*Fl8CxZfCi*2C`g(|Tq zo^9_OZtb_eUEkT>TtD1uZSUQZ^o+yZek_F&xzrR^+RCm%`CfTrrN;BOB$^EF!l1jK ziHM@H(*u8YeMyx%MY)qzce3g;lvT{9chYKhX+<}#KND#sNADKom326ukX0&XReJZ! zFLHLk@k{iIlVdKuK=(#o*MFCWC||dR^gc_9rAx3dBk1Icu{-Xk0kiuC>^QTLwO+?! zmQFg-!02%{ApJ^TjGrUd(=2L1@z4=CV_4;j1StI!;p`l~S}|7;Da)j`>i z-VCb^0@NRen2k}$t4+`diedmh3u<9B>Uo1Cu>iT1TP0W&1h9=BoRG(_Siwlgqi|vB zxo(M!c@bS}?a1C6zNo;$!V-@V#@IWNUHd%X=>?r7u!3urD~Ou@RPMUwrPC9}`a znN4C`U-kt!cNx1t9L)c&%6}iqe;?&^P0oPDB-~pw^QdVzW##ANhz%*5lz1SB%8!B` zVR*gLoKIy0{QFqW1N`yTSJv^Vy&jTtgv zDO@PV`cs0+%3p%1lXkpNU3txO9yEKTAAdLLlP^Iuh);8z2ppXl;;(6pWrwFImZrZh zyWc7bo%DiZwDjfiXnet+)U(dAuKy^=mfE=(LgVBriyd{54vm$k8=-b zbS)#i(Zz*?+(kGT9Zd(ENY;CPOOkF7T2TPnaZSllKuMWl(ex3j-m?AqG)!LqT>T zP`u6o?GrDY)lL%|YS_}m(Lmc#PbXaAz|7b1Vg8^t9F>|zV)>caa1_nt)e?KDE&ebl z&TPXmZjxv-GyL52M|4Fh7)JVvl(D^$_myPH8@uO$x*lJQnq?Zrh+2P6;1nVRHwJBt z9&I3)a`)zv=SUNrq?h*KT=^LoA?`Q&_RL3oqa2I!x07>ptw z-f&SUW-iUSsJobSW46KFX}dp!_sYi=%V~dC$yJI>*Y@|tt4q?`cj#sN`kF%nBdzD0 z967mn(|n4G&c27?yZm!+JHjyY!ASjUzui<5NWaDg7C9O|30r^lqS-w7W*aodSBD3{ zV>k!8w1OKdCZY4y8ozO#0M>-^g1L-I(o$KwlNMhb<3GBe=$yeem8WPp`G)?!q`%MU z@8MHrNa31L76T0O4^VX^3UkBY0@u!703DTYK?UgrC%VNZE(#TTRIApP7VMgRADz8| zi$y`Zz7k`$ARK?8A~Q&!l{Epy2*e^)mak>^DV%{uufBlOo1`%Ve2q2Ue4XhmiTCf2 zQ+CmRc$)ClFZXi92_`>5el}p5BHL1f6r9@-+%t>o)XH%S7{q?l!`XeEKo|^zumn@A zhgA$@F#DVNkk_^u?nq6;^8jZl+Re}XpeIAD&_G5bP=0?$A?UCj;E8rL-B5k?8)T!t za7JBX%A~PL_ng@FbJM+8G58#PO@}v8xl$Kp5JRhfvdTnb-y_CqJ&fqanD#vYhxP8=R2>SwqEV-e2>@g(?lmQ zQ%HU#mY07FZdf0ylP1M(z~(g;x|}-&O-YIjDdx+ghirGIBY~N;=9FBeLNm%#{7lxP zuVMP0D*w0}Gs-^I&*>&|leAYdk;jX;#_XDwa%*&xmU78ZcyDM^idVaWGGHf6g;T87 z3Tzp-Nn(piO|k+f@uzXS?a5?yY{JA+*nj$^R0gN=oqmSwTI>E68`2UUiyOwe(VLqFIuk-7>q^(VeG%y+No@KgXq

pnY~JK|RC=>%G3Ke-grE5fJ;V@L|Xc%9yv0DYje=Sz5xy6Vu;e z61&mBqs){8d9S?0v{m`qRi^AlEt2>&WzZaoT1kLJiiHcQBgmC?0o}3=e0A^X})a$dnXLtz3owpiueb zXUu7tSxP0iyC>>pO7f@q%t#}NN=3OM>y+UMRf;*%J%iy5q5yCChdkoAw`0Z$M2UYH zpdyFfjoh(0o)sQSraXa!#bM|TIu^5sw&ZJ3km%oA^E=V8$3E%k%4adOU8E|r@r5X&EcqBNAI z{*E$M7aSwCWf!>b0-G;s_D0<0i79^_I(#WO&fZ%>g2tv%hN%%oj?Ev?n%8qrB@elw zPZ9e=*S8WT?!@eR#=O@LI%CWj$=D;wpcQdo97-t6<3kJM$N~#*4JZ;HZth?P8Ra~F zp$qbP3R*nJp$!fm$YLtTq9pS=O~;JxEvgd7e&_;oxo07;M@M$IAk(bAKG=WS|8{HN z+1`6&jSn~Td^{j-m5^vwH?0v$CLcv(F1L4JHql%FhzZW%Z=>M_eH> zkt%Oxs$Q=$+`*fuf23Z&9^M`x$2kCvoVgEv@@0rXv1#mPmNzVh^=hq6Cs#yJ9O z2T(h52bZopSQMe(qxIx?eCBc)oJP<6=*9RLvqxdVh+uTdTJsK!+933BX#FDf88D>MxYA>Ks- z&e`5QI9%V^LHB>RwPJFmEf&7pdMaN{$Z37>{lVeZ%S~Aj1-{f+<-f&39N<+JAOOWe zVSj6LZT^R9qw%`>b)(jwFFfDh+S-jD)#1_iTRS_izLU>tUpE@?YBd+dp*n-AV#pEazjCh zoZ&HLL`R8JG|aXj$!ctN_OWq2zgu!(H4ZV=L=hE&AzH!JT2L;R8K}AL1Vim)L}3`v zMGem>(2jqYC~T`1dF4}hu;zh?*vf}ShY06%MP(e0D!riX_K2xX-7Q7QNoDge1L9>O zNGcHGM=Fj+OPa`wbH;p1ypdBWeu@u`sZ(Uc9+Z_H7MIKH0IjQ2%1C8a_rw?<7dkR< zMxI?Dv#Y%9nO&95VMB;=)^ol^V7>wMsUnB7GFN{ZQ?M&%v{2!ZuFy_s6jo4cmMiU9 zkUKuGqel(Sag(^KgfT^PKdvW%*D1yoXxbKwsgCakk=GPy2SwCTtYFm_-iU7gknY>b z19XI&@OeCeqzg;D8Ry^A034#H8tL4?(0!?!_AZ-61Ajrg{0__&5~=13YAW-MeINfyq2kWZNXAe=&cI1^ueXrlb`>AW9 z)>x|7R#)o}3;ONF#J5ye1|Y{0E35FnwvwoxQ@|gdFO{SAu!T_Iu%cvycG zE338Y!-p$NcDW0q+{*HDVg1GvRl z!xvC9u-h%XgwYG|JzfO2>koof--||mJ8a>l3xZKN@0Y_17u9DD4pOV)qmDm{E?cBM z;IrlUS)9d5zg{jBSPLqLusn8JegA)i^$zGx7_|nW#0C+v3Svq@TIE}8D92l!)tohE z;{0cQ5%&_HgI%A;rp*7^Qf)ao|KaJ~{QnrAdtx19{s`E`V{R?iya!<$U~yj=j3Y60 z!|);)bqcx)Y;D#`@Ml5nzS>(qIQVX}DM;PVGihI?=Jo5TjpJPAjXVASV|*r$zkK4b<>k6(0aM0*d1bkl zT>n?qOP1+DA`Xa`iq{5Oq}*wf4C7pmJY$>U@YD|l z^REsLWLU_h{fQ0YUB6Ix`QqEdoz}No`v=>vcGrrv@`|%sluzUH4{7S+$7~-<99l3E zuWOa%H>&@*p#j+^CfML}Mbp)YY^Lroaxn7Sc!-zx^iO3yaxTRWgeX;aU<=_x4IrJlK>E;J1H#?v0K^`=Ly;ZaoXbp7CHj_B+;lq2u~W5j6y07)j+hKBB^c5HXYuoLQ9jxLWh6#_kZ}q_pSAU*j-=8=9~3; zv(acSEj8WaX1mk$x=pP5BIp~Jnwy5ER}fEO2OV^~O|b+e3!8XwKp1Csq!xEXc{*)x zQoj#+L4*Zzd$|4dWquEjb`BfM53A1M=JLdj)+Y88-fjeaJOT&_YS+d7iiS}8dAk5b z;A)EA&q0446>8a3s86Fp{likBK9LIb+onQ2n+lC-RA}6k3M&(-(3nVt#%)ufkxhlA zX;fJHuvA!@NQI?aq5_CKTJ>{9YRa#%R<%WI;w%$gl7L1|h%pB-Fj_2#E~Qs6Scho25hdp01q&AW*8)ep!vS)ZD=X6F)+|KP5}Pn`T!t?ZrMhN# z9veN&wqL~WwHv501fWCVfjAy)hbL88F>dbz>Hm}Wf6C+7b0}=_HFtp1_J67Uf4x?# zuG~xQ|31d&miK>F=2zQU;xpd|9zH*8r99H2lZfU(xl=4`W7k^Szu#>=T|d}b%g+sG zZU&dEEdx_W2K^3$Zgk;}yczd{fQqq=TC$T9MPPqyd^T7%CSbYrd0^Q-bq6QjXab_u z+d-6f*bXY6LN;n(i@IlQaY)Qy<$_O>7v!9Z$LpMnarZ)e`9x@!H$&p#E6Uj+8ugWG zC29}#W2s4cJsX(i>YoEOaUB5t{@nrQ?{<(d4mzx_S?wh%=%%HY6o_C{VngAqi|yUL zqeFj`OHdbzcIXBZ0u#=UVtr#{Ywysib7Sz6Tc z5gO4prCOt4O&^JoxD9)rHx%{T(6A>gjJK$1ub;bqk9#Haf)@+W6Bst&ULZFnG*2t% z>iVgfMA_7Y_h5{gG)U%CSP5Zo6~Z=a&R%~S%|htrh=#+ao;4O=IeD7aR7&aCJs+9R zxF_qqbCG1R#;yLP+qeeqq_tA+jXpXbw}W#Juj&9tM971W`4(Smd+$lp?w(n3fFUUy z2NR(Uk_~?6!;bhOOg7o>`QrEMoeqyT(hoMgMr#?xcjCPES#Pm%$vsl&wUDk)#G!w9 zF!8^~V>tv*#A8L_Cvi6>>;HIUd&9$@|7!aAUxxojt#Nn$^HDyQ{?AOI-Tv7skafeK zBx&Ky@AXhSHEzLWd1f2M$YPRJCKk2QFPwaggZ7zub@V}Y)lnavzVq)C$Zn}So6xyL z;47F7?3(+j2jdfbCeMGqDsWQ?FlB%K*XoUx#7RpkgXNI`|N4?Bh93<789 zo_HhBK~Cu|Cx&Osf=Q(2%=Qvy949BExbjahkzg)~4Z0R9WS^}jl^%a(LSo=J$an+w zk_I^g3)7+}k;pZ*8P#^Z=pq=Mas0Qgt9$H&j&{sBbF->#VtBVBjxUPEJ6++Nn$8B9 zoiW~HfBG1$(=!ZgWRj-jH{z>z`OKMcYQr#M$mADZuZ<2_GRCLL=HwX}M4gze3!>E$ z^l9-&$e;3G^~?Aa#1DV)ANpK~3chZ=2TsBd|66J;WK`igP=kxvRRp$*c(fP~{DT|< zb*M&075qEj5BE=Wv8tuRvbe+0+>zSm&r%@ZLW^Q~j7EVyWk|F+(%Ukv2^53SZ> ztJ13c(E6buuKuAqnK2p75Q^fwR<0Hbv&wl*yNpGqJ+G(Uf}lD$0&6o<^Ck$+a_>$m~Hu)adpT?*wF>$ty~t?T6d-)&g`rrZBk z>Z$wR)z$jl{_kUa?(Bab+Wxn58@9T9i<;XbEmfq9a5{e|(zQbDBmG4cpO4&I`$JY##5&Fjr zTFZXAH1ti8>5rSTgGwIa`Z`Rdv5B;q=i|=*Y3IMtts5@@Q{;brxt{d@tTyiaKR?dL zlK;{f@Y#R%&X#$*&AK^c`_3CRiune)NohTs!UB?Qo6~MR(~hLCetK*Rw(M;*hwK8~ zZ$KuhK|&sh(pgG;xyln~p{NeGYlXt*{`R+9t=*%S2WxXBlJ&(u^1X~=l9=y>dvPY_ z|Au6Un5+LX505ZGpK!(tg#zCFC&^9W$6~l&i%x%_#Qzs!$mTL;kjrF zr?;RB!vLg;Y8va(3HK06M+-v9Zc*M3S&W|}aM=-`?uGn1T}ZOm|J#iIJ8k{1*I@&g zjQ?A$F5RvFALEm`|2x>&-`+dqdk}M_b_ah1VX5Pj6$^J$PuCA#v<_Y!?Qd+ouDdekq0*9a!srrJ;kL?i_8!rIvE`vV0ppYlDgPfBDOQ`14=>!=FCU|9Ep-%t7pb zgs0hwe$W&gTUnvxR5+RDWqH&zE1duI=?L{dClM=tWW&R?>>{5uTr_7a@yM2F0 zo@NIjy8TlFNhHe268g>N_QB!)tF^i9P5np(;+T_PTJjy;V~Cp@d7V=?%572tE{;w; z730>f-=S;)Ei`=KmL#t}7t6I>NWvb;iv)p8H=B{sDv!AMPs-k~DU;TM7Q%=KMGZDw z$%wROP>~j6niLUHIucU!C|5N;KbL;8$`fh7)edC+;=b(?3 zboYvhh$V5yizj|${E8!&7!Ud2$9O@-ZJS%p_tA!SP-WU!0 zS7wZK>MWZ(>{~^hK{xL*5tCO?FbY6!llxjp?xS=plaWvuf6HAk9*v3j!Q{E^8n%^J z#|SBJj;)OksGlBQL27%GurW$iEgJ#91W3M^4=aB>*xK3NJ^Jf4E(}awQBPDNn{%%+ zFMX^$x-BUEgRT(&f9f2~NI_>!R8m~0%}(B%c1JE`f`q&}9#+-~wpWq|*5tC;c>KG#pu&t5-RUY6m z$CVC8a`^&3cJ2X_UQr+=k)t>!Qa%K|j^)~CnV0gDU7#5^F_u=DR3A2iA-iDmDMTX8 z2a}^wBYzNrKpXlK&by?}s7mXICYD7!180krS=8zT?J=etwTC8?W>9oCf^oq-Y9&RW ziGW20g|?oiW*a)!a3)51MYC|4L>=2L1lGtQ@Ng=HOoC3*AaNC`M0mgetAtxw@G1|q zIaqyS%3#HGiyAb%MH#g=S5jHcRh@-Y;f#YC#D8K=0m*Mh6Q8lMsuwemD&+hm<82PR zY-Eo}Cga$DOw5aaVyTdwIXJK zmpe!C1{aFNyD=&3+0<{J1{VY2?CXHsO&v};15-=BSk-w?(Uj4TGpZ`maxGfA_QmS* za(`CY#K_6?h8-FRJ|3{^xAVs>(X>GaI5#o9OjDt9Wj za|yHM(o%JDu_SqAceJm6CK)m_LdAMJvVXLtq@W2-0c%yMJU8 zSY~Bq$*vEwg6{WZIvVKtbmMgb$CdXQ!g)^Ps@8}Mk)#5es2s9+dl*aVq+8(X6X0{^ z*$F%6gh0vAuWfhJbiaErs^N@vCuhf-4V}d8_bVclsy!_kUygv1Co85n(}xIc_SFUj zDv^CHb?zchFFwN)Duo#yEoDcb6o1wy_h?B0`pnLj5?Im!nAOisFLM1}*v#q`boX!n zvm%QX{!$$jnY@<|f%PtebP z7N)(Hwmj`wMTHqLhweegoJ9gmQ808p?V88%*ik$>EIr1x{r{CDv| zfo#+-XrW0WRYn6<&BDOK&Xa5-Ur^;ombS~?V+rM<=USJ0{E8J__9lFPU&yVmd zJ_=wx3eNqG2Wo5NjbL#KJ?CTusucrb!wv>N9pO|MbLTNqsDIerQx}xOGEspEBKA)G zUJwSu(@T5`#4$*)aT?Iw^aAWr9z0-;f-^KectC02L#bwnr$KNAu=_+0;6g(AlG4HV zg29Oc$o7R)YYKIQ_7a)_RSGHu5iPO^^3?!H8fSPS+oW)DxyI0KqCc{t5+sJx9ur14PFKKEW#iNO&0$ z6{spUfW$y`2eve7l(UBxiah1#DgwKRFikM1PuPEQ3V#ZQc#sJt4-Hlmq2C|#o*mw7 z`XRssCV?F_dBW{Q7#e`SBb%OHhB!k^ z{`Rp?&{1gwGUsQZ@b>N7!e9RU@BZ@Vzx{Ro?@xgJ--(P*EMi^&#j;As57f_tG4n^m z_?3|IPm?=X7k^VZYh;IC^3A*H9nJ*h2s1kOGZbAEmEu~U)XK*3jKr3b8CL`K=TA-f z^#A_xH^DYE($BqtH}cz}6rL<_HlWc}$NJYXK%XI&d3aA2esnujL86^9#pmF+!I zVmZ4v3V))Y9rV&(#&)eemCtF$wy!(q|L<$n`jgS_ELH>NfE*0}r~h|CLm8m*JDLkg zT1eOyBJ&_+qK?mGE+SPfN2SiIo!Rr*gz}#zK%Kd|A;*~GOgWbgIiskCvaNEtO^1>$ zICqi9i z(tj(&`$P8CH*hfai^txnd+rCLg0%@u)fffG0chtok_9It-dTvJ8(n{Zj$}+0=^zw$ z68ok@6q^9Jo3(dwPV4Ml=>n8mdWYHAbyjPGn((q-eP`sd7HxMFjr`7u$43)!@^qC` zy|nX(SHkU`1S3B>?bFyvm6uUE)Oso<(|_z>SPAMZUVM6MsI+hKSjKIia=UnJC_)d9 zh$4?Fz-#G+6AGYhWodQZF7ZFuSGqfk`HN$B@m?(aG~Y ztn$or@mxi+)l0;~Q3)jFDICxVwqU}w_GR#NojqbOY5XYY!T5x9-ea7VS&1Z=jek=^ ztPqtU_DytwvfNMDT_WTIMLrd{7>~?6O=22yJfs5tXw$Kzng~!Vms=@Lf!#HtunJkf z<6c4qB(78jk-CgliT)B%S#MmxV$d5bLg_tAVT7`Iq)r&It60e1<6?0lacSceT@e69 z=LI?pp5is)#C|x|NdeANZvYca34ev%C_K!_kuBuFzHq_0;)ShiG^koIw;0j@vIkIFa^KE47TExIsm2R4pyH9 zIwek?M&jj3R^enqS{Q#yfs2QP*cm(wW+Lj0wJ@K6NJ5^OvX3SANHKV$Y=0k;kG!@= zQZ_C=5IP$xp7knUO=KECti#u0Qp|~mxwcG2k|0Sn-l~bhN|`CsmeK}=jNerPXMuzv zR*Ad;wxupn+OlM|4D;=55L`f&6SCFd**6{bY5^g;8c0g=DBy{=ISBh6$*t^BKt6%@ za#^6v2{GN7+O|zlcd}7VFMk^9?ATZ|+)*FEo|Cl+$^EVA-B6TKbD{SbVO*^lG_5fV zIrc;koFaEe9AB!T(4_8o2Cfw4nO2}1mlQ7mYjS4PhZDWlqb=@#p6emH@5!Ay4E@uftU=>Mo#`kha0;SQc zS+J;nf&DC`tkmuP*W>OguJBVLa=v4 zkBz=nV)o&c?j>-ujN-^+DG`GesXd07D?MV?6U#{E!WsK{6yi+56&2>6sL#SGxk$xg zZ+&AYv=^xu4@W$cK}ZDUixwp<-jEW=%E17J^V_{$Sg=B`O@H{X^xxHa2~OfG?FLC@ zFL~wI;9)ArUYH)YC{z zn0)JvBI3;h$x5h{bkG%kGf4#yd1Pi6D9xuW9Z+YO+Gp8Q2;bXYN6n8 z;zTAW8dB)I@Im^^;JfTk)$WbaPX}R@x?|Mvn1(NPekSpyc&QEljI;E&iOV3$iJQhM zy@_M4hOm~6`%-4Y8#@iTE-%r>a6wvhkv~%q^g^|T>3?9GZ{uVWZ<|s}hbe@?YZ6&j zpe$c8fN~~6sEo2((%XLY4qm=YEL+UH@LDHRdE2xR?z>Hsn8;a3r76sEVz@De_QX zJ%`l{n12ZU$&_Y~2!H1tvpb%7*yF2YOa(f03HnlJhG_uWo%Ev*dOluJAjNUmQ!n2VP~&N`+yA97Cu>e8TnY3iHzD4o=a zRBT?+^YMTjAhFNDP|(n+hj&+GgWfv{^ZCf_0)HW546uXiz+kih_T0V;G5@&>08w7!RYPHlE!JctQkU0~0>(DSHg2LpE)o(7S; z<9{3bk4oXX0}4i@R2~G28$x)36rym(+FR2_|GaZ(tb|ULAWT`EqlH)Aa*1$B=-?_m z@_N2%Cth(-NyO1T56kj8op7TFc6NzfP0;N+Au89#%A#~veLPKD0K7&-!|@c<3g877 zCRpsD8t>@Ijk2S6jEEyF#;~sFwc6Ih>wmVsV{A5+wx_3+;n5iZzjggKYfG$jvp4Dq z;51^Xron@S>=ZaR}QYAl}-#sNhu1o7jIdY7nJKX`D+zMfd=TTcJOh*w6ur!bsdVVtRJP<54Dg3T~F2;e15Cx4t$ zKrWPNs9r($O=oAe65-6#GH>4l-OHmTQ;S%bAwL4YG^Ypd(gIieW%FgJ{bw7Zv0AUH zHO=w|e;IVVUQ?{^!i(+QjqSq&T&?M7BHMk=ib!;K@8`4pOt}9cFBY#KZok_7fcHOY zwfgdE>i);_^4+3>spkCQ7PeOkLyiPm;r!E8n%GxR-w;?$AQ;F{X<1tGFSzg zMN2}F%M&ip^q8=G7W8_Uf6*j8^tL~YLTMC{aOLg-7iru0qVoc(;(w7)VG3kHOhM{V zm=ZMK(jFBxf_;xral5GA`Bn#!jg4f7D#V1LUoe$`5V0vC8V?JF7%Ln)zm3NRCDXj3 zm79eoUCJQVz-UEc&~NvAT)6RgN)*3C!?U@`sTBpL`Sge9OJ&Ub%0|=Lqk6fv@~~Vh z*Q(V@eJL(;0=>R)FMrJv@yibA8pVfY`cL5BrSg&izt6)D8ZxLAg(QBUH)Wxx&id{d z`54t9mC9imCOS=OQ-=bKTMu+LO%1bQMp%#+p|?7Iq_(b>`q#8uIrsY_J4F%0-}l0d zFbXz|bQBv#LL<0jB4{Q2m58bvXR{z`vZ2=*JBbX+K7;tQ)U_hx-lRDb_(^ z(p9k--waSx3x9AIP9G(syj$j=^$5dWJq8)v+TMH8R6bS&yn*phPW%C%5FzlXum_m9 z%5i#FO~bMHJVu0m&( zmKzyOg;&7NavsFaQYC5jhIIffbbtBp{$8x(ltc3@-)SUk<^r+)^FXQ$>aL`Fyol#c zF!zgkTHtvxW(+`frdym^iQ%()xkA!rI6kRFre*Ld7drtDS;tUQNFRX{T{gJo4W!iBMK4c9F@}kk$@eg>q1?u#x!ia)__UX#^gU zIpEw=XsyW@?O}v9q}|kSzeIHmUS3j$?)4rhEPo+!ka|P`rIB#lh<*&?8uaCv${Mh} z1iB$D)m-kELIEEt^L3&F($5GUY8;JzEgC;+=8wAhqXD&5oAL}Cqw#V0Hvbr{gg{Ci z=MB~6{(-pfiu=SQ3Xn}QSj(UzddjieT0A(o6@p@-*gidR=)Ab8suc^- zP=B=+zb+Q!GdeLZ>QIa>0Y-JBA`2KA9l6nolAQ0n=fN{0KCj|g2Rz8dK!k)rk6aHx z#b~?oSSxY08YV7IS>?3?OD`t+bB99@_Smjs5DWrfFExDDG^EoHB)7Bz{umsywd-&c zjDcSOUJ&V%P}b})0%|Dp;UyH&M9$iT_J3mrbK-aM321Au7k%XIW*zyL#KBFxhNRrp(@T6en6y|Pr`d)aV zGco#tguiaXJeW}ZveZ71zLb8z(6mmYU|8@2M*p3t!FPN@FxNXjjzMclhXf#(4u6@~ z3#bGN@uNp*fg)X)6*V%7(m{tlD4;CLhLynXxlV7`KjZ9^JyEM-z*E>m;VK-Pu2Go+ ziMEUZP;1p0cLGwxwr$C3VSsidr~PwR!~ydhX5=!wDxdsJYrL^%iGLeggZN<Kz$lzHd9 zrGuDrihpJWgQo$fZ5kRD-^Pc6W~o{1)}Pv3_M7`mu>W#ku%rDO8-S<8|EX2$D@prr zefci`^GEsE_Fvm^dF!2vA>4QgmUnbnjmcCnL%%KEi*-^!HlTrcA=xF9n140JGFk{Y z$u0_MP@i{qw|1HWB=zC?{`0Lv`nq$pi~klt0|5;M1QJ<-^?)o}5->lc0jYe~6sp%d!+nuJ@ZDQ3I z0VtJ5JX145H7*80x7!p;P=B((37iq*%#PIJjwrfpZ&JSxdZ5@rf!rQ$KYf|s!=s(U z#`43ebGW%Yv7@z#J%zW1yIfOrUF@%DXeV&HfQVp6&=kF&g9H`yy2L&TL=)nMmC9=6 z;Y^%RzcwdKq*E2Bw6xQxPa@J&Nu&C$aYG(k=Ws*)_PAkXVn=HedrW#;+@PsY%ceqo z8Wrj{rNZh&D%2-Zp?=#`sAp55F^vk1n^NK7L@G2UQlW9XlEJ>Gk-LD%_jH6sW|gET zsS+X5nkM|82IYFSzT~qoY7GHGE;W{ymRI7p7Zcx7UFA);CK`?9<)tOi#O&%h1?bQ^ zY7bio1zs*yAFYUotBr?MQEM#KYpbjEhjzgWqu|Q&a$}Q!YgPvn9(usL?oX54YbJl) zz_;h!utgl&A_W1BylZGlEwDAPOc!`seP8-4x6s?SH3+E?ee8m0JEnw4Ev0>|iCDEr zo_`q5(B|n!UYDAqMve6hcE@Z#0Z=GsHpnv4<9+FYsA70#(B&gn`; zl^Jh$e{HQURDQhWU*_QjUL~CmEB7mvdEi``;gdiWg>wQcfAE}c#m*qf$-ll^-{0Nd zect3%UtJ8QF1gUg-_X}z?wk3-RA2^VLCX4s_6g&vTYyOkKrO|0L604J!eRmQOG*Ia z5!uy-y(3h`s*gc28RD42AM*@)d@CXWVVvCdf#k}fqN;1N5- z43xJDdr8V4e+JuWWC|*onkJG$rXv$9UI}jO6d`XoAIQst8)F!yzIAPzAF0qNvK*PB z_NB)R-y!9>3~FEDHJat$z^;XNfdFZZYiC8xDy-vuhBc`vl$9UjYuVD90&Z>Ay6_Io zJ*dA?2Eo0Nw^j+sCB}Ay(k0fk(~OE5lKo2QeEc>TA;vGyKu^SVMFoH{3QJG)HCPwr z)m!!Gz-zB9qi@mP(eJaca3KL4Z&dYo<2Ze4uavvb$NFUZe<=pNoi?tX|8IF|lkIUB zXuVpm)$aWNKE~%36j3Xn#Tsm+n^GGr)fR;ODV0KaGF@+7BgMyHOnp>B+LTBFOXD&*s /etc/modules-load.d/mhvtl.conf + +# Cleanup +cd / +rm -rf /tmp/mhvtl + +echo "" +echo "=== MHVTL Kernel Module Installation Complete ===" +echo "Module: mhvtl" +echo "Status: Loaded" +echo "Auto-load: Enabled" +echo "" +echo "You can now start MHVTL service:" +echo " systemctl start mhvtl" +echo "" diff --git a/scripts/install-kernel-module.sh b/scripts/install-kernel-module.sh new file mode 100755 index 0000000..f5f391b --- /dev/null +++ b/scripts/install-kernel-module.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +set -e + +echo "=== Installing MHVTL Kernel Module ===" + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "Error: This script must be run as root" + exit 1 +fi + +# Check Ubuntu version +if ! grep -q "24.04" /etc/os-release; then + echo "Warning: This script is designed for Ubuntu 24.04" + echo "Your version: $(lsb_release -d | cut -f2)" + read -p "Continue anyway? (y/n) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# Install dependencies +echo "Installing dependencies..." +apt-get update -qq +apt-get install -y linux-headers-$(uname -r) build-essential git lsscsi sg3-utils + +# Download MHVTL source +echo "Downloading MHVTL source..." +cd /tmp +rm -rf mhvtl +git clone https://github.com/markh794/mhvtl.git +cd mhvtl/kernel + +# Compile kernel module +echo "Compiling kernel module..." +make + +# Check if compilation succeeded +if [ ! -f mhvtl.ko ]; then + echo "Error: Kernel module compilation failed" + exit 1 +fi + +echo "Kernel module compiled successfully ($(du -h mhvtl.ko | cut -f1))" + +# Install kernel module +echo "Installing kernel module..." +make install + +# Update module dependencies +echo "Updating module dependencies..." +depmod -a + +# Load module +echo "Loading mhvtl module..." +modprobe mhvtl + +# Verify module is loaded +if lsmod | grep -q mhvtl; then + echo "✓ mhvtl module loaded successfully" +else + echo "Error: Failed to load mhvtl module" + exit 1 +fi + +# Configure auto-load on boot +echo "Configuring auto-load on boot..." +echo "mhvtl" > /etc/modules-load.d/mhvtl.conf + +# Cleanup +cd / +rm -rf /tmp/mhvtl + +echo "" +echo "=== MHVTL Kernel Module Installation Complete ===" +echo "Module: mhvtl" +echo "Status: Loaded" +echo "Auto-load: Enabled" +echo "" +echo "You can now start MHVTL service:" +echo " systemctl start mhvtl" +echo ""