wiringPi/0000755000000000000000000000000012457032564011354 5ustar rootrootwiringPi/devLib/0000755000000000000000000000000012457032564012561 5ustar rootrootwiringPi/devLib/ds1302.c0000644000000000000000000001335212457032564013645 0ustar rootroot/* * ds1302.c: * Real Time clock * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include "ds1302.h" // Register defines #define RTC_SECS 0 #define RTC_MINS 1 #define RTC_HOURS 2 #define RTC_DATE 3 #define RTC_MONTH 4 #define RTC_DAY 5 #define RTC_YEAR 6 #define RTC_WP 7 #define RTC_TC 8 #define RTC_BM 31 // Locals static int dPin, cPin, sPin ; /* * dsShiftIn: * Shift a number in from the chip, LSB first. Note that the data is * sampled on the trailing edge of the last clock, so it's valid immediately. ********************************************************************************* */ static unsigned int dsShiftIn (void) { uint8_t value = 0 ; int i ; pinMode (dPin, INPUT) ; delayMicroseconds (1) ; for (i = 0 ; i < 8 ; ++i) { value |= (digitalRead (dPin) << i) ; digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; } return value; } /* * dsShiftOut: * A normal LSB-first shift-out, just slowed down a bit - the Pi is * a bit faster than the chip can handle. ********************************************************************************* */ static void dsShiftOut (unsigned int data) { int i ; pinMode (dPin, OUTPUT) ; for (i = 0 ; i < 8 ; ++i) { digitalWrite (dPin, data & (1 << i)) ; delayMicroseconds (1) ; digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; } } /* * ds1302regRead: ds1302regWrite: * Read/Write a value to an RTC Register or RAM location on the chip ********************************************************************************* */ static unsigned int ds1302regRead (const int reg) { unsigned int data ; digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; dsShiftOut (reg) ; data = dsShiftIn () ; digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; return data ; } static void ds1302regWrite (const int reg, const unsigned int data) { digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; dsShiftOut (reg) ; dsShiftOut (data) ; digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; } /* * ds1302rtcWrite: ds1302rtcRead: * Writes/Reads the data to/from the RTC register ********************************************************************************* */ unsigned int ds1302rtcRead (const int reg) { return ds1302regRead (0x81 | ((reg & 0x1F) << 1)) ; } void ds1302rtcWrite (int reg, unsigned int data) { ds1302regWrite (0x80 | ((reg & 0x1F) << 1), data) ; } /* * ds1302ramWrite: ds1302ramRead: * Writes/Reads the data to/from the RTC register ********************************************************************************* */ unsigned int ds1302ramRead (const int addr) { return ds1302regRead (0xC1 | ((addr & 0x1F) << 1)) ; } void ds1302ramWrite (const int addr, const unsigned int data) { ds1302regWrite ( 0xC0 | ((addr & 0x1F) << 1), data) ; } /* * ds1302clockRead: * Read all 8 bytes of the clock in a single operation ********************************************************************************* */ void ds1302clockRead (int clockData [8]) { int i ; unsigned int regVal = 0x81 | ((RTC_BM & 0x1F) << 1) ; digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; dsShiftOut (regVal) ; for (i = 0 ; i < 8 ; ++i) clockData [i] = dsShiftIn () ; digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; } /* * ds1302clockWrite: * Write all 8 bytes of the clock in a single operation ********************************************************************************* */ void ds1302clockWrite (const int clockData [8]) { int i ; unsigned int regVal = 0x80 | ((RTC_BM & 0x1F) << 1) ; digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; dsShiftOut (regVal) ; for (i = 0 ; i < 8 ; ++i) dsShiftOut (clockData [i]) ; digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; } /* * ds1302trickleCharge: * Set the bits on the trickle charger. * Probably best left alone... ********************************************************************************* */ void ds1302trickleCharge (const int diodes, const int resistors) { if (diodes + resistors == 0) ds1302rtcWrite (RTC_TC, 0x5C) ; // Disabled else ds1302rtcWrite (RTC_TC, 0xA0 | ((diodes & 3) << 2) | (resistors & 3)) ; } /* * ds1302setup: * Initialise the chip & remember the pins we're using ********************************************************************************* */ void ds1302setup (const int clockPin, const int dataPin, const int csPin) { dPin = dataPin ; cPin = clockPin ; sPin = csPin ; digitalWrite (dPin, LOW) ; digitalWrite (cPin, LOW) ; digitalWrite (sPin, LOW) ; pinMode (dPin, OUTPUT) ; pinMode (cPin, OUTPUT) ; pinMode (sPin, OUTPUT) ; ds1302rtcWrite (RTC_WP, 0) ; // Remove write-protect } wiringPi/devLib/maxdetect.c0000755000000000000000000000757712457032564014726 0ustar rootroot/* * maxdetect.c: * Driver for the MaxDetect series sensors * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ //#include //#include //#include #include #include "maxdetect.h" #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif /* * maxDetectLowHighWait: * Wait for a transition from high to low on the bus ********************************************************************************* */ static void maxDetectLowHighWait (const int pin) { unsigned int timeOut = millis () + 2000 ; while (digitalRead (pin) == HIGH) if (millis () > timeOut) return ; while (digitalRead (pin) == LOW) if (millis () > timeOut) return ; } /* * maxDetectClockByte: * Read in a single byte from the MaxDetect bus ********************************************************************************* */ static unsigned int maxDetectClockByte (const int pin) { unsigned int byte = 0 ; int bit ; for (bit = 0 ; bit < 8 ; ++bit) { maxDetectLowHighWait (pin) ; // bit starting now - we need to time it. delayMicroseconds (30) ; byte <<= 1 ; if (digitalRead (pin) == HIGH) // It's a 1 byte |= 1 ; } return byte ; } /* * maxDetectRead: * Read in and return the 4 data bytes from the MaxDetect sensor. * Return TRUE/FALSE depending on the checksum validity ********************************************************************************* */ int maxDetectRead (const int pin, unsigned char buffer [4]) { int i ; unsigned int checksum ; unsigned char localBuf [5] ; // Wake up the RHT03 by pulling the data line low, then high // Low for 10mS, high for 40uS. pinMode (pin, OUTPUT) ; digitalWrite (pin, 0) ; delay (10) ; digitalWrite (pin, 1) ; delayMicroseconds (40) ; pinMode (pin, INPUT) ; // Now wait for sensor to pull pin low maxDetectLowHighWait (pin) ; // and read in 5 bytes (40 bits) for (i = 0 ; i < 5 ; ++i) localBuf [i] = maxDetectClockByte (pin) ; checksum = 0 ; for (i = 0 ; i < 4 ; ++i) { buffer [i] = localBuf [i] ; checksum += localBuf [i] ; } checksum &= 0xFF ; return checksum == localBuf [4] ; } /* * readRHT03: * Read the Temperature & Humidity from an RHT03 sensor ********************************************************************************* */ int readRHT03 (const int pin, int *temp, int *rh) { static unsigned int nextTime = 0 ; static int lastTemp = 0 ; static int lastRh = 0 ; static int lastResult = TRUE ; unsigned char buffer [4] ; // Don't read more than once a second if (millis () < nextTime) { *temp = lastTemp ; *rh = lastRh ; return lastResult ; } lastResult = maxDetectRead (pin, buffer) ; if (lastResult) { *temp = lastTemp = (buffer [2] * 256 + buffer [3]) ; *rh = lastRh = (buffer [0] * 256 + buffer [1]) ; nextTime = millis () + 2000 ; return TRUE ; } else { return FALSE ; } } wiringPi/devLib/piGlow.h0000644000000000000000000000271612457032564014201 0ustar rootroot/* * piglow.h: * Easy access to the Pimoroni PiGlow board. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #define PIGLOW_RED 0 #define PIGLOW_ORANGE 1 #define PIGLOW_YELLOW 2 #define PIGLOW_GREEN 3 #define PIGLOW_BLUE 4 #define PIGLOW_WHITE 5 #ifdef __cplusplus extern "C" { #endif extern void piGlow1 (const int leg, const int ring, const int intensity) ; extern void piGlowLeg (const int leg, const int intensity) ; extern void piGlowRing (const int ring, const int intensity) ; extern void piGlowSetup (int clear) ; #ifdef __cplusplus } #endif wiringPi/devLib/gertboard.h0000644000000000000000000000271412457032564014707 0ustar rootroot/* * gertboard.h: * Access routines for the SPI devices on the Gertboard * Copyright (c) 2012 Gordon Henderson * * The Gertboard has an MCP4802 dual-channel D to A convertor * connected to the SPI bus, selected via chip-select B. * *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif // Old routines extern void gertboardAnalogWrite (const int chan, const int value) ; extern int gertboardAnalogRead (const int chan) ; extern int gertboardSPISetup (void) ; // New extern int gertboardAnalogSetup (const int pinBase) ; #ifdef __cplusplus } #endif wiringPi/devLib/piFace.h0000644000000000000000000000221112457032564014115 0ustar rootroot/* * piFace.h: * Control the PiFace Interface board for the Raspberry Pi * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int piFaceSetup (const int pinBase) ; #ifdef __cplusplus } #endif wiringPi/devLib/lcd.c0000644000000000000000000002643512457032564013501 0ustar rootroot/* * lcd.c: * Text-based LCD driver. * This is designed to drive the parallel interface LCD drivers * based in the Hitachi HD44780U controller and compatables. * * Copyright (c) 2012 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include "lcd.h" #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif // HD44780U Commands #define LCD_CLEAR 0x01 #define LCD_HOME 0x02 #define LCD_ENTRY 0x04 #define LCD_CTRL 0x08 #define LCD_CDSHIFT 0x10 #define LCD_FUNC 0x20 #define LCD_CGRAM 0x40 #define LCD_DGRAM 0x80 // Bits in the entry register #define LCD_ENTRY_SH 0x01 #define LCD_ENTRY_ID 0x02 // Bits in the control register #define LCD_BLINK_CTRL 0x01 #define LCD_CURSOR_CTRL 0x02 #define LCD_DISPLAY_CTRL 0x04 // Bits in the function register #define LCD_FUNC_F 0x04 #define LCD_FUNC_N 0x08 #define LCD_FUNC_DL 0x10 #define LCD_CDSHIFT_RL 0x04 struct lcdDataStruct { int bits, rows, cols ; int rsPin, strbPin ; int dataPins [8] ; int cx, cy ; } ; struct lcdDataStruct *lcds [MAX_LCDS] ; static int lcdControl ; // Row offsets static const int rowOff [4] = { 0x00, 0x40, 0x14, 0x54 } ; /* * strobe: * Toggle the strobe (Really the "E") pin to the device. * According to the docs, data is latched on the falling edge. ********************************************************************************* */ static void strobe (const struct lcdDataStruct *lcd) { // Note timing changes for new version of delayMicroseconds () digitalWrite (lcd->strbPin, 1) ; delayMicroseconds (50) ; digitalWrite (lcd->strbPin, 0) ; delayMicroseconds (50) ; } /* * sentDataCmd: * Send an data or command byte to the display. ********************************************************************************* */ static void sendDataCmd (const struct lcdDataStruct *lcd, unsigned char data) { register unsigned char myData = data ; unsigned char i, d4 ; if (lcd->bits == 4) { d4 = (myData >> 4) & 0x0F; for (i = 0 ; i < 4 ; ++i) { digitalWrite (lcd->dataPins [i], (d4 & 1)) ; d4 >>= 1 ; } strobe (lcd) ; d4 = myData & 0x0F ; for (i = 0 ; i < 4 ; ++i) { digitalWrite (lcd->dataPins [i], (d4 & 1)) ; d4 >>= 1 ; } } else { for (i = 0 ; i < 8 ; ++i) { digitalWrite (lcd->dataPins [i], (myData & 1)) ; myData >>= 1 ; } } strobe (lcd) ; } /* * putCommand: * Send a command byte to the display ********************************************************************************* */ static void putCommand (const struct lcdDataStruct *lcd, unsigned char command) { digitalWrite (lcd->rsPin, 0) ; sendDataCmd (lcd, command) ; delay (2) ; } static void put4Command (const struct lcdDataStruct *lcd, unsigned char command) { register unsigned char myCommand = command ; register unsigned char i ; digitalWrite (lcd->rsPin, 0) ; for (i = 0 ; i < 4 ; ++i) { digitalWrite (lcd->dataPins [i], (myCommand & 1)) ; myCommand >>= 1 ; } strobe (lcd) ; } /* ********************************************************************************* * User Callable code below here ********************************************************************************* */ /* * lcdHome: lcdClear: * Home the cursor or clear the screen. ********************************************************************************* */ void lcdHome (const int fd) { struct lcdDataStruct *lcd = lcds [fd] ; putCommand (lcd, LCD_HOME) ; lcd->cx = lcd->cy = 0 ; delay (5) ; } void lcdClear (const int fd) { struct lcdDataStruct *lcd = lcds [fd] ; putCommand (lcd, LCD_CLEAR) ; putCommand (lcd, LCD_HOME) ; lcd->cx = lcd->cy = 0 ; delay (5) ; } /* * lcdDisplay: lcdCursor: lcdCursorBlink: * Turn the display, cursor, cursor blinking on/off ********************************************************************************* */ void lcdDisplay (const int fd, int state) { struct lcdDataStruct *lcd = lcds [fd] ; if (state) lcdControl |= LCD_DISPLAY_CTRL ; else lcdControl &= ~LCD_DISPLAY_CTRL ; putCommand (lcd, LCD_CTRL | lcdControl) ; } void lcdCursor (const int fd, int state) { struct lcdDataStruct *lcd = lcds [fd] ; if (state) lcdControl |= LCD_CURSOR_CTRL ; else lcdControl &= ~LCD_CURSOR_CTRL ; putCommand (lcd, LCD_CTRL | lcdControl) ; } void lcdCursorBlink (const int fd, int state) { struct lcdDataStruct *lcd = lcds [fd] ; if (state) lcdControl |= LCD_BLINK_CTRL ; else lcdControl &= ~LCD_BLINK_CTRL ; putCommand (lcd, LCD_CTRL | lcdControl) ; } /* * lcdSendCommand: * Send any arbitary command to the display ********************************************************************************* */ void lcdSendCommand (const int fd, unsigned char command) { struct lcdDataStruct *lcd = lcds [fd] ; putCommand (lcd, command) ; } /* * lcdPosition: * Update the position of the cursor on the display. * Ignore invalid locations. ********************************************************************************* */ void lcdPosition (const int fd, int x, int y) { struct lcdDataStruct *lcd = lcds [fd] ; if ((x > lcd->cols) || (x < 0)) return ; if ((y > lcd->rows) || (y < 0)) return ; putCommand (lcd, x + (LCD_DGRAM | rowOff [y])) ; lcd->cx = x ; lcd->cy = y ; } /* * lcdCharDef: * Defines a new character in the CGRAM ********************************************************************************* */ void lcdCharDef (const int fd, int index, unsigned char data [8]) { struct lcdDataStruct *lcd = lcds [fd] ; int i ; putCommand (lcd, LCD_CGRAM | ((index & 7) << 3)) ; digitalWrite (lcd->rsPin, 1) ; for (i = 0 ; i < 8 ; ++i) sendDataCmd (lcd, data [i]) ; } /* * lcdPutchar: * Send a data byte to be displayed on the display. We implement a very * simple terminal here - with line wrapping, but no scrolling. Yet. ********************************************************************************* */ void lcdPutchar (const int fd, unsigned char data) { struct lcdDataStruct *lcd = lcds [fd] ; digitalWrite (lcd->rsPin, 1) ; sendDataCmd (lcd, data) ; if (++lcd->cx == lcd->cols) { lcd->cx = 0 ; if (++lcd->cy == lcd->rows) lcd->cy = 0 ; putCommand (lcd, lcd->cx + (LCD_DGRAM | rowOff [lcd->cy])) ; } } /* * lcdPuts: * Send a string to be displayed on the display ********************************************************************************* */ void lcdPuts (const int fd, const char *string) { while (*string) lcdPutchar (fd, *string++) ; } /* * lcdPrintf: * Printf to an LCD display ********************************************************************************* */ void lcdPrintf (const int fd, const char *message, ...) { va_list argp ; char buffer [1024] ; va_start (argp, message) ; vsnprintf (buffer, 1023, message, argp) ; va_end (argp) ; lcdPuts (fd, buffer) ; } /* * lcdInit: * Take a lot of parameters and initialise the LCD, and return a handle to * that LCD, or -1 if any error. ********************************************************************************* */ int lcdInit (const int rows, const int cols, const int bits, const int rs, const int strb, const int d0, const int d1, const int d2, const int d3, const int d4, const int d5, const int d6, const int d7) { static int initialised = 0 ; unsigned char func ; int i ; int lcdFd = -1 ; struct lcdDataStruct *lcd ; if (initialised == 0) { initialised = 1 ; for (i = 0 ; i < MAX_LCDS ; ++i) lcds [i] = NULL ; } // Simple sanity checks if (! ((bits == 4) || (bits == 8))) return -1 ; if ((rows < 0) || (rows > 20)) return -1 ; if ((cols < 0) || (cols > 20)) return -1 ; // Create a new LCD: for (i = 0 ; i < MAX_LCDS ; ++i) { if (lcds [i] == NULL) { lcdFd = i ; break ; } } if (lcdFd == -1) return -1 ; lcd = (struct lcdDataStruct *)malloc (sizeof (struct lcdDataStruct)) ; if (lcd == NULL) return -1 ; lcd->rsPin = rs ; lcd->strbPin = strb ; lcd->bits = 8 ; // For now - we'll set it properly later. lcd->rows = rows ; lcd->cols = cols ; lcd->cx = 0 ; lcd->cy = 0 ; lcd->dataPins [0] = d0 ; lcd->dataPins [1] = d1 ; lcd->dataPins [2] = d2 ; lcd->dataPins [3] = d3 ; lcd->dataPins [4] = d4 ; lcd->dataPins [5] = d5 ; lcd->dataPins [6] = d6 ; lcd->dataPins [7] = d7 ; lcds [lcdFd] = lcd ; digitalWrite (lcd->rsPin, 0) ; pinMode (lcd->rsPin, OUTPUT) ; digitalWrite (lcd->strbPin, 0) ; pinMode (lcd->strbPin, OUTPUT) ; for (i = 0 ; i < bits ; ++i) { digitalWrite (lcd->dataPins [i], 0) ; pinMode (lcd->dataPins [i], OUTPUT) ; } delay (35) ; // mS // 4-bit mode? // OK. This is a PIG and it's not at all obvious from the documentation I had, // so I guess some others have worked through either with better documentation // or more trial and error... Anyway here goes: // // It seems that the controller needs to see the FUNC command at least 3 times // consecutively - in 8-bit mode. If you're only using 8-bit mode, then it appears // that you can get away with one func-set, however I'd not rely on it... // // So to set 4-bit mode, you need to send the commands one nibble at a time, // the same three times, but send the command to set it into 8-bit mode those // three times, then send a final 4th command to set it into 4-bit mode, and only // then can you flip the switch for the rest of the library to work in 4-bit // mode which sends the commands as 2 x 4-bit values. if (bits == 4) { func = LCD_FUNC | LCD_FUNC_DL ; // Set 8-bit mode 3 times put4Command (lcd, func >> 4) ; delay (35) ; put4Command (lcd, func >> 4) ; delay (35) ; put4Command (lcd, func >> 4) ; delay (35) ; func = LCD_FUNC ; // 4th set: 4-bit mode put4Command (lcd, func >> 4) ; delay (35) ; lcd->bits = 4 ; } else { func = LCD_FUNC | LCD_FUNC_DL ; putCommand (lcd, func ) ; delay (35) ; putCommand (lcd, func ) ; delay (35) ; putCommand (lcd, func ) ; delay (35) ; } if (lcd->rows > 1) { func |= LCD_FUNC_N ; putCommand (lcd, func) ; delay (35) ; } // Rest of the initialisation sequence lcdDisplay (lcdFd, TRUE) ; lcdCursor (lcdFd, FALSE) ; lcdCursorBlink (lcdFd, FALSE) ; lcdClear (lcdFd) ; putCommand (lcd, LCD_ENTRY | LCD_ENTRY_ID) ; putCommand (lcd, LCD_CDSHIFT | LCD_CDSHIFT_RL) ; return lcdFd ; } wiringPi/devLib/lcd.h0000644000000000000000000000405712457032564013502 0ustar rootroot/* * lcd.h: * Text-based LCD driver. * This is designed to drive the parallel interface LCD drivers * based in the Hitachi HD44780U controller and compatables. * * Copyright (c) 2012 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #define MAX_LCDS 8 #ifdef __cplusplus extern "C" { #endif extern void lcdHome (const int fd) ; extern void lcdClear (const int fd) ; extern void lcdDisplay (const int fd, int state) ; extern void lcdCursor (const int fd, int state) ; extern void lcdCursorBlink (const int fd, int state) ; extern void lcdSendCommand (const int fd, unsigned char command) ; extern void lcdPosition (const int fd, int x, int y) ; extern void lcdCharDef (const int fd, int index, unsigned char data [8]) ; extern void lcdPutchar (const int fd, unsigned char data) ; extern void lcdPuts (const int fd, const char *string) ; extern void lcdPrintf (const int fd, const char *message, ...) ; extern int lcdInit (const int rows, const int cols, const int bits, const int rs, const int strb, const int d0, const int d1, const int d2, const int d3, const int d4, const int d5, const int d6, const int d7) ; #ifdef __cplusplus } #endif wiringPi/devLib/ds1302.h0000644000000000000000000000321112457032564013643 0ustar rootroot/* * ds1302.h: * Real Time clock * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern unsigned int ds1302rtcRead (const int reg) ; extern void ds1302rtcWrite (const int reg, const unsigned int data) ; extern unsigned int ds1302ramRead (const int addr) ; extern void ds1302ramWrite (const int addr, const unsigned int data) ; extern void ds1302clockRead (int clockData [8]) ; extern void ds1302clockWrite (const int clockData [8]) ; extern void ds1302trickleCharge (const int diodes, const int resistors) ; extern void ds1302setup (const int clockPin, const int dataPin, const int csPin) ; #ifdef __cplusplus } #endif wiringPi/devLib/piGlow.c0000644000000000000000000000564512457032564014200 0ustar rootroot/* * piGlow.c: * Easy access to the Pimoroni PiGlow board. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include "piGlow.h" #define PIGLOW_BASE 577 static int leg0 [6] = { 6, 7, 8, 5, 4, 9 } ; static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ; static int leg2 [6] = { 0, 1, 2, 3, 14, 12 } ; /* * piGlow1: * Light up an individual LED ********************************************************************************* */ void piGlow1 (const int leg, const int ring, const int intensity) { int *legLeds ; if ((leg < 0) || (leg > 2)) return ; if ((ring < 0) || (ring > 5)) return ; /**/ if (leg == 0) legLeds = leg0 ; else if (leg == 1) legLeds = leg1 ; else legLeds = leg2 ; analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ; } /* * piGlowLeg: * Light up all 6 LEDs on a leg ********************************************************************************* */ void piGlowLeg (const int leg, const int intensity) { int i ; int *legLeds ; if ((leg < 0) || (leg > 2)) return ; /**/ if (leg == 0) legLeds = leg0 ; else if (leg == 1) legLeds = leg1 ; else legLeds = leg2 ; for (i = 0 ; i < 6 ; ++i) analogWrite (PIGLOW_BASE + legLeds [i], intensity) ; } /* * piGlowRing: * Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost ********************************************************************************* */ void piGlowRing (const int ring, const int intensity) { if ((ring < 0) || (ring > 5)) return ; analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ; analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ; analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ; } /* * piGlowSetup: * Initialise the board & remember the pins we're using ********************************************************************************* */ void piGlowSetup (int clear) { sn3218Setup (PIGLOW_BASE) ; if (clear) { piGlowLeg (0, 0) ; piGlowLeg (1, 0) ; piGlowLeg (2, 0) ; } } wiringPi/devLib/piNes.h0000644000000000000000000000264612457032564014020 0ustar rootroot/* * piNes.h: * Driver for the NES Joystick controller on the Raspberry Pi * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #define MAX_NES_JOYSTICKS 8 #define NES_RIGHT 0x01 #define NES_LEFT 0x02 #define NES_DOWN 0x04 #define NES_UP 0x08 #define NES_START 0x10 #define NES_SELECT 0x20 #define NES_B 0x40 #define NES_A 0x80 #ifdef __cplusplus extern "C" { #endif extern int setupNesJoystick (int dPin, int cPin, int lPin) ; extern unsigned int readNesJoystick (int joystick) ; #ifdef __cplusplus } #endif wiringPi/devLib/lcd128x64.c0000644000000000000000000003470412457032564014274 0ustar rootroot/* * lcd128x64.c: * Graphics-based LCD driver. * This is designed to drive the parallel interface LCD drivers * based on the generic 12864H chips * * There are many variations on these chips, however they all mostly * seem to be similar. * This implementation has the Pins from the Pi hard-wired into it, * in particular wiringPi pins 0-7 so that we can use * digitalWriteByete() to speed things up somewhat. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include "font.h" #include "lcd128x64.h" // Size #define LCD_WIDTH 128 #define LCD_HEIGHT 64 // Hardware Pins // Note pins 0-7 are the 8-bit data port #define CS1 10 #define CS2 11 #define STROBE 12 #define RS 13 // Software copy of the framebuffer // it's 8-bit deep although the display itself is only 1-bit deep. static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ; static int maxX, maxY ; static int lastX, lastY ; static int xOrigin, yOrigin ; static int lcdOrientation = 0 ; /* * strobe: * Toggle the strobe (Really the "E") pin to the device. * According to the docs, data is latched on the falling edge. ********************************************************************************* */ static void strobe (void) { digitalWrite (STROBE, 1) ; delayMicroseconds (1) ; digitalWrite (STROBE, 0) ; delayMicroseconds (5) ; } /* * sentData: * Send an data or command byte to the display. ********************************************************************************* */ static void sendData (const int data, const int chip) { digitalWrite (chip, 0) ; digitalWriteByte (data) ; strobe () ; digitalWrite (chip, 1) ; } /* * sendCommand: * Send a command byte to the display ********************************************************************************* */ static void sendCommand (const int command, const int chip) { digitalWrite (RS, 0) ; sendData (command, chip) ; digitalWrite (RS, 1) ; } /* * setCol: SetLine: * Set the column and line addresses ********************************************************************************* */ static void setCol (int col, const int chip) { sendCommand (0x40 | (col & 0x3F), chip) ; } static void setLine (int line, const int chip) { sendCommand (0xB8 | (line & 0x07), chip) ; } /* * lcd128x64update: * Copy our software version to the real display ********************************************************************************* */ void lcd128x64update (void) { int line, x, y, fbLoc ; unsigned char byte ; // Left side for (line = 0 ; line < 8 ; ++line) { setCol (0, CS1) ; setLine (line, CS1) ; for (x = 63 ; x >= 0 ; --x) { byte = 0 ; for (y = 0 ; y < 8 ; ++y) { fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; if (frameBuffer [fbLoc] != 0) byte |= (1 << y) ; } sendData (byte, CS1) ; } } // Right side for (line = 0 ; line < 8 ; ++line) { setCol (0, CS2) ; setLine (line, CS2) ; for (x = 127 ; x >= 64 ; --x) { byte = 0 ; for (y = 0 ; y < 8 ; ++y) { fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; if (frameBuffer [fbLoc] != 0) byte |= (1 << y) ; } sendData (byte, CS2) ; } } } /* * lcd128x64setOrigin: * Set the display offset origin ********************************************************************************* */ void lcd128x64setOrigin (int x, int y) { xOrigin = x ; yOrigin = y ; } /* * lcd128x64setOrientation: * Set the display orientation: * 0: Normal, the display is portrait mode, 0,0 is top left * 1: Landscape * 2: Portrait, flipped * 3: Landscape, flipped ********************************************************************************* */ void lcd128x64setOrientation (int orientation) { lcdOrientation = orientation & 3 ; lcd128x64setOrigin (0,0) ; switch (lcdOrientation) { case 0: maxX = LCD_WIDTH ; maxY = LCD_HEIGHT ; break ; case 1: maxX = LCD_HEIGHT ; maxY = LCD_WIDTH ; break ; case 2: maxX = LCD_WIDTH ; maxY = LCD_HEIGHT ; break ; case 3: maxX = LCD_HEIGHT ; maxY = LCD_WIDTH ; break ; } } /* * lcd128x64orientCoordinates: * Adjust the coordinates given to the display orientation ********************************************************************************* */ void lcd128x64orientCoordinates (int *x, int *y) { register int tmp ; *x += xOrigin ; *y += yOrigin ; *y = maxY - *y - 1 ; switch (lcdOrientation) { case 0: break; case 1: tmp = maxY - *y - 1 ; *y = *x ; *x = tmp ; break; case 2: *x = maxX - *x - 1 ; *y = maxY - *y - 1 ; break; case 3: *x = maxX - *x - 1 ; tmp = *y ; *y = *x ; *x = tmp ; break ; } } /* * lcd128x64getScreenSize: * Return the max X & Y screen sizes. Needs to be called again, if you * change screen orientation. ********************************************************************************* */ void lcd128x64getScreenSize (int *x, int *y) { *x = maxX ; *y = maxY ; } /* ********************************************************************************* * Standard Graphical Functions ********************************************************************************* */ /* * lcd128x64point: * Plot a pixel. ********************************************************************************* */ void lcd128x64point (int x, int y, int colour) { lastX = x ; lastY = y ; lcd128x64orientCoordinates (&x, &y) ; if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT)) return ; frameBuffer [x + y * LCD_WIDTH] = colour ; } /* * lcd128x64line: lcd128x64lineTo: * Classic Bressenham Line code ********************************************************************************* */ void lcd128x64line (int x0, int y0, int x1, int y1, int colour) { int dx, dy ; int sx, sy ; int err, e2 ; lastX = x1 ; lastY = y1 ; dx = abs (x1 - x0) ; dy = abs (y1 - y0) ; sx = (x0 < x1) ? 1 : -1 ; sy = (y0 < y1) ? 1 : -1 ; err = dx - dy ; for (;;) { lcd128x64point (x0, y0, colour) ; if ((x0 == x1) && (y0 == y1)) break ; e2 = 2 * err ; if (e2 > -dy) { err -= dy ; x0 += sx ; } if (e2 < dx) { err += dx ; y0 += sy ; } } } void lcd128x64lineTo (int x, int y, int colour) { lcd128x64line (lastX, lastY, x, y, colour) ; } /* * lcd128x64rectangle: * A rectangle is a spoilt days fishing ********************************************************************************* */ void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) { register int x ; if (filled) { /**/ if (x1 == x2) lcd128x64line (x1, y1, x2, y2, colour) ; else if (x1 < x2) for (x = x1 ; x <= x2 ; ++x) lcd128x64line (x, y1, x, y2, colour) ; else for (x = x2 ; x <= x1 ; ++x) lcd128x64line (x, y1, x, y2, colour) ; } else { lcd128x64line (x1, y1, x2, y1, colour) ; lcd128x64lineTo (x2, y2, colour) ; lcd128x64lineTo (x1, y2, colour) ; lcd128x64lineTo (x1, y1, colour) ; } } /* * lcd128x64circle: * This is the midpoint circle algorithm. ********************************************************************************* */ void lcd128x64circle (int x, int y, int r, int colour, int filled) { int ddF_x = 1 ; int ddF_y = -2 * r ; int f = 1 - r ; int x1 = 0 ; int y1 = r ; if (filled) { lcd128x64line (x, y + r, x, y - r, colour) ; lcd128x64line (x + r, y, x - r, y, colour) ; } else { lcd128x64point (x, y + r, colour) ; lcd128x64point (x, y - r, colour) ; lcd128x64point (x + r, y, colour) ; lcd128x64point (x - r, y, colour) ; } while (x1 < y1) { if (f >= 0) { y1-- ; ddF_y += 2 ; f += ddF_y ; } x1++ ; ddF_x += 2 ; f += ddF_x ; if (filled) { lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ; lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ; lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ; lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ; } else { lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ; lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ; lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ; lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ; } } } /* * lcd128x64ellipse: * Fast ellipse drawing algorithm by * John Kennedy * Mathematics Department * Santa Monica College * 1900 Pico Blvd. * Santa Monica, CA 90405 * jrkennedy6@gmail.com * -Confirned in email this algorithm is in the public domain -GH- ********************************************************************************* */ static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled) { if (filled) { lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ; lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ; } else { lcd128x64point (cx + x, cy + y, colour) ; lcd128x64point (cx - x, cy + y, colour) ; lcd128x64point (cx - x, cy - y, colour) ; lcd128x64point (cx + x, cy - y, colour) ; } } void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) { int x, y ; int xChange, yChange, ellipseError ; int twoAsquare, twoBsquare ; int stoppingX, stoppingY ; twoAsquare = 2 * xRadius * xRadius ; twoBsquare = 2 * yRadius * yRadius ; x = xRadius ; y = 0 ; xChange = yRadius * yRadius * (1 - 2 * xRadius) ; yChange = xRadius * xRadius ; ellipseError = 0 ; stoppingX = twoBsquare * xRadius ; stoppingY = 0 ; while (stoppingX >= stoppingY) // 1st set of points { plot4ellipsePoints (cx, cy, x, y, colour, filled) ; ++y ; stoppingY += twoAsquare ; ellipseError += yChange ; yChange += twoAsquare ; if ((2 * ellipseError + xChange) > 0 ) { --x ; stoppingX -= twoBsquare ; ellipseError += xChange ; xChange += twoBsquare ; } } x = 0 ; y = yRadius ; xChange = yRadius * yRadius ; yChange = xRadius * xRadius * (1 - 2 * yRadius) ; ellipseError = 0 ; stoppingX = 0 ; stoppingY = twoAsquare * yRadius ; while (stoppingX <= stoppingY) //2nd set of points { plot4ellipsePoints (cx, cy, x, y, colour, filled) ; ++x ; stoppingX += twoBsquare ; ellipseError += xChange ; xChange += twoBsquare ; if ((2 * ellipseError + yChange) > 0 ) { --y ; stoppingY -= twoAsquare ; ellipseError += yChange ; yChange += twoAsquare ; } } } /* * lcd128x64putchar: * Print a single character to the screen ********************************************************************************* */ void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) { int y1, y2 ; unsigned char line ; unsigned char *fontPtr ; // Can't print if we're offscreen //if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight))) // return ; fontPtr = font + c * fontHeight ; for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1) { y2 = y + y1 ; line = *fontPtr++ ; lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ; lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ; } } /* * lcd128x64puts: * Send a string to the display. Obeys \n and \r formatting ********************************************************************************* */ void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) { int c, mx, my ; mx = x ; my = y ; while (*str) { c = *str++ ; if (c == '\r') { mx = x ; continue ; } if (c == '\n') { mx = x ; my -= fontHeight ; continue ; } lcd128x64putchar (mx, my, c, bgCol, fgCol) ; mx += fontWidth ; if (mx >= (maxX - fontWidth)) { mx = 0 ; my -= fontHeight ; } } } /* * lcd128x64clear: * Clear the display to the given colour. ********************************************************************************* */ void lcd128x64clear (int colour) { register int i ; register unsigned char *ptr = frameBuffer ; for (i = 0 ; i < (maxX * maxY) ; ++i) *ptr++ = colour ; } /* * lcd128x64setup: * Initialise the display and GPIO. ********************************************************************************* */ int lcd128x64setup (void) { int i ; for (i = 0 ; i < 8 ; ++i) pinMode (i, OUTPUT) ; digitalWrite (CS1, 1) ; digitalWrite (CS2, 1) ; digitalWrite (STROBE, 0) ; digitalWrite (RS, 1) ; pinMode (CS1, OUTPUT) ; pinMode (CS2, OUTPUT) ; pinMode (STROBE, OUTPUT) ; pinMode (RS, OUTPUT) ; sendCommand (0x3F, CS1) ; // Display ON sendCommand (0xC0, CS1) ; // Set display start line to 0 sendCommand (0x3F, CS2) ; // Display ON sendCommand (0xC0, CS2) ; // Set display start line to 0 lcd128x64clear (0) ; lcd128x64setOrientation (0) ; lcd128x64update () ; return 0 ; } wiringPi/devLib/gertboard.c0000644000000000000000000001002712457032564014676 0ustar rootroot/* * gertboard.c: * Access routines for the SPI devices on the Gertboard * Copyright (c) 2012 Gordon Henderson * * The Gertboard has: * * An MCP3002 dual-channel A to D convertor connected * to the SPI bus, selected by chip-select A, and: * * An MCP4802 dual-channel D to A convertor connected * to the SPI bus, selected via chip-select B. * *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include "gertboard.h" // The A-D convertor won't run at more than 1MHz @ 3.3v #define SPI_ADC_SPEED 1000000 #define SPI_DAC_SPEED 1000000 #define SPI_A2D 0 #define SPI_D2A 1 /* * gertboardAnalogWrite: * Write an 8-bit data value to the MCP4802 Analog to digital * convertor on the Gertboard. ********************************************************************************* */ void gertboardAnalogWrite (const int chan, const int value) { uint8_t spiData [2] ; uint8_t chanBits, dataBits ; if (chan == 0) chanBits = 0x30 ; else chanBits = 0xB0 ; chanBits |= ((value >> 4) & 0x0F) ; dataBits = ((value << 4) & 0xF0) ; spiData [0] = chanBits ; spiData [1] = dataBits ; wiringPiSPIDataRW (SPI_D2A, spiData, 2) ; } /* * gertboardAnalogRead: * Return the analog value of the given channel (0/1). * The A/D is a 10-bit device ********************************************************************************* */ int gertboardAnalogRead (const int chan) { uint8_t spiData [2] ; uint8_t chanBits ; if (chan == 0) chanBits = 0b11010000 ; else chanBits = 0b11110000 ; spiData [0] = chanBits ; spiData [1] = 0 ; wiringPiSPIDataRW (SPI_A2D, spiData, 2) ; return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ; } /* * gertboardSPISetup: * Initialise the SPI bus, etc. ********************************************************************************* */ int gertboardSPISetup (void) { if (wiringPiSPISetup (SPI_A2D, SPI_ADC_SPEED) < 0) return -1 ; if (wiringPiSPISetup (SPI_D2A, SPI_DAC_SPEED) < 0) return -1 ; return 0 ; } /* * New wiringPi node extension methods. ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, const int chan) { return gertboardAnalogRead (chan - node->pinBase) ; } static void myAnalogWrite (struct wiringPiNodeStruct *node, const int chan, const int value) { gertboardAnalogWrite (chan - node->pinBase, value) ; } /* * gertboardAnalogSetup: * Create a new wiringPi device node for the analog devices on the * Gertboard. We create one node with 2 pins - each pin being read * and write - although the operations actually go to different * hardware devices. ********************************************************************************* */ int gertboardAnalogSetup (const int pinBase) { struct wiringPiNodeStruct *node ; int x ; if (( x = gertboardSPISetup ()) != 0) return x; node = wiringPiNewNode (pinBase, 2) ; node->analogRead = myAnalogRead ; node->analogWrite = myAnalogWrite ; return 0 ; } wiringPi/devLib/piNes.c0000644000000000000000000000554312457032564014012 0ustar rootroot/* * piNes.c: * Driver for the NES Joystick controller on the Raspberry Pi * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include "piNes.h" #define MAX_NES_JOYSTICKS 8 #define NES_RIGHT 0x01 #define NES_LEFT 0x02 #define NES_DOWN 0x04 #define NES_UP 0x08 #define NES_START 0x10 #define NES_SELECT 0x20 #define NES_B 0x40 #define NES_A 0x80 #define PULSE_TIME 25 // Data to store the pins for each controller struct nesPinsStruct { unsigned int cPin, dPin, lPin ; } ; static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ; static int joysticks = 0 ; /* * setupNesJoystick: * Create a new NES joystick interface, program the pins, etc. ********************************************************************************* */ int setupNesJoystick (int dPin, int cPin, int lPin) { if (joysticks == MAX_NES_JOYSTICKS) return -1 ; nesPins [joysticks].dPin = dPin ; nesPins [joysticks].cPin = cPin ; nesPins [joysticks].lPin = lPin ; digitalWrite (lPin, LOW) ; digitalWrite (cPin, LOW) ; pinMode (lPin, OUTPUT) ; pinMode (cPin, OUTPUT) ; pinMode (dPin, INPUT) ; return joysticks++ ; } /* * readNesJoystick: * Do a single scan of the NES Joystick. ********************************************************************************* */ unsigned int readNesJoystick (int joystick) { unsigned int value = 0 ; int i ; struct nesPinsStruct *pins = &nesPins [joystick] ; // Toggle Latch - which presents the first bit digitalWrite (pins->lPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; digitalWrite (pins->lPin, LOW) ; delayMicroseconds (PULSE_TIME) ; // Read first bit value = digitalRead (pins->dPin) ; // Now get the next 7 bits with the clock for (i = 0 ; i < 7 ; ++i) { digitalWrite (pins->cPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; digitalWrite (pins->cPin, LOW) ; delayMicroseconds (PULSE_TIME) ; value = (value << 1) | digitalRead (pins->dPin) ; } return value ^ 0xFF ; } wiringPi/devLib/piFaceOld.c0000644000000000000000000001053212457032564014554 0ustar rootroot/* * piFace.: * Arduino compatable (ish) Wiring library for the Raspberry Pi * Copyright (c) 2012-2013 Gordon Henderson * * This file to interface with the PiFace peripheral device which * has an MCP23S17 GPIO device connected via the SPI bus. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include "../wiringPi/mcp23x0817.h" #include "piFace.h" #define PIFACE_SPEED 4000000 #define PIFACE_DEVNO 0 /* * writeByte: * Write a byte to a register on the MCP23S17 on the SPI bus. ********************************************************************************* */ static void writeByte (uint8_t reg, uint8_t data) { uint8_t spiData [4] ; spiData [0] = CMD_WRITE ; spiData [1] = reg ; spiData [2] = data ; wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ; } /* * readByte: * Read a byte from a register on the MCP23S17 on the SPI bus. ********************************************************************************* */ static uint8_t readByte (uint8_t reg) { uint8_t spiData [4] ; spiData [0] = CMD_READ ; spiData [1] = reg ; wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ; return spiData [2] ; } /* * myDigitalWrite: * Perform the digitalWrite function on the PiFace board ********************************************************************************* */ void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { uint8_t mask, old ; pin -= node->pinBase ; mask = 1 << pin ; old = readByte (MCP23x17_GPIOA) ; if (value == 0) old &= (~mask) ; else old |= mask ; writeByte (MCP23x17_GPIOA, old) ; } /* * myDigitalRead: * Perform the digitalRead function on the PiFace board ********************************************************************************* */ int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { uint8_t mask, reg ; mask = 1 << ((pin - node->pinBase) & 7) ; if (pin < 8) reg = MCP23x17_GPIOB ; // Input regsiter else reg = MCP23x17_OLATA ; // Output latch regsiter if ((readByte (reg) & mask) != 0) return HIGH ; else return LOW ; } /* * myPullUpDnControl: * Perform the pullUpDnControl function on the PiFace board ********************************************************************************* */ void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud) { uint8_t mask, old ; mask = 1 << (pin - node->pinBase) ; old = readByte (MCP23x17_GPPUB) ; if (pud == 0) old &= (~mask) ; else old |= mask ; writeByte (MCP23x17_GPPUB, old) ; } /* * piFaceSetup * Setup the SPI interface and initialise the MCP23S17 chip * We create one node with 16 pins - each if the first 8 pins being read * and write - although the operations actually go to different * hardware ports. The top 8 let you read the state of the output register. ********************************************************************************* */ int piFaceSetup (const int pinBase) { int x ; struct wiringPiNodeStruct *node ; if ((x = wiringPiSPISetup (PIFACE_DEVNO, PIFACE_SPEED)) < 0) return x ; // Setup the MCP23S17 writeByte (MCP23x17_IOCON, IOCON_INIT) ; writeByte (MCP23x17_IODIRA, 0x00) ; // Port A -> Outputs writeByte (MCP23x17_IODIRB, 0xFF) ; // Port B -> Inputs node = wiringPiNewNode (pinBase, 16) ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->pullUpDnControl = myPullUpDnControl ; return 0 ; } wiringPi/devLib/font.h0000644000000000000000000015440612457032564013712 0ustar rootroot/**********************************************/ /* */ /* Font file generated by cpi2fnt */ /* ------------------------------ */ /* Combined with the alpha-numeric */ /* portion of Greg Harp's old PEARL */ /* font (from earlier versions of */ /* linux-m86k) by John Shifflett */ /* */ /**********************************************/ static const int fontHeight = 8 ; static const int fontWidth = 8 ; static unsigned char font [] = { /* 0 0x00 '^@' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 1 0x01 '^A' */ 0x7e, /* 01111110 */ 0x81, /* 10000001 */ 0xa5, /* 10100101 */ 0x81, /* 10000001 */ 0xbd, /* 10111101 */ 0x99, /* 10011001 */ 0x81, /* 10000001 */ 0x7e, /* 01111110 */ /* 2 0x02 '^B' */ 0x7e, /* 01111110 */ 0xff, /* 11111111 */ 0xdb, /* 11011011 */ 0xff, /* 11111111 */ 0xc3, /* 11000011 */ 0xe7, /* 11100111 */ 0xff, /* 11111111 */ 0x7e, /* 01111110 */ /* 3 0x03 '^C' */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0x10, /* 00010000 */ 0x00, /* 00000000 */ /* 4 0x04 '^D' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0x10, /* 00010000 */ 0x00, /* 00000000 */ /* 5 0x05 '^E' */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0x38, /* 00111000 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ /* 6 0x06 '^F' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x7c, /* 01111100 */ 0xfe, /* 11111110 */ 0xfe, /* 11111110 */ 0x7c, /* 01111100 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ /* 7 0x07 '^G' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 8 0x08 '^H' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xe7, /* 11100111 */ 0xc3, /* 11000011 */ 0xc3, /* 11000011 */ 0xe7, /* 11100111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* 9 0x09 '^I' */ 0x00, /* 00000000 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x42, /* 01000010 */ 0x42, /* 01000010 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 10 0x0a '^J' */ 0xff, /* 11111111 */ 0xc3, /* 11000011 */ 0x99, /* 10011001 */ 0xbd, /* 10111101 */ 0xbd, /* 10111101 */ 0x99, /* 10011001 */ 0xc3, /* 11000011 */ 0xff, /* 11111111 */ /* 11 0x0b '^K' */ 0x0f, /* 00001111 */ 0x07, /* 00000111 */ 0x0f, /* 00001111 */ 0x7d, /* 01111101 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x78, /* 01111000 */ /* 12 0x0c '^L' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ /* 13 0x0d '^M' */ 0x3f, /* 00111111 */ 0x33, /* 00110011 */ 0x3f, /* 00111111 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x70, /* 01110000 */ 0xf0, /* 11110000 */ 0xe0, /* 11100000 */ /* 14 0x0e '^N' */ 0x7f, /* 01111111 */ 0x63, /* 01100011 */ 0x7f, /* 01111111 */ 0x63, /* 01100011 */ 0x63, /* 01100011 */ 0x67, /* 01100111 */ 0xe6, /* 11100110 */ 0xc0, /* 11000000 */ /* 15 0x0f '^O' */ 0x18, /* 00011000 */ 0xdb, /* 11011011 */ 0x3c, /* 00111100 */ 0xe7, /* 11100111 */ 0xe7, /* 11100111 */ 0x3c, /* 00111100 */ 0xdb, /* 11011011 */ 0x18, /* 00011000 */ /* 16 0x10 '^P' */ 0x80, /* 10000000 */ 0xe0, /* 11100000 */ 0xf8, /* 11111000 */ 0xfe, /* 11111110 */ 0xf8, /* 11111000 */ 0xe0, /* 11100000 */ 0x80, /* 10000000 */ 0x00, /* 00000000 */ /* 17 0x11 '^Q' */ 0x02, /* 00000010 */ 0x0e, /* 00001110 */ 0x3e, /* 00111110 */ 0xfe, /* 11111110 */ 0x3e, /* 00111110 */ 0x0e, /* 00001110 */ 0x02, /* 00000010 */ 0x00, /* 00000000 */ /* 18 0x12 '^R' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ /* 19 0x13 '^S' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ /* 20 0x14 '^T' */ 0x7f, /* 01111111 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7b, /* 01111011 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x00, /* 00000000 */ /* 21 0x15 '^U' */ 0x3e, /* 00111110 */ 0x61, /* 01100001 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x86, /* 10000110 */ 0x7c, /* 01111100 */ /* 22 0x16 '^V' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x7e, /* 01111110 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 23 0x17 '^W' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ /* 24 0x18 '^X' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 25 0x19 '^Y' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 26 0x1a '^Z' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0xfe, /* 11111110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 27 0x1b '^[' */ 0x00, /* 00000000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xfe, /* 11111110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 28 0x1c '^\' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 29 0x1d '^]' */ 0x00, /* 00000000 */ 0x24, /* 00100100 */ 0x66, /* 01100110 */ 0xff, /* 11111111 */ 0x66, /* 01100110 */ 0x24, /* 00100100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 30 0x1e '^^' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 31 0x1f '^_' */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x7e, /* 01111110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 32 0x20 ' ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 33 0x21 '!' */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 34 0x22 '"' */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 35 0x23 '#' */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* 36 0x24 '$' */ 0x18, /* 00011000 */ 0x3e, /* 00111110 */ 0x60, /* 01100000 */ 0x3c, /* 00111100 */ 0x06, /* 00000110 */ 0x7c, /* 01111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 37 0x25 '%' */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xcc, /* 11001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x66, /* 01100110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 38 0x26 '&' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x68, /* 01101000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 39 0x27 ''' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 40 0x28 '(' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ /* 41 0x29 ')' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ /* 42 0x2a '*' */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0xff, /* 11111111 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 43 0x2b '+' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 44 0x2c ',' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ /* 45 0x2d '-' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 46 0x2e '.' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 47 0x2f '/' */ 0x03, /* 00000011 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* 48 0x30 '0' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xde, /* 11011110 */ 0xfe, /* 11111110 */ 0xf6, /* 11110110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 49 0x31 '1' */ 0x18, /* 00011000 */ 0x78, /* 01111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 50 0x32 '2' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 51 0x33 '3' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x06, /* 00000110 */ 0x1c, /* 00011100 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 52 0x34 '4' */ 0x1c, /* 00011100 */ 0x3c, /* 00111100 */ 0x6c, /* 01101100 */ 0xcc, /* 11001100 */ 0xfe, /* 11111110 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ /* 53 0x35 '5' */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 54 0x36 '6' */ 0x38, /* 00111000 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 55 0x37 '7' */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0x00, /* 00000000 */ /* 56 0x38 '8' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 57 0x39 '9' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* 58 0x3a ':' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 59 0x3b ';' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ /* 60 0x3c '<' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ /* 61 0x3d '=' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 62 0x3e '>' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ /* 63 0x3f '?' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 64 0x40 '@' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xde, /* 11011110 */ 0xde, /* 11011110 */ 0xde, /* 11011110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 65 0x41 'A' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 66 0x42 'B' */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* 67 0x43 'C' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 68 0x44 'D' */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* 69 0x45 'E' */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xf8, /* 11111000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 70 0x46 'F' */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xf8, /* 11111000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* 71 0x47 'G' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xce, /* 11001110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 72 0x48 'H' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 73 0x49 'I' */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 74 0x4a 'J' */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 75 0x4b 'K' */ 0xc6, /* 11000110 */ 0xcc, /* 11001100 */ 0xd8, /* 11011000 */ 0xf0, /* 11110000 */ 0xd8, /* 11011000 */ 0xcc, /* 11001100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 76 0x4c 'L' */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 77 0x4d 'M' */ 0x82, /* 10000010 */ 0xc6, /* 11000110 */ 0xee, /* 11101110 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 78 0x4e 'N' */ 0xc6, /* 11000110 */ 0xe6, /* 11100110 */ 0xf6, /* 11110110 */ 0xde, /* 11011110 */ 0xce, /* 11001110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 79 0x4f 'O' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 80 0x50 'P' */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* 81 0x51 'Q' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xf6, /* 11110110 */ 0xde, /* 11011110 */ 0x7c, /* 01111100 */ 0x06, /* 00000110 */ /* 82 0x52 'R' */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0xd8, /* 11011000 */ 0xcc, /* 11001100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 83 0x53 'S' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0x60, /* 01100000 */ 0x38, /* 00111000 */ 0x0c, /* 00001100 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 84 0x54 'T' */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 85 0x55 'U' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 86 0x56 'V' */ 0xc3, /* 11000011 */ 0xc3, /* 11000011 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 87 0x57 'W' */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xd6, /* 11010110 */ 0xfe, /* 11111110 */ 0xee, /* 11101110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 88 0x58 'X' */ 0xc3, /* 11000011 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0xc3, /* 11000011 */ 0x00, /* 00000000 */ /* 89 0x59 'Y' */ 0xc3, /* 11000011 */ 0xc3, /* 11000011 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 90 0x5a 'Z' */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 91 0x5b '[' */ 0x3c, /* 00111100 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 92 0x5c '\' */ 0xc0, /* 11000000 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x06, /* 00000110 */ 0x03, /* 00000011 */ 0x00, /* 00000000 */ /* 93 0x5d ']' */ 0x3c, /* 00111100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 94 0x5e '^' */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 95 0x5f '_' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ /* 96 0x60 '`' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 97 0x61 'a' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0x06, /* 00000110 */ 0x7e, /* 01111110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 98 0x62 'b' */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* 99 0x63 'c' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 100 0x64 'd' */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x7e, /* 01111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 101 0x65 'e' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 102 0x66 'f' */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x60, /* 01100000 */ 0xf0, /* 11110000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0x60, /* 01100000 */ 0x00, /* 00000000 */ /* 103 0x67 'g' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0x7c, /* 01111100 */ /* 104 0x68 'h' */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 105 0x69 'i' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 106 0x6a 'j' */ 0x06, /* 00000110 */ 0x00, /* 00000000 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ /* 107 0x6b 'k' */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xcc, /* 11001100 */ 0xd8, /* 11011000 */ 0xf0, /* 11110000 */ 0xd8, /* 11011000 */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ /* 108 0x6c 'l' */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 109 0x6d 'm' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xec, /* 11101100 */ 0xfe, /* 11111110 */ 0xd6, /* 11010110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 110 0x6e 'n' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 111 0x6f 'o' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 112 0x70 'p' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfc, /* 11111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfc, /* 11111100 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ /* 113 0x71 'q' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ /* 114 0x72 'r' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0xe6, /* 11100110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* 115 0x73 's' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x06, /* 00000110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* 116 0x74 't' */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x7c, /* 01111100 */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x36, /* 00110110 */ 0x1c, /* 00011100 */ 0x00, /* 00000000 */ /* 117 0x75 'u' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 118 0x76 'v' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* 119 0x77 'w' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xd6, /* 11010110 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* 120 0x78 'x' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 121 0x79 'y' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xc3, /* 11000011 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ /* 122 0x7a 'z' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x0c, /* 00001100 */ 0x38, /* 00111000 */ 0x60, /* 01100000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 123 0x7b '{' */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x70, /* 01110000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x0e, /* 00001110 */ 0x00, /* 00000000 */ /* 124 0x7c '|' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 125 0x7d '}' */ 0x70, /* 01110000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* 126 0x7e '~' */ 0x72, /* 01110010 */ 0x9c, /* 10011100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 127 0x7f '' */ 0x00, /* 00000000 */ 0x10, /* 00010000 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 128 0x80 '€' */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x0c, /* 00001100 */ 0x78, /* 01111000 */ /* 129 0x81 '' */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 130 0x82 '‚' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 131 0x83 'ƒ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 132 0x84 '„' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 133 0x85 '…' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 134 0x86 '†' */ 0x30, /* 00110000 */ 0x30, /* 00110000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 135 0x87 '‡' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x7e, /* 01111110 */ 0x0c, /* 00001100 */ 0x38, /* 00111000 */ /* 136 0x88 'ˆ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 137 0x89 '‰' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 138 0x8a 'Š' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 139 0x8b '‹' */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 140 0x8c 'Œ' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 141 0x8d '' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 142 0x8e 'Ž' */ 0xc6, /* 11000110 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 143 0x8f '' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 144 0x90 '' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xf8, /* 11111000 */ 0xc0, /* 11000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 145 0x91 '‘' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0xd8, /* 11011000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 146 0x92 '’' */ 0x3e, /* 00111110 */ 0x6c, /* 01101100 */ 0xcc, /* 11001100 */ 0xfe, /* 11111110 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xce, /* 11001110 */ 0x00, /* 00000000 */ /* 147 0x93 '“' */ 0x7c, /* 01111100 */ 0x82, /* 10000010 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 148 0x94 '”' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 149 0x95 '•' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 150 0x96 '–' */ 0x78, /* 01111000 */ 0x84, /* 10000100 */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 151 0x97 '—' */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 152 0x98 '˜' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7e, /* 01111110 */ 0x06, /* 00000110 */ 0xfc, /* 11111100 */ /* 153 0x99 '™' */ 0xc6, /* 11000110 */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* 154 0x9a 'š' */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 155 0x9b '›' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 156 0x9c 'œ' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x64, /* 01100100 */ 0xf0, /* 11110000 */ 0x60, /* 01100000 */ 0x66, /* 01100110 */ 0xfc, /* 11111100 */ 0x00, /* 00000000 */ /* 157 0x9d '' */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 158 0x9e 'ž' */ 0xf8, /* 11111000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xfa, /* 11111010 */ 0xc6, /* 11000110 */ 0xcf, /* 11001111 */ 0xc6, /* 11000110 */ 0xc7, /* 11000111 */ /* 159 0x9f 'Ÿ' */ 0x0e, /* 00001110 */ 0x1b, /* 00011011 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* 160 0xa0 ' ' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x7c, /* 01111100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 161 0xa1 '¡' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x38, /* 00111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 162 0xa2 '¢' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ /* 163 0xa3 '£' */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 164 0xa4 '¤' */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0xdc, /* 11011100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x00, /* 00000000 */ /* 165 0xa5 '¥' */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0xe6, /* 11100110 */ 0xf6, /* 11110110 */ 0xde, /* 11011110 */ 0xce, /* 11001110 */ 0x00, /* 00000000 */ /* 166 0xa6 '¦' */ 0x3c, /* 00111100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x3e, /* 00111110 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 167 0xa7 '§' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 168 0xa8 '¨' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x63, /* 01100011 */ 0x3e, /* 00111110 */ 0x00, /* 00000000 */ /* 169 0xa9 '©' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 170 0xaa 'ª' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0x06, /* 00000110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 171 0xab '«' */ 0x63, /* 01100011 */ 0xe6, /* 11100110 */ 0x6c, /* 01101100 */ 0x7e, /* 01111110 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x0f, /* 00001111 */ /* 172 0xac '¬' */ 0x63, /* 01100011 */ 0xe6, /* 11100110 */ 0x6c, /* 01101100 */ 0x7a, /* 01111010 */ 0x36, /* 00110110 */ 0x6a, /* 01101010 */ 0xdf, /* 11011111 */ 0x06, /* 00000110 */ /* 173 0xad '­' */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 174 0xae '®' */ 0x00, /* 00000000 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x66, /* 01100110 */ 0x33, /* 00110011 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 175 0xaf '¯' */ 0x00, /* 00000000 */ 0xcc, /* 11001100 */ 0x66, /* 01100110 */ 0x33, /* 00110011 */ 0x66, /* 01100110 */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 176 0xb0 '°' */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ 0x22, /* 00100010 */ 0x88, /* 10001000 */ /* 177 0xb1 '±' */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ 0x55, /* 01010101 */ 0xaa, /* 10101010 */ /* 178 0xb2 '²' */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ 0x77, /* 01110111 */ 0xdd, /* 11011101 */ /* 179 0xb3 '³' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 180 0xb4 '´' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 181 0xb5 'µ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 182 0xb6 '¶' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 183 0xb7 '·' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 184 0xb8 '¸' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 185 0xb9 '¹' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x06, /* 00000110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 186 0xba 'º' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 187 0xbb '»' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x06, /* 00000110 */ 0xf6, /* 11110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 188 0xbc '¼' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf6, /* 11110110 */ 0x06, /* 00000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 189 0xbd '½' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 190 0xbe '¾' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 191 0xbf '¿' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xf8, /* 11111000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 192 0xc0 'À' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 193 0xc1 'Á' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 194 0xc2 'Â' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 195 0xc3 'Ã' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 196 0xc4 'Ä' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 197 0xc5 'Å' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 198 0xc6 'Æ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 199 0xc7 'Ç' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 200 0xc8 'È' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x30, /* 00110000 */ 0x3f, /* 00111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 201 0xc9 'É' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3f, /* 00111111 */ 0x30, /* 00110000 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 202 0xca 'Ê' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf7, /* 11110111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 203 0xcb 'Ë' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xf7, /* 11110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 204 0xcc 'Ì' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x37, /* 00110111 */ 0x30, /* 00110000 */ 0x37, /* 00110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 205 0xcd 'Í' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 206 0xce 'Î' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xf7, /* 11110111 */ 0x00, /* 00000000 */ 0xf7, /* 11110111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 207 0xcf 'Ï' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 208 0xd0 'Ð' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 209 0xd1 'Ñ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 210 0xd2 'Ò' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 211 0xd3 'Ó' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x3f, /* 00111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 212 0xd4 'Ô' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 213 0xd5 'Õ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 214 0xd6 'Ö' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3f, /* 00111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 215 0xd7 '×' */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0xff, /* 11111111 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ /* 216 0xd8 'Ø' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0xff, /* 11111111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 217 0xd9 'Ù' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xf8, /* 11111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 218 0xda 'Ú' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x1f, /* 00011111 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 219 0xdb 'Û' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* 220 0xdc 'Ü' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ /* 221 0xdd 'Ý' */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ 0xf0, /* 11110000 */ /* 222 0xde 'Þ' */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ 0x0f, /* 00001111 */ /* 223 0xdf 'ß' */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0xff, /* 11111111 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 224 0xe0 'à' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0xc8, /* 11001000 */ 0xdc, /* 11011100 */ 0x76, /* 01110110 */ 0x00, /* 00000000 */ /* 225 0xe1 'á' */ 0x78, /* 01111000 */ 0xcc, /* 11001100 */ 0xcc, /* 11001100 */ 0xd8, /* 11011000 */ 0xcc, /* 11001100 */ 0xc6, /* 11000110 */ 0xcc, /* 11001100 */ 0x00, /* 00000000 */ /* 226 0xe2 'â' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0xc0, /* 11000000 */ 0x00, /* 00000000 */ /* 227 0xe3 'ã' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x00, /* 00000000 */ /* 228 0xe4 'ä' */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ /* 229 0xe5 'å' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ 0x00, /* 00000000 */ /* 230 0xe6 'æ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x7c, /* 01111100 */ 0xc0, /* 11000000 */ /* 231 0xe7 'ç' */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ /* 232 0xe8 'è' */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x3c, /* 00111100 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ /* 233 0xe9 'é' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xfe, /* 11111110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ /* 234 0xea 'ê' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0xee, /* 11101110 */ 0x00, /* 00000000 */ /* 235 0xeb 'ë' */ 0x0e, /* 00001110 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x3e, /* 00111110 */ 0x66, /* 01100110 */ 0x66, /* 01100110 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ /* 236 0xec 'ì' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 237 0xed 'í' */ 0x06, /* 00000110 */ 0x0c, /* 00001100 */ 0x7e, /* 01111110 */ 0xdb, /* 11011011 */ 0xdb, /* 11011011 */ 0x7e, /* 01111110 */ 0x60, /* 01100000 */ 0xc0, /* 11000000 */ /* 238 0xee 'î' */ 0x1e, /* 00011110 */ 0x30, /* 00110000 */ 0x60, /* 01100000 */ 0x7e, /* 01111110 */ 0x60, /* 01100000 */ 0x30, /* 00110000 */ 0x1e, /* 00011110 */ 0x00, /* 00000000 */ /* 239 0xef 'ï' */ 0x00, /* 00000000 */ 0x7c, /* 01111100 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0xc6, /* 11000110 */ 0x00, /* 00000000 */ /* 240 0xf0 'ð' */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0xfe, /* 11111110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 241 0xf1 'ñ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x7e, /* 01111110 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 242 0xf2 'ò' */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 243 0xf3 'ó' */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x18, /* 00011000 */ 0x0c, /* 00001100 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ /* 244 0xf4 'ô' */ 0x0e, /* 00001110 */ 0x1b, /* 00011011 */ 0x1b, /* 00011011 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ /* 245 0xf5 'õ' */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0xd8, /* 11011000 */ 0xd8, /* 11011000 */ 0x70, /* 01110000 */ /* 246 0xf6 'ö' */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x7e, /* 01111110 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 247 0xf7 '÷' */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0x76, /* 01110110 */ 0xdc, /* 11011100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 248 0xf8 'ø' */ 0x38, /* 00111000 */ 0x6c, /* 01101100 */ 0x6c, /* 01101100 */ 0x38, /* 00111000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 249 0xf9 'ù' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 250 0xfa 'ú' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x18, /* 00011000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 251 0xfb 'û' */ 0x0f, /* 00001111 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0x0c, /* 00001100 */ 0xec, /* 11101100 */ 0x6c, /* 01101100 */ 0x3c, /* 00111100 */ 0x1c, /* 00011100 */ /* 252 0xfc 'ü' */ 0x6c, /* 01101100 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x36, /* 00110110 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 253 0xfd 'ý' */ 0x78, /* 01111000 */ 0x0c, /* 00001100 */ 0x18, /* 00011000 */ 0x30, /* 00110000 */ 0x7c, /* 01111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 254 0xfe 'þ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x3c, /* 00111100 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ /* 255 0xff 'ÿ' */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ 0x00, /* 00000000 */ }; wiringPi/devLib/piFace.c0000644000000000000000000000632612457032564014123 0ustar rootroot/* * piFace.: * This file to interface with the PiFace peripheral device which * has an MCP23S17 GPIO device connected via the SPI bus. * * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include "piFace.h" /* * myDigitalWrite: * Perform the digitalWrite function on the PiFace board ********************************************************************************* */ void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { digitalWrite (pin + 16, value) ; } /* * myDigitalRead: * Perform the digitalRead function on the PiFace board * With a slight twist - if we read from base + 8, then we * read from the output latch... ********************************************************************************* */ int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { if ((pin - node->pinBase) >= 8) return digitalRead (pin + 8) ; else return digitalRead (pin + 16 + 8) ; } /* * myPullUpDnControl: * Perform the pullUpDnControl function on the PiFace board ********************************************************************************* */ void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud) { pullUpDnControl (pin + 16 + 8, pud) ; } /* * piFaceSetup * We're going to create an instance of the mcp23s17 here, then * provide our own read/write routines on-top of it... * The supplied PiFace code (in Pithon) treats it as an 8-bit device * where you write the output ports and read the input port using the * same pin numbers, however I have had a request to be able to read * the output port, so reading 8..15 will read the output latch. ********************************************************************************* */ int piFaceSetup (const int pinBase) { int i ; struct wiringPiNodeStruct *node ; // Create an mcp23s17 instance: mcp23s17Setup (pinBase + 16, 0, 0) ; // Set the direction bits for (i = 0 ; i < 8 ; ++i) { pinMode (pinBase + 16 + i, OUTPUT) ; // Port A is the outputs pinMode (pinBase + 16 + 8 + i, INPUT) ; // Port B inputs. } node = wiringPiNewNode (pinBase, 16) ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->pullUpDnControl = myPullUpDnControl ; return 0 ; } wiringPi/devLib/lcd128x64.h0000644000000000000000000000403512457032564014273 0ustar rootroot/* * lcd128x64.h: * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ extern void lcd128x64setOrigin (int x, int y) ; extern void lcd128x64setOrientation (int orientation) ; extern void lcd128x64orientCoordinates (int *x, int *y) ; extern void lcd128x64getScreenSize (int *x, int *y) ; extern void lcd128x64point (int x, int y, int colour) ; extern void lcd128x64line (int x0, int y0, int x1, int y1, int colour) ; extern void lcd128x64lineTo (int x, int y, int colour) ; extern void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) ; extern void lcd128x64circle (int x, int y, int r, int colour, int filled) ; extern void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ; extern void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) ; extern void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) ; extern void lcd128x64update (void) ; extern void lcd128x64clear (int colour) ; extern int lcd128x64setup (void) ; wiringPi/devLib/Makefile0000644000000000000000000000745212457032564014231 0ustar rootroot# Makefile: # wiringPi device - Wiring Compatable library for the Raspberry Pi # # Copyright (c) 2012-2013 Gordon Henderson ################################################################################# # This file is part of wiringPi: # https://projects.drogon.net/raspberry-pi/wiringpi/ # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# DYN_VERS_MAJ=2 DYN_VERS_MIN=0 VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN) DESTDIR=/usr PREFIX=/local STATIC=libwiringPiDev.a DYNAMIC=libwiringPiDev.so.$(VERSION) #DEBUG = -g -O0 DEBUG = -O2 CC = gcc INCLUDE = -I. CFLAGS = $(DEBUG) -Wformat=2 -Wall $(INCLUDE) -Winline -pipe -fPIC LIBS = ############################################################################### SRC = ds1302.c maxdetect.c piNes.c \ gertboard.c piFace.c \ lcd128x64.c lcd.c \ piGlow.c OBJ = $(SRC:.c=.o) all: $(DYNAMIC) static: $(STATIC) $(STATIC): $(OBJ) @echo "[Link (Static)]" @ar rcs $(STATIC) $(OBJ) @ranlib $(STATIC) # @size $(STATIC) $(DYNAMIC): $(OBJ) @echo "[Link (Dynamic)]" @$(CC) -shared -Wl,-soname,libwiringPiDev.so -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ) .c.o: @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ .PHONY: clean clean: @echo "[Clean]" @rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.* .PHONY: tags tags: $(SRC) @echo [ctags] @ctags $(SRC) .PHONY: install-headers install-headers: @echo "[Install Headers]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/include @install -m 0644 ds1302.h $(DESTDIR)$(PREFIX)/include @install -m 0644 maxdetect.h $(DESTDIR)$(PREFIX)/include @install -m 0644 piNes.h $(DESTDIR)$(PREFIX)/include @install -m 0644 gertboard.h $(DESTDIR)$(PREFIX)/include @install -m 0644 piFace.h $(DESTDIR)$(PREFIX)/include @install -m 0644 lcd128x64.h $(DESTDIR)$(PREFIX)/include @install -m 0644 lcd.h $(DESTDIR)$(PREFIX)/include @install -m 0644 piGlow.h $(DESTDIR)$(PREFIX)/include .PHONY: install install: $(DYNAMIC) install-headers @echo "[Install Dynamic Lib]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib @install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so @ldconfig .PHONY: install-static install-static: $(STATIC) install-headers @echo "[Install Static Lib]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib @install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib .PHONY: uninstall uninstall: @echo "[UnInstall]" @rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h @rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h @rm -f $(DESTDIR)$(PREFIX)/include/piNes.h @rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h @rm -f $(DESTDIR)$(PREFIX)/include/piFace.h @rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h @rm -f $(DESTDIR)$(PREFIX)/include/lcd.h @rm -f $(DESTDIR)$(PREFIX)/include/piGlow.h @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.* @ldconfig .PHONY: depend depend: makedepend -Y $(SRC) # DO NOT DELETE ds1302.o: ds1302.h maxdetect.o: maxdetect.h piNes.o: piNes.h gertboard.o: gertboard.h piFace.o: piFace.h lcd128x64.o: font.h lcd128x64.h lcd.o: lcd.h piGlow.o: piGlow.h wiringPi/devLib/maxdetect.h0000755000000000000000000000236212457032564014716 0ustar rootroot/* * maxdetect.h: * Driver for the MaxDetect series sensors * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif // Main generic function int maxDetectRead (const int pin, unsigned char buffer [4]) ; // Individual sensors int readRHT03 (const int pin, int *temp, int *rh) ; #ifdef __cplusplus } #endif wiringPi/README.TXT0000644000000000000000000000113612457032564012713 0ustar rootroot wiringPi README =============== Please note that the official way to get wiringPi is via git from git.drogon.net and not GitHub. ie. git clone git://git.drogon.net/wiringPi The version of wiringPi held on GitHub by "Gadgetoid" is used to build the wiringPython, Ruby, Perl, etc. wrappers for these other languages. This version may lag the official Drogon release. Pull requests may not be accepted to Github.... Please see http://wiringpi.com/ for the official documentation, etc. and the best way to submit bug reports, etc. is by sending an email to projects@drogon.net Thanks! -Gordon wiringPi/COPYING.LESSER0000644000000000000000000001674312457032564013416 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. wiringPi/.git/0000755000000000000000000000000012457032621012207 5ustar rootrootwiringPi/.git/description0000777000000000000000000000000012457032555030404 2/tmp/tcloop/git/usr/local/share/git-core/templates/descriptionustar rootrootwiringPi/.git/FETCH_HEAD0000644000000000000000000000013312457032621013541 0ustar rootrootd42e831089c9d15d229fc475d84dee9456527b42 branch 'master' of git://git.drogon.net/wiringPi wiringPi/.git/packed-refs0000644000000000000000000000015312457032563014322 0ustar rootroot# pack-refs with: peeled fully-peeled d42e831089c9d15d229fc475d84dee9456527b42 refs/remotes/origin/master wiringPi/.git/objects/0000755000000000000000000000000012457032556013647 5ustar rootrootwiringPi/.git/objects/pack/0000755000000000000000000000000012457032564014564 5ustar rootrootwiringPi/.git/objects/pack/pack-2c3a6890da28e9aa6fd4e55a4c962bb0bdb42c23.pack0000444000000000000000000076401212457032560024210 0ustar rootrootPACKª—xœŽANÅ0 ÷9…÷ä¦ÓH±ƒ p'vàƒšT©ë“3ðV³™Ñ³¡ äU¤ÒV=yŠ¡”˜R(¼ .ÂQ´Æê íäNÚ SÍ>ɺ&­ûºU ˜%ï™B‘5¨ÏŽ¿í£xéCzƒWm¢ãšôxŽþ©Å®gý½·‡¦öËæ‘6Œ1ÂιÒãf¦ÿ/¸·SØTàgj·Þ.¨óOÓ_8økvïáÈz™û&¿S;žxœNANÄ0»çsâ²bÕ¤išJÁi¹ qáÓdÚu3U:KÙßÓò,,Û²,…‚\°óÖ;¤º±¦×MìÑjÚ8`EÔ¹à[µ`¡,ÛÔÞÎÖzh{ì±Ö4y2ÖDßyã]Ýb¥ð&¸p‰œár¤²îêi)üEAÖ—Xxä|Î$Ï ­nœv©áTíP¯×$Bÿ_Pï)ï„y¤„A&‚t™yƒÀ‘àF–?—ËQ‚¸Ó|ćWÒ8 lxW…o9 ̸Êù¬ÔçQ(°ïÕꧪ´ž±D(ôÖ´ÿÜy„™6x=©_ÉÉtƒ•xœÏQNÄ ÆñwN1oj6«P(¥ÆÝõ†Ó2 ¥Y½½ìê |#™ü_(T¯­ô ÓK­D°mê¦ï:n¤C£4[mÆTÀ;k¬èÃ`„„Šsãr¼o!„2Ö´h³{™(Ã;eO >0yÌ[}=­™>Ñ•íÅg)Ý',ÏPV˦‘¸àœ9Z–X þ_`oñ =Xöb‚2!Œk$Èh½g¸LØä¡’ yœát³Á­³ûV³á»–[ôxÄê£n²iŒ©jBýÛE<î{õס«þ§>¾ +Lña¦3¡ÐoŽ×ªÞ`¥3fö`®zºšxœKjÄ@ D÷>…öAîÏ´ !„l’eä²[=ã`·Y³˜ÛÇ“#dWPõê™2Cr.…Â~ð…âÌ1yçC™Ç<ÄiŒ¹çú®‘r5À>â„.¤a,ç)ùx¦tÀ>d?y)¢Sˆ®£›]Eá]4K…®™u?ÒsSùáÙö׬r‘úTÙ^ oLœ°GìfٶŌÿÿÐ}·LÆ6Ùm½ƒ Ø•áÒeÊ´®ð°PÍn¿µ&j›/ÚÛĪwø\àíÔý ]>•xœŽINÄ0E÷9EíAÝq‘‚ Ö>cW:qEeG¡o›#°+}ÕûïgF„Aš ½ìd­½6µ²ª“¡iL+Zië0¡_mŽ1f0¾ï­ÕÊÛàµ6J ë„i»Æ a”oŒ Òj«*·ç‰Þ‰EøÀS¹ž6¦oô9½¦‘â)b~ÑÖk:ÙÁC-êºò´®sÎøÿ†êmþÁÒê–ú}„9Bž>/_à) 2Âœáp ¢ëGÊêû׸ÍE5²[OÕe¢} 逃øZxæ²a¹AYôÊ~z„ÂQÒ-e\Siq¹8S¾ûÿê\ªÎ{âs?Çó=8U¿—}—xœÌM @á=§˜½Iß”IŒ1nôÀ Z“BC©ç—3¸{›ïõÆ ÌN{Ï)áˆàŒóˆèg£‰Tœ³"ö9E$±…Æ¥ƒË1Xi¢Î³ÅÀ’ƒ³R¡4sNuÖÄÊzC"ý]S²à ‹)³zýBSò›h¦p XÞCÝV 3Ⱥ†7U]UÂвøRðÿÄ÷huÁ Ž1ÊáIç0¥W=ÜÓׂð@v½ ¼sÖaæéBûð=š“^DÙ¥] ‚†à Sj«/—ÐZ؉÷è(Ä×ú’ Ö¶è`3¼Bô!ƒjîT{§pÔ |€«O>Ì£ƲÆñüšonÅB7Œ„1aÞž¾íœ~Ó£C!ð8ÚßÞþÉÉYˆûYx#âÍíV0/]wžíF†çÇO/?Ç;Ð^¼<~ûx ¯CxœŽMnÄ F÷œÂûj"þ’0RUu×.{&¡3@NgŽ_Ò#t÷l}ŸŸ©"‚WA4…5“ |’.H{õB9r³peÅ•;Év[1afɵŸÔ¨¥äÁOó¨ÇÙ8å­ÕjV…cö ­Tø(Õ— Ÿ˜=ÖÖéu¯åjï¾–µä!#½ÐœÝhfxá‚s¶””"þÿ[6›Wô@ö˜!'·cßK%h%Ð×# ÌkˆOèwù6´ .ð¨1¯gÅÔ}?çDB²OÔíPËAçöîýÕ;lÝ㟬±_¥apu›xœŽKNÄ@ D÷9…ÙP»a¤ÑVp §íÌH;ê6âú4W`QªZ<=•5XÎB…ÐatyÁ“_ñ„!ÏBaJ(ž}žjR bˆÞ/’©äÕ1KZ=?³„‘ââq!J2xú¶›6xÓÆZá]*Këc¦R¬¿pÓ«Ö§*v sJ³‹˜àÑ¡sSÑ}ßÌäÿ†éuÜcèº ØÐgS¸›þuú2Ø•¥Ã°[ípß{¿Ý=L¿­2YxŸxœŒK Â0@÷9Eö‚dšÏ$ "nôíÌD+4)iêùíÜ=¼×›ˆžx" Ìr2àÁ‘Ž rì1yŠÀY­c“ÒµCÌчÁ!p°ÉZ¡”¶ ÂÄècÄÁ$² Æ½¿kÓÚ¸ý”ÂÒ¶ƒ.k«¡¾Ý¸ÕW-ç"ýªÁ¢7ÎÆõÉ€1Šê²Ì½Ëÿuß—UXj®Eý÷.I¨šxœŒ;ªÃ0{bûF²þð¯ËKŸ È»ëØ!‘Œ¼)rûø )†)F:3DÊst™ÐL¦¸ µF,ÅÇD­Ï!E«¶Ò¹ Ì~$J6[dƒÉ3M‰ŃGíLœr@—­*/YZ‡sëÔ*üs%îûa¿[owFÙÿ¨·[«Ce9±Ñkì˜áG­¶çsáïê"°ðcÛaáÝ^Pˆ@†y}ð«48_®Ã0¨wœR)—xœŽANÄ0 ï}…ïH«¤‰›µ„7¸ð'vÚ"¯Ò,ï§oà6sÍèªÀ~ÎÄBrÁŒ3Æ%’D¾3‡…cñÌu™§wmPý¢)†T IXƒ*!q®JU³ÄD?Çf>¬‹5øÔ&ÚÏ‹^ݾµŒó]º­ÖnMÇøÐ9¤ù/Î;7;Ž} ýaúÚÛ5P6n«ž0 ƦP÷ŸK¸ t=ìWò>À*ˆæçz›þP>XK”xœ]J1 Fß»Š<*‚¤éü€ˆ  ÏêÒ4õVg¦C'·o…‹ òðq ù´Š€g×wG ÓDóÌ}Hl'ÏÁá”z’€Hf§*›‚¸Æipc¢Å9Ä6¥!Ž~¶”lÀà½K†Îz*žKeƒÙ¢Ô£¥»½–Oa=b-e»ÝDïÁv£GôntpƒÑpY׬*ÿ¿`4Ç,h‹ rh‹O¯ð&5ÓW­ ­eýXù"´”kóþ-ôÕ¤žVÞ»Þ9àÅÐÒ^ºˆpÎK„ƒkÞµ­Á" ëVÒÌæTüsNxœÏ½n!àž§Ø>’‡EIå)Ü¥æg±± œö°Ç×¥N·Òh¾ÑvB¯¸0ÜÌ)ig­Ô2Ik^’J˜祷ÒåØêk‡àÓg5yí´¡)„E,"øÙNAË݈\1wï—Fpl[…O¬i×ëJ튡oï‘Ú¹ÕCÅþB5=) /\pÎB+%÷ŽÿØGŒ!Wè„S>ÞÚ">¾²üéX·<°Hùt`ß´¯UØZÁ»²Þpƒ4>øÓöÍQdþ^Ö?3åz>eýb¿švmŸxœŽ;N1DsŸ¢s$äÿGB¢% à ¶»ÍíØ#gáø8àd/¨ªWsÓd3Go¤—ʹÑr2žMI“t^Èx!¶ÇAmJ ·Š§$­QL *ù…ÔBær QºÄâ9¯}À¥ì Þ¨!cÑÓ>úåy¼à蟽=6šÏ ”Ó–;£-Œ¢’1e$cK‚ÑÛŒWÎѨÙsHìò³ßkƒSmZ œ­¨µÇ»>·VMúãK[½Õ²+Ö÷à‰iJB‚ôˆNêº.½Ûÿî j K k~E¸ü|Ãz…È}ÙÜÁN±xœÌ»NÃ0ÐÝ_qYX";~K1´@$TXû:MÛøFŽ«òùð lg:­"‚·É8½ìG#t¶Òf%<ÁsãöYi¥œ7l K¥ÇŒJF.£E-‚\q™Ñô.j™lÐ(eáÚŽTá•j¢oXÖíOk¥ƶ=§J•®`{!­t\ô¾‡.8g‘–en ÿ?°i ÞÃó|AˆÇP&LÐBJðqØ¿ ßp»ýç×n8°%®’sÕE¯Sž0u04¸Q=oPèvÇ~Pk\ó’xœÌ;!ОSЛløÍ2$ÆØé¼0ƒŸd°Xx{=ƒÝ«ÞÌRº Ê„ ¨[˜ƒÇÀ’q‚Ö œèqpR™h!a1‘!£·¼Zô±D.VãK ´Šøž6ä¥ jU^¹ý§cíÅyîgíÞêRyž¤¶ÞoVyPZ)‘Û¶=çäÿqûô&ŸUn¹[¥Ì’ÅXñJƒ‘xœÌ1Â0 À=¯ðŽ„œºMm !6˜ùIÜRD“*„ÿ_`»éZ5Å{ê8ˆ’ÝÄXnÓÔqòd„2 ½O£z·iµÜ WÅ"òƒŠM="“˜H˜&dC§ïv/Î¥¦’áb9Y}}uØjyXl¯Sªe.yŸ­ÁÓØQ¡Ø¡Gt±¬ëÒšý?¸«iÒç~•æK†y[ Ä»æÙÒÞ}-O‘–xœŒANÄ0 ïy…ïH¨Ž×N*!Ä Ž|!‰vÑ6©Ò à÷ô ÜF£ÑÌa/•”bÀÄ*…S +T¹dZ«ð%‡S¸= k|5‘ì«äÌŠg'i ‘h5Ήˆ¢K_óÚ¼ö¡½Á›5µqœô´þie/:úGoÍæ3 O"$\Wú¶Ýæ´ÿÜûè»û/$US˜Wƒ-ýFf¨·»Ðú·û˜°P½œxœÎÁjC!н_1ûBШ£B)í&í¦¡ÎؼÐ矡éß÷Aþ »Ëåp¹s0‡vl:Ƙ¬ ÁLèöššu¥¥„„”ŒºæÁ}‚u±Ô`™’=EÆBäSò;ñ’k©%•oó,ÞetøàN<¶==_‡\¸Î핆|I?tž/`l8ZDk<à„ãÔÞ’í,¶#™ 3E±m›v$×_zO£\Óvtprv꺱!¥ÞuwYR†o)ûá;EO¹hõqËé79)Ÿ}NsŠ§Hò Úþr®}ßuð¾i›Æ¸´®,Bÿ¯`Sò€pÇÌhGÆÀ…UˆKÙ dA Ì|ç8+È¥œU2•=H1Ëgþä¿Næ‹÷ª, Z,O Iáè1„³ÒH`Êiú#KõZ“ß•“ùº`œ_Évçࡸ̛T…½œ-ÇsY £"rÝ.¾ô,jW×dB´SÒZO*¢¦ÏРÞ,x§8oõ ’(³E/%­BÙíeX›@a• Ù°`F[JµsB+)Ra¤p&N%‹+×ùÝ|ô¡½Á§5µqüéuý×ê<Þuô¯Þž›Í7‘sX3ÓÞ»Ú·ígN{üà.}ÌÛÞUSØ꽧—ÿ&w­Nù˜xœŒAjÄ0 ï~…î… ÇŽcCY =lû ­$7[6Öâ¸Ðç7oèm˜]8  2­)†’÷Enó —ŠHäEBκF÷¤®m­<{ Z9fŽ±žYåLŒ^Ê’ÅÙWYýŒÍ:\­‹5øÐ&Ú“^ŸÝ¾•Çñ&ݾ¬MMÇ|Hs,% zDǶï÷1ôÿw¥mj6¶órìôx@½ÿÂ08 |ÎïÀ&:¹?—=QžxœÌAnÄ @Ñ=§`_)2$XªFU73×0¶i§R "dÎ?œ¡»¿ù¯7UVpQQ#8bNšAsÙ4Ç,0Ó’0˜ƒš–nS¦ìC ¡¼ˆ>ò7F 膑gOœ"#ºúomö^›ÔbZDÛ9êóhõO¹Ÿ_ÒêO-SÑ~³nl¸Úp†ë¾?{×ÿ æûÚû×slåÚÓàzµ~‚żòIPM”xœÁNÃ0DïùŠ½CS'±WBˆR9À.œ7ÞukHìÈÙ ò÷¤ü·‘fÞŒF234žL¾jÚº7®1­b]3wÖkM}E±²­ÁbÂÌQ 6vgжÒäQ)îu³ódk«5šŽÈ:Õ#v.rJ)SŠðÄ‘8Ï«º™rú`'óåtL±Œ,·°îï”U¶Öp¥*¥ —Æ1ˆðÿŠ=1Áàhƒ„>/A@ϲ¥¾äÄ°ÿ³Þ÷ðüðÓ€Â+za/×%¸O¨á=d—ˆçk`qeñâzO¾§´í—#øpæ¹üÇ´†ÇDËÀ3„¸Î§`s.~ÑŽw{xœÌMjÃ0@á½N1û‚Ñ¿,(¥tÓfÈ $Í8qˆ5FžÜ¿9Cv>x2ˆ e,HZÎÆéÈë­n1»–hftΗèÕ^u,nöÞµjC*®ÖJ¾`Z‚'rKˆ9]ìBI•§ÜxÀ/äÔ‘ÆñªÏ}ðšß8øÊ}ê$_`\œ}²ÖøÐFkÕxÛVzÿ ~Xn4&¸låñ€õ8žmÐ.°vax!\Î'hŒ4©gSôšxœŒ1N1{¿bKPZïÙwg !*HIEo{׉‘bG{¾Ÿ“òšÑ43CE€¼/"1»ˆ9û}&‡Ó²ì ÁòÌ~…²3רÒ„5åDÈa V ¹$Yr® Ó´–d£å˜Lüç®ðÑ•{ƒ£4Ýv{¹jÿ–<¶7Ö~êí¹Éx;Í«[pÆhMî—KCþ0Uk;}VøÚ»º‡Oð^up¿ÃC/ðKæõ*S ™xœŽÁNÅ E÷|Å,5ÓÒ> ‰1ƺ3yþÀSÀ´ÐPúêóë¥ñœÕͽ™soÉD ´æÚè¸jyj­àRò^‘4 Á¹UÇ-˜)蔂šj+=Ø¡S'!…î±í,™¾1xÒ$áV|Êðš²MÞ(ZÊkUKN_dÊúlsr)>D*OÐv¢áCßpwM=fÒ<‡Rèÿvž‚óŒÇèJ‚â ÜT€Ë8Þ¾áüñzÇZ¶†‚ÝS„)¡ ѱãiNv›è}^—!þAfŒ° #ö²¹CöˆtÂl!Ó%¬¡nµTêÒCÝì>{Ú& ‘.µÌã²Pd¯;^ïÁ§ý°oÙ/°†kxœÍAN!…á=§¨Þ91N i 0ÆèltaâÆ UL·IC‡Á…·—3øVÿê{½1C^œ e¦d,&3±’äg-£¥)Ó¢8BãÒÁ`²6š0sF³Wè•TÆÇŒYk´IF¥Pz~úZ¼ÕFµÀ;âvõt´úÍ©ß^¨Õk-çÂý”6Þi;k÷rL¤ºï[ïüA\jO+ô•áõã †3¸­ÀõØ*œÅÝgƒ=üF†K«Æ'ÐFÓ4ÄoðW3”xœŽÁNÃ0DïþŠ½#E‰ã¦±„*‡~Àñ®[Cã ÎT¾øö4ÚÍ<ÉDÐc×M]Ó´X“­ƒ¶m×7¨³Ýô¤[S£³ÁªÉeJfpmGÚl7® Ú[Óoj‹8 «uoý`ƒCCÊ-râ {ÎÈ ”ò\Ôõ”ù•¼Ì7˜ùÈ©J$;hÚÝk; Wu9åy£ý¿AÝ"‚fÿ##0Prù¨ÁþùžaŠi^ÿÁLŸQNŠ‡¿ÌÝã`Že|Í)QvB¥8dz_(ù ,S±Tc+ýtøª”z‰ËöÌ#_‡KÀ¥óƒ´öþB…%y‰\b*Ý«qœ"«Eâ9Ê¥Rßd÷ˆŸxœŽAjÄ0 E÷>…ö…ÁŽ-Ç‚2tÕé5ìHI]&Vp<Ðã7gè_½ÅãñGï<%²HäQÊìf×9JΔm,Kð1qpæÈ]ÚIkœ0Y©¸€S²Qp XJDJlÝåódòk|k‡‡vÖ_ÒXúyÑûÑõG–q~p×MۭɸƒóH>‘£oöšYtßëòÿ‚ù¬¿Âa¯í:²jßóµmPÏó%PlGUè’9?Ÿæî|TU"xœ‘ËNÃ0E÷ùŠÙ‚Vy4M+!ÄcH,x~€c_'.‰ÙÁç3Uˆ-^ÍŒGçÞks¨A]›²@UV›z]60´f­W6×fÛšÆyÛ*d“ŠðL¦Ý–µ†*6¹¶•]7@Q!Wµ’ýÒê­©4êõ*S3÷!Òmˆ&xºƒ7ˆIªó)†4§KCüÒƒ/¨¨êmÕlòUC§¹œL‡qtÌø?!{šƒY|î•ï¨GÄ2»2†œ§Ñi:jçßHÈ]TcÚßq§§ßýÍ=¿^“ò†^z Ã2{›Œb}¸è|÷è¤à^1>€Z×-¬“"üÀF7 .Ÿ½f'SaeêàE‘££Ó1üYâ~¥þ˜ú–K, =Ü>>H>µ¥CĦKq’^jb$>„¤ífi­üÒýË3±%MsœB‚ ¾HsµLšxœKNÄ0D÷>E³aƒ@Nç#!„Ä8h»Û‰Ç9=BÜÏZµºJO¥’Ê Ó2 c°&h‹½ŸvÚº`{Ý[Ö†ÌÐOhòꌕ³ÀbÛ‹»03#¹ÐùÙ³ÆÎ4‘æ1,wNáE¶Rá½T*>8×£]ÏçZNìåx¥ZÖ’Ÿ2Ë tÆΣé–ÉÀƒnR¾ì{áÿÔ×™P˜@6w‰‰àvüæƒÀ”Ê„VòæƼ^£ê³ƒ]Åù\1fxl’Ó/ÄpÖ¸nãµ´mṪ4$Óú“•oë˜xœŒAnà ï¼bï‘"°1`)ª*õô°»Øij6Âëÿ×oèœæ0íÌP«·#Í mN¦àѦý<’³Cš£¯Ù›wîÜ Û3)4 µ`L‘ÏÔå!§X‘ {[§è²%“]¥Ã]:Iƒ7⾟v{wùaÔý“º,Ò®õÜ8¥`Óà\ì‰AÙ¶§*ÿÿ`pÍma‚r< T ‰ èÊð=|®Œ¯ýjþ`‚R¸›xœËJ1E÷ùŠZ*ÂЯô$""ÌB݉úÕIe:2y¤mçïM;îÜY(R·Î½Uh.ÇÉôJŒ\Œ‚sÔuÔ"Iì'Ù+”Ô°ˆ‰|%:3‰}ÏuËÇ^7lz5Òì{#¥np¤Z1\Ê<†¤ƒ‡'òšR®Ý]LáƒTÉ:…cð;OåÚž .Ûa?ÀMS‹©àœ-…þO`‡ý‘4”™`ZìIC>çBJ€ºá¹;€©}XwðFäò6R¸dªM‡þ 6ç…2«¾¾¾WÌq²èQ®Ðk OòP§98ú+±Ö°T{Œ‘0Áõ-cÆ~ÕdÅ:ë“ Á”÷àéWð¼$ëaµ©ª_l¦²ÄúQRЋªºuÞÄ–7Þv²së1§SÞ±oÉX¥ –xœ‘MN1 …÷9…ÙµBTMæ/#!+X"!à$Î4t&‰2PoOZq¼xò“­OO6"è%JÝh?ŒEw$jíØ«¦§”mÛêÈ(‘±Pdhû¡¡Fé¥Ô²1ÚÆ(Th†¡CTÎu¶:¸ñ)xMÅ¥o•µv¹¤/²¼>»’¦‘ø dÓi¥Çî(áþXKØ´,™þOŸÙ!“>˜-ÌV[Bfà†nl.—«sÄ•3Ú3$AÙGßbwJ™ü6Ï—»½x™×Ûçù†]Ì`“#~B qzÄ[Þí¯àÏuÄ€`ª.©X1`t@Þ®7­‹X3Lõñ ä„9œxœÍnÄ „ï<…ï•V ΑªªêÚ>³a›rÈ>Ù>Bç4ž‘¬oª0ÖÑønZ|É¢ífƒ£·äî5!ê‘æѨb…SêuÃbgç‚á…ŒÃÎu8M½Á‰CpžµÃ•=ëš>³øœà‹“g9š{-’ïLõx÷’o9]×7èq4zfÔðÒ5)ÊûkåÿP×Õ¦CÍPWwÆÍÃAK}f´2ý@hˆÏ¶œˆ!‡¿û[_Áóƒ·\ö6[mщ•ÈÇE}œ{a·3<QlêC k–xœŽÑJÅ0Dßóû¨—¶iÓDôEü‚M²É¶II·\ü{S?ÁÙ…9 W"°Ö VØ)í‚4}Г·Öõ³ ÒZ+•Á{+'±a¥ÌПoœqæ)ôÆOf6!çu‡Ý<"ÉÑ™1(_K…×R}ÉðFÙSÝ[zÜjù"Çû³¯%–|ÉÄO ;éAÉfxèš„+뚘éÿñžr஘#íÀVÚw<³¥”#l5e&¡–n©]ñ#}Ûݽxù«y°GZø,ßJý†kL—å§1Îuñ ñjá%xœQMÓ0½ûWÌÞ@ì®òÑ´„ߥ҂V]Gäx¦‰!ñDc'ýûLRw|ò¼ñ¼yï9 ØÜ5[t¸?c…yEѹÎê*ß–5hËÒn6›ŒÌh…B‚¢¢ ¹j—5™Íë¼²å~WÔM» ¬ W¢±SêXàÀ‚à$‰z{9 ÿ$—âkn9ÜJ¯ /«½®Ìó-¼ÈôÇÃàS¢ÿg0œ"ð\gCK:º‡7ˆ„èÇâ$Š #Ý‚]ÁHâmÿuuM+v¸56 ÍÔ󨣩£ëøÓ îàT£Lc‚'’Ù;‚OÉ2º{ÕÃä: ½VIá•‚{„‹õé#Ë?ŽEÉ1Ÿ}Ðè҅쯉×÷íèù¯¤rÜiíR˜½p–/š­Zhz2ߧã—ÃãñÇûo¿tˆÕ¥zxþãdTn»µ‰°D8 Kmë\¼¾j½¦“¦äê0³…Í®F®±°6nž›ßÖþË™˜"xœÝNä0 …ïó¾ é$Ž´BûsH‹@´×nìvºÓÆ•›YàíIËÂ+Gþìs|’2CÀ­v;ë°,¬k\UU sÛ„šZßîÂÎ5fBå˜ÀÖ›à±j|°Uk}c ·µ-·Îµ¾&»Cï\Õ´•Ácڋ•(I„kŽÄ:çêÛ¤ò—Cš¿“J'±ˆœ.Án¼«7¾¶pr‘Ÿ 2Ž}Jüõ ægßÁq"L {V. ñ€¯·}P™9H¤ù•@ùìY©g€ö±0?ˆ˜afíqx`$à§!‹wŠã)`ÌÄÊõÒžA¿™L’õóŸ!‰æiµAçaÏá'f3ß®äÕýÍÝùýŸ[Bü!W® ¿LÙ˜“ÇaqóOVÝ$‘¡ãÈŠ©Ý:º4ÌÒüpšÓ/ óøÌxXl¬bÝÔ ,Ù¾oÉ¥jŽrx…Aò‘ rSþ‚Qèøiþ ôŠ·ü’xœÍNÃ0„ï~Š½q@-qR'Ž„pKê,öäGuìÈqZåíIz wN»Í|«Ù2V+d WE~…irÝèL•°9¸P¶âº0y!FŽð‰tÉÊ”™®`Le™+«¤¬KmkSéCÁ‡Zfø<§.DúÑOŸðqZ·çö¦¼ÚÚà÷é…d¡2×J–ô˜É,& CŸþ›Ç×nû¥@ÜHƒI4OÜ‚VÖ Ê鉔ÌïtâiüAŒ }÷Ó^¼¹)БÏhzJWðùÎê‡1†Ë*w½o'šÂ€kljvdaz »:E¯³Ã2°ŸÙ7[·-DRÑŽ7òEí#µLReXt²ˆÒ7ˆ (»‘l°Ç×é#dõ½¯ß Hƒ„l¢3YtÁ‹³U¨Ge‚5’˜òŠ…¨í°a¡ÔÀx7Zi¥ž8fB†œ‚UBðÑqiœRzlÒîí– \r 9Á;¥@¥v÷8ß›çPòœÓ)Q{.G­-JÁ㌠>¯klþ»^B 1AÍ+A¢¦=ùsªÐ2j{IÐn×.c ½û‰µ€) ¸,ùôžê}ðG±Ä4w¾ç×·ÏïËõã ¶þ±âÖe††n¡z~3>nÈ’xœËMjÃ0@á½N1ûBýØ’ „@I…캖=ãÈ`kŒ¬¤×o›#t÷xðµÊ ±' qdëÑê ‘0ÐMzºÔ™Þh‡Am©ri`‘|¤4øÞ{LÚFïˆÒŸ!Ó§yp¤Uz´,.RI \¹×ý·Þï¯s¢*w)‡ÂíÚ:ïC­7Ôˆj”u[ãÿzõ±nUžLÐ2Ãíë¦GÛ,e‡ï¹eȼl0UYáœë¼Ã5-ËAýÈ{T–”xœÏANÄ0 Ð}OaV,Uš¦m"!+f9‚¸±§4M*7Ó·'…°û¶ü,; 3BƱŎ¹é/^÷Š”²½S¬kÆÁitÆ6¾ZQ8f´õä×mÏìGGƚѺ8êTGN­mºÁWxËsøHB)‰#±l%½L¿7’4¥XGίд¦·C§ OªQªòiYBÎü__½?Ÿð(l>í,LgÌpä=]s©?q[Gù†sxÜ`Æ¡H¥‰ŽùT©fº—ßAx[(ÄÛRd]×ð•þ ®ÇÒ{§s8´O+×Õ?!rO’xœÍjÃ0„ïzŠ½· ²ä8”Ò––4— ¡Ç¢Ÿ-k¤$ôí+›Û ý¾×?Æ ~L´hÈžxœŽAjÄ0 E÷>…öAvœÈ†RZºh¯![òd ±ƒã2×oèº{|xŸ7º*ø¬´àšæ4Ç9­ž“”èˆY9¤¨‹NÒbîZä•bTŽ1 ç­)dWBDš3 .D†ÆÖ:|¶.­Â—VÑ~^ôrÿ[Þ¤·{«·ªãìì—½#ZD“Û¾?ÆÐÿúæ]D>¦ žãR¡\5gÛZ±)T}^ÿ· Êã[Oó â‹Txœ‹»nÃ0 w}÷¨c (º%c—|€,Q®‹†Ì íß7È't»;àt0Ù)G:FN¥p›&ߘÈqãÔ(¶XxÎÎ'³çÁ]!;Ûfœ1Ëä0³'_| À¡g1O±º’Ðä»~Ë€‹Œ*®Ü+ãIïË«|Ö!‹ôSgýô!ž=& ðfÑZSdÛVUþïon{ͺöiúõØ@ÚúóÔAw9Næ«ŸPu“xœŽ»j1E{}Åô!Fo{!§²›€»Ô#Íh#ØÕYÆÉßgÉ'äV‡îèÌ€)MÁ‡¤·¡9LmDÊÑå=šÉ,>˜ÌVÝ°sÀÑÅ­q‰)¹@H“ÙÛØãç ‹Uø_Òá,¤Á…q¿oô6ÿ™u™¥í#çÃÁÆ)FxÑFk•e]ëüß^½1Á]Êxn¿áúù«Ðca¨mÆ…j—az!ÏNŸ Áf‚%¬-zåp"@px8¨(çáä }KgçÐá8’Ÿ6JݽÜ÷¾…¥—ôwºÛÁ‚SÌáH¢?.x„ˆ×†×ý38žýúEÍ4Ax€ ¼æ¯ áñoÇåi[„Wfu?‡¾í}œrŒBžÛN6ê,ŒŒùŸxœÁJ1DÏæ+rÛƒ°Û3é$=‹ˆàA/‚¿Ð›tf#N2d"þ¾£ Þ½EQ¯ª7 ‚@lBc.†ˆ G@DƒD~#ŽÉT+7)]ž„’µžÑyÇÓep,íh''‚¸ß~š¦”$2Â`Üè,±›„MLyDo(J4Ö¢â~­M?ÕkÑÏR¢´mwwóOò[k9é÷z0h ¹ýLß B]–Ü»ü—W/ÒfÑ—Æ%\õaámß:èšôœûñ=¯­¾IèÛé3·\æ׬Ôc-é=ïÙYÝÌk®§o9õËbl!“xœÁJ1@ïùŠ¹ 2³“ì¦ EÁR=Å?˜d&uÁ&%›þ¿ÅOðöxðx£›A–4Œ³§%I¢iÔ V“ϱd3w•nu@öÌv¹¦¥ M}Š¬yQŠ´c 8{™ÍÉm|·ÇÖµUx³ªÖ·;=ÿ̳övnõ±ÚرCœ]n—Ë:†ý·w§µÞç·«Ê° FƒãçûHUø:¼¼žPÖÛÜ/òO™–xœ¥ŽËjÃ0E÷þŠÙŒ=,A)Ý¥Y„zSºkFŽ ‘Œ¬ß¯Rh »Ë}n«Ì€^ Óxˆžgš˜Y‹7YY«½Ú VÎ ‚VÊH¢Ë…ßõ¡g›xœŽ_J!…ß]Å}ÿüˆ¨§Ú@ PïufTÔ‰jõIí —Ãáð}pF#} Î £6)”hVWeU0›²Ü eÍåFȪk”ØEÔÓ 3=ñ€ž[½JK·ÕGEÁ› 4s×x/ ^JÃ’á•2Rë³=ì¿Ë¶²—¼d ¤ÒRkV¸ã‚sÊy¦1è¿>{«è!ì5¨mî„Q ¦Oèå$8SžïRïõ…=#Nx”zÐà¯t ôÐR'x¸ï¯¿5å}a?õeZžxœ‹»j1{}Åö£·8!]Ҥ̬´+ûðY{èÖ˜ü}L>!Í0 ŒNf¨h].’Kñ•Bí­ÔˆÙÕºÃX[õÁì8y(4›2.œ£ ½æd½Ç†ÅR^J',=Eï|a2x׋LøI2à“ñ<žözþ+ï4å,ã4XßÀ…˜ÂÙËuÖš&·ÛªÊÿýÍ÷N¨Lð…WîëÆpèîc‡â¶ÁCæõ€}ÊÎsû1¿údUê—xœ‹A "»‰éÂ.”Äoú?@—¥öPhü½OpN“I¦7r&ÈÁ€J#b€h“'‹­á8¬¶Ø¤tÃ$l< 2ø ÙÎS°€ŒàãÁèTÜû«6}¯-Õ¢R’´÷a—ùWn©Õ¹–s‘~Õ`‘L c> 0 Šëº.½Ë¿¿z.é³”Yï›údüF[–xœ‹A Â0E÷9ÅìI:É´wz/d¦µ`“’¦ ooñ®þãñ~«" ¦˜º` E÷ið¾×B¬™¹pTk¨’Ø8:1h„Äs”dFŒ¶·ŽçäCGÈTØÛ«T¸—Ê%ÃC2KݺL?sãZ¦’ÏYÚ Z×y‹ƒ“6Z«T–enMþý«çÌŸ9O°¯°•E ¼Xâ>©/ÑK³‘xœ‹A E÷œb\›:Pct¥× ÌP»(4ïoãÜý¼÷~o" ãè´ÎÓà6eÖ³µ¥$Ö†0‚‡ÞùU@«HGä=þåü"œüZ ˆ(’ƒ›(§ì5ã‰y‘¾æÞ‡|íƒz“o܈ǹÜÓöK^hô­·ûÆóY*c6ê(ïÖØ£ÎÉÿí‹wË·:¾ë¨mû¨âèa÷‘xœ•‹KjÄ0D÷>EïCk$Û2„E`² d3¥–GŒ­6r3·ò¹@VU¼ª'…¬r*Æ0ö‘| á qünZU4ö¾EeñŒÍê e1¢ ¶ÃºnÀ:kß©ª£î‰Z!YÔV7n—¸p œár ²Õö<ý×Pxâ|Ê$/ ´iÏÆôÚÂ*ÄÆó²$úß›¶kÿüæº'àH%åé3<ÃÁå^‘Ü`ã…`Ýçùº¾ñ‘a“=ÆæB™Š›ARxT ö8þ~kÊÀs (¼çf÷øH¾ðFžsØš/}dmÚ’xœ‹ËjÃ0ïúŠ½Â*«Ä2”ÒC¡=ö’Ðcå˜ÄZ#¯ñïWí'ô6Ì0Ú˜ÁÛ`KÉq(œJtŒ#aü%²]Å!]Ðz<£YC㪠†ì¯ØëFì™ÒÕöip®EöHžLØõ. >¥e©ðÅ5sÛ:½Næ=7™¤ž*ëXr—³syxA‹h’,ˬÊÿýÍmÍA9Ã1·¹Nßó) Ò]é6YÖýù¼­rTØt/ÅüC‘Vº xœËA Â0@Ñ}N1{A’&iqW»÷igR &qôüŠGp÷yð¥ÕÓbÅ­×!¸Ñ„`Ò’Ê`1ZG[0£Ê/¹s‡‰;rƒ+5¤þüÖiûÉ;oÜŽä Æ:o£…ƒ6Z«•kÝEèß_Ím—=? ò›@¦ù¦>ˆ¤;±«xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQééâèãÃÐÇã|ÞrÊ« [å_X„œJrˆ0…* HÍ/ÈIeØléé'¾ýãóýÌ×l£Ÿ0xÏÚ%UäêèâëªÂPÞ¹éõ"ÖÑÆ5[S3òô¿i±TU™›š*$•fæ¤0ì:Ò¼¤ô9»vë}Îë÷ÃÍŸMÙÞ(eb )©e>™I NLåO? &Çö\ÚgÆ|æÖ]§û©“! R+s.)fPY¶é¨ä{3{¾s'M´Í;}.~~4¢$½ 3Ÿ!eS7CÕ§èË÷4Þö×{9uëíˆtAf^1ƒBý4w­„?7žñVVrlöܶSDº<³(3/= “¡JõÅÚ¤9‹ʵ¿;!8_j—ýâW €Š;³Þxœ½Ymoܸþ®_AøËÙÀÞæµWôPp}NšÂ—3âK‹~äJÜ]6’¸%%o¶¿¾ÏÌ¥Ýu|8 ‚Ø9œ×gž¡”:úyÿñ³º»}x¸ý¤Þß~¼ýt}§î?ÿõîÿÛ·Åñþù‡ñÁºV½Y¨×Rï[£^¿|ùÇ¢P7nwðv³íÔåÍ?Tï¼1êÁ­»½öF½s}[é»êC[.ÕŸ·]·ûñÅ‹uX/ß¼øK¡n?8µAíŒol×™JuN•®t[©Ê†ÎÛUß…µ+Èkè¥5¡Pn­º-vÖ¶4m0ªreߘ¶[(¬WåV·Ûn”íH|ë:¥ëÚíMµ, ¿ú•¶>FûX”?™ŒWïMk¼®Õ}¿‚|uÏ°méüÎyÝAÚÒAíÀª–®­,ÙH\’ü&—=ZD¡ úÝ®6¤;Ì_x½®D–³kB`Ñ5B‹ LY’/—êz\ú“YÛV´à·×Aõë·Æ‹H\°ÇâÁÊ›5ô$ŸÔW|QœöÅ‚­¦¥lÛýÝ·äÄŠ^üŠ5wvåµ?är4ü Y0aïüµ¡?Úä¥Ñ”EápˆÇ3ÝB/u ‡Ú’ÓO9)7®YYÚøO£ƒªÈSO^·ê"ÛwAi£Ûƒ ÁjôÃ%£pŠEÀüZ—Fí¼{´•©Š½h‰¤â~kËmJBÖso!c¥)2P0Û°,$‚È[´X•µœOðÿ:¨=9‡„WTaaã*S`KXÌ)5gÛÅ|u1q’Ø/Öc_Õ—²¯äE$Ž­mûEN)r—ïm·@õ†ãµïlÙ×ÚÏ+/®+x£ø‹O£¶GØ]1\è:&PÑ&æà4ÿ#b],¥Æñâg(Û énœ÷&ì¨J¡ðƒë}‰ XŸÈŽÆhT¤§öð–#åÊ|-ë¾gTµ%Å‚63l8¶Œ²kAJv‹¨WGüž“lÉ|-eÈ™•2‰‘ {ôÃÔ–íz8$›˜Tè'ΞyµT·_K³c?n`ä1lßßñâ¹ùGÐ>šÃšÐî@AH [ß]*g¸ƒÆ+CÚ®¨KRU…§~½„êt&mùÙUvmÇ ÐX«©G/E5tÐiqq¦PTh¥—¥Ñ‰ï „&Gßuß– E)‚ôte¤cY„)ÜŒ”ÀHÎ5½Ìš€Y½á~ X”Ûû­á ÛlûèÎW zÓŠÓŒv6Ñ3E—É1J_ÅÐLúÅ…¬¯Èý‚ÜF‹qÈEM@dÖÈÉ&“lëÁk¤T­Ôšy$ýgý¦rF žÄ@Kûçž\LýPµrèõÄ-¤ªñhmßã\çDÉbÛ4õ #h%Þ4Ú"é¨^‘#ë¾^à65š?$ÕBº%ê}w†n¸5ÉÈ=§´˜ºª å{‚ÀYøf©~  L!ÞÙ'. ðp§Îõ7£I»w¶6a«mȱßæ^¦,ÈØþΤŒ‡å®m-1cŽ]7íL³²=š(P°Ñ}LôÜZŠ§Ü:¸c–EH ‘éUƒb‘Ôf="LÍÈ/¬õ%0ÔÐŒd„¨Oê¿•Yõ›¸ f=ÂJ“aî9ä@ˆßŸ+ÇlH`Çü_³eÆ6G¾¨ò ð1Ÿb1Ó¢&EË -·ï)Üm¾š²Ïi”a æ[â58¡q"á‡(xA-wo€Ôz¥Á›Û+ë)å"oêiòePÞÛeäéœñ3Ë«+õ“SYg™eý¼¼Š|†M ØÔ‘sÙÔ#yR›­!¢ÂqxÍv°Á5sº ÒÉSÐÌ/RÁÅë)¹_´óy…wjNV—¸ É|Ã#3áÛê¥Tþ¹`¨¦3i$©o= j䈳@%¨Ì2Ítm^ SãCSLçê‘„\ÃÈ~ @ðÀ’cÄip¸¢”ýCFŽ†‘{BÐî`u‰8òXñ•n‹ã=S~ÉQ¤’¢;ÖÕ&§‹­z˜”D\æÌø®8u«Ìá‘ZÇ3ÊPL:L>"èx–!à ÆW¤I!Vê7)ö”’q‚•L™ûHÎôRqÅA"â'~Ê‚²ÖO†šê\ÿ=bRO°½“vHgFY’2^7žº]Dø@.IùïéN›àem¥÷³“÷hEfu"'þbåXªOæцìBåÙŸ†yõܧÉ~ڶĹù˜x}Öš}‚¤P<û„\¡2ãÿ¥z l„´tí¤‘Ñ- FMºlEÑ„õ¶KžúcÜ! º€JPCÚPÌ5_U–VF#£<`l(÷O·DéÂ"’ä•*}ÀA,z8€B’V`ò]Ï——:Ø) PÞ`?Ñù®Rý*œIÓM‘5ägûð‚˜9*€ãá&ú¢à‹ Ã÷^D÷H‘­~xø‹#†ŠÍŠ-²Ï?Æri±>”åÿ¼y¹Ð˜©PŒ+ãýü¹¼JŽSSǹãÆk(ö ͧSïÿ†/=õÛÖÑui~öÓÙ!J.¯žma¼Ô<6òéì@‚~…žš¸DÃ(uO·)CÅ=ÿ“Xn]sr1 tÆwAŒ)oÇï8¨%Ý&kš­bˆÇ¢(h’ÐŒºï¶ÎÛÿ JP§%Ëè˧x˜ÏI;ãŒW _kþU­XH¼@xm“ÍnÛ0„ï|Š½åbK@Ž 4M:@ëKOM®¤m)®ÀŸ¸zû.)Éq€ú¨•f¿«_ 1I; äûWR_þÿSê4  Ž„1ÁEÏ@±|Ÿ#B’IÌÓä-Ü39{ÑšÒƒRM[Ÿ)• œË Áð89LxÅàyꃶÜ]¡ “ç3ç¦PˆÄ…„x#×`g¯G2àèt˜å­Ÿ<"XŠ)Ð9'bË>Ï ýŽÐæZÇF»V¾¥z‚ÅNg—àåûÛËó·ããñ×ÛëãéÐÀ‰UG劻‚åP9-%h1™ÖÙ&rcØw ½mmQÕÅT‡Bæ±Zñysq=„¼8[¨/¶Œ"#‡€+äÛD©ç®\´O·ñɦ¤Ó‡ ç(1m¬¢RÎø\qŒ½z,«FýG‚¬:Ûâúhuz¿Ž$ÉÝï·¶êÜf-óu¬„ùþIf y€8Ç„£!ý‘âMº7{‹ïkˆÒ²jä€R…·°ÑîËÊ—" º©Ìk#ÎEmœÈI:ä%Ÿ¬Ï¶©­µ·%7ËþníˆloÖV/W uœÎ¤ýNQŒyéÿYõ F¦§´ïQîZÿ`R´õD¥ž¤¥iå Ë&è‹ëì·¢_]¢%n°¶Wš"¾öWiÈB ,h‘½RSàßâhüj÷ìI )Mñ¡m·Yó1kÕ? cGkƒ$xœëáXǺ!›iòIfgñ±6xœMR½nÛ0ÞùשêhȘÍ0ÚÚEQÐt3hé$]MòX’²¢·ïŠ$-ß÷OócÌ,ü©¹@à‚P2{„ˆÂ4ðç«üJ|¥[ÐÅ5ä±ï1â×æ<ö·½b^–¦ë8ôPÛ¹ª*c•ýK¹‡Õ&´ÀògÊ7`G¡d°g x{!R‰Ó&*l¿|1æ8£¡.ØÙHA1Ý Á' @aÑ<Ø vä– -ÿciç û(D¡7f;$Êphê 1Ì>Ä[¡øfHéÆŒÀØ$< 5ªÓc)ä‘»ÖÎ+ò5K? ¤Eëæ©(6Ú¼³©]Ý@7†F+« -ä(hb+ÖF-[„r30»3Ï€)qÊo±Vø1‰h(Ö©dæ®Ô˜®,à׺ _²kZ‡Ý o'ñR­Œ±I^8W?É*æ76|Âs–å­—ñYú‰þ+‚îšÛ¯ÕÚn^ˆËí&Å}< èdÅxo#4Ö¹%ÆDIì©Æ2F©Ílw›§‡¯5<t¶cÑ97½Üå<¢‚4æ34æÉöu±!Hrú^5íòXËù½*/wÑöøI,†6!l“¼[”W¬g§ÓËþiÿøýtÜW»Ó 2Ê›Éj0æ‰.ðŒ˜–7pÔRTR+Yd39©×S.Ì—wýýÝvÙDŸþ_ŠÖ(y¼'xU’Ýnƒ0 …ïó^¯[¸Ÿ4i“Zu7“PÕÄ…l!f±ÓŠ·ŸÓß5Á Ç9ç;˜“O>ö‡Ýæcýµ1oÏ˘& e„H‚ ƒÝèpð·Nv!èQà>É3½…Þ F‹Ê%ê)VQûltel½|æ¶2Æ£npîïE,Õk]?«oãÙ«€#&öUÈãÞƒýv í ‹­u*¼[€ªÊŒ®¨m³×Nõa®Cg(.a—Ûy ¦°”®‚S²Ó¤7ÁRéW¤ÁÆ>Û¹‚ýàÙÜ䌊#Øþ™ÑúìžIVMA_3²0”3…G‹ÆvNr©.Å£ëž#PƒÈÄ hJôð?¸u²<µ˜Ò¼šü™Æ\ <‚sÔå£XQŒW»%µ§JXã¼$˹5È6÷ªx¢$|i6ÊS 3F§ÿ† 8Z Þ›®÷Gè%4ø¥è_m)9Šæ] ÚâëpxœûÃreÃF~+}ýò̢̼ô‚L½äüÜÉO§– Ù²~xœÝUÛn1}î~Åd‰T`Óä„z ŠÔ$TJ•‡ªŠŒ=€Ë®M×Þªúïï CØ$}-°;žsÎÜ·NΦR™Eðòåc–ø¨—íüä ¾Áé{8Â;ø>»@Efä aè=ß®˜ŒQDQäŸLbd!çw  1lŽ˜0“úÝÂ*ÕÓÁõ ¶:{›"+㘾3¾ìúŒ. X´˜&0òsÔ:³«ÌæÄÌ@âˆZò0îh3Vûlà´ ·æƒHõ\«H¡ Ÿ¦¹‘Îéq&ƒ?A—fszC7œbQ¡W!.`-S©æ”4=aeë_øf®Úƒ L üõYN}Ð(·8H#h¾’Ú‡¸÷ÐÁ K¨„Ƈ]–¶¦ðƘکf©ðAµ±ß¨5‘WŒ£*,Ïæôóbí#¾d’//dJ¨F™q¬×û2ÎÒ ãP3÷[™)©Œ¥yú§v†0“ ](Ô¯êêKØææ6#ëÜ*`+|Êd,ÀðT®ò)/Ž‡Ç>ÕqÅR{?Td”BÊÒmø¤FÇÃÚ«4­äáÞ^ÉÅAþ¾·”rËŽ¸¤íÕî¬Y^ /þЇ® SÛ$§ÕµŸ¸ßáÿ,óñäú¾Ò"–Ö˶œÉRîPì˜ÔJ«Pi•*Õæ Ér°ŸZ…Ji‚—£>ÒÒi…QPíéâ÷öîþ²÷¸NVt!¹ý>OYbh@í¢žÒn~(DA0!ú+W/®üvVr#HZóÆRaÛtœTFW‘»€êmØ…¶¡¥{¥ hy´£áZ ´w14ƒHbó\84/FT‹…Á_†q`S§+xœ340031QðMÌNMËÌIeð^XîvýhoŸÖçÇÃÇ~xNy*zâ&¥ØÐØÀH/™á|ʽòë˪?ÞÏ` Ö”,[ŸwUMà m» “6ÝY^áx¦–ùÀ¹óº¦G¡jÒòóJ€*ÎÍ|˜Qßp1aÂV%o®×øGAU¤§•$å'¥-‹zõ¾&¹æõÔ…Kž<ÎXÞa[Óè…¡,ƒÁ~áÄéN¹;j?¹ÿ iGÞ£ ½g@•å$ƒÌÉás÷ôøû–ûyăÓ=›Ô×ßbìDRÁÀÅÙqXA…«MܦÓû&;š>Z“ŒP`hdQaf4gÍÙ«Ò¶¶<¯C–pïº"ų HCYÃÝ'ìå¹£cính=|ò÷ðFçíÌ@e榦 ¹‰)©%©É%@Ó”_íoXô9¬8ÿÜá)SZÞ3ùy CYÿ%zN_ØLÿu@Ú¦*‘>¨¥™n‰É©@£\JÝÔÚøòÄ’øÐ3çÕ#^>ôAU“Áà™jèòFcÒŽsxó3ß:˜ñ¡l ŠÿPXIËðÞk[Ñtó°N^¤O‰ž„°>\™{N~9ȺǷûÂ,_~»yù£M“vì÷ë5QEU“Á°äÆ\Æ]Ÿ (—\N\¤uæf¸oš7\_j1И…¢¬|]Ó4×iØ°`Ѧºúó (J2:ë%D'Æ5o×âz&¯¹ñÔUéïÙÀ²»µ¥xœµX[sÚ8~F¿âL“‡Ð hR¶ì„rIÜ!À`²ÙL·“¶ÀÚÛ#›ÐìÃþö=²|#…ž. Kç;7é|Gæ~#GpG¿³·YƒV\pg>âP‚‡pmwáÑ€Nm6Ÿ *^`æ ,cê{S&pfÄÉ¢Û®÷"øÜ àÄ(Bõì¼ 7®0]n™c2á»9úÕŒ`bqd€¿¸3ˆC‘aYAàùJÅîßÌü²)ܹë”TDEÉãÂŒð“$DZŒï΂¬/î ê€`&÷Á§Ë€:f3´pM>{QZpv)¦-`báKåÃÍàúÌ÷qí†9LPFË©Í èsƒ9>Š!Éßb&L#…Ú“îè‘;ÐsÑ ¸ëœã¸.à3ŽÏp‹Tž‚+”šÈ0¸žDÑ÷°i‚Ë›‘ÆkwBÕ–ëadêÃXWܶaÊ`é³ÙÒ>U P´Éíð~­Á#<´ÆãÖ`òøŠ–‹«ì™)e|áÙuc`‚:Á ú¯tÜuÇí[µ>k}mòˆq@O› ºº½áZ0j'Zû¾ßÃè~<êÝ2€Î¤kL©ØðY¸y˜R“”Û~’‚GÜp=µM°è3Ã7F?)xò÷ÞR¥Ú.–—Œ=É-úªÍÀqƒSðÑçOòØâ©]­Vå¹³,»b^±• ¿ò{ù(%Òy<ýÑëOw­/ÍjæQ4Ï‘cm8hŸd‹åì³6(’NWŸt´q³²ô»=íÏfÅv j¢OZ¸EM$“$l* µî^Íú.ê, 9êt?ßßšPšCixF’Ça•´Û8˜Ñíþ}§+§µ2Šôt9ì<áž<éÃûq»KÚ½~ëFN£ÓRE1ôô"”pë4hVqHñ—¸cs‡¡D¤…<Ž'½4imBúÚg]îeÝ] Ü>Ü[YBXL%9tÊlw…gKGªûÕ‡9cò.…ðó)Ds:œÚe#:iºÅg’’2¿å#0ðøÄŒš‘†TÁˆë#-Á¸Vm§xI‰£Õ—åhâ:,ƒ_^õâìì WÕðüC:¼ 1?ó£µÈ‚¨¬Ça)ŸÙUý²&}–£çë&ÑbU©ÂQMjWÉ\­ZM-ÓçWõº\¢?êÑRdع¨ž_ej #Î&!ÃÏ_0ïÇ'˜ÿFÙh–]<§xp…BXòH㌠/á¤:ü8— 8‹jŠ¤pÍ Ë…w_ûÜù'z*~{‡ T€0|H0@±dÒìu×>ÿ‡á™\3;³ÍZçÅ¡‹ØÜñIm”| ûŠ‰E`Ÿ–°sÓ;]/O(¹°µ`¡d{Ax˜boIÙ(»ØòWy±À–ý Ž?¥6 VŠA~’Ž¯8ºº‚a3ê𻑆Жϡçb•ÙS?OxR‹ðþ_dhdô€Îýä¾SžÒïkþ¿ÏX’’D~5Ôö&ûjÈÙoø ZÍ@¹ƒnÛ% cÇ&J^=g×Ô ÞŽÂ•0„HJ 8»¬×¡dÂÓ¤µx|¢è´XáŽa/Mö ò¡VKÛ‰•ï¼è\Ç$’ rNNµåK&<œ’ÈÁЄOs"‘~ó"/s"ýÜÞú¹lÆ„žògÃŽ“XË ûY.‹µ<1ª|0,nÔù€Ø×wTõ츟ø:æéF¦wÃk.ÿ‰º£Æ‰WûévúÞÂàØ{6 ¶vÔíZ*ۯͅkÛÁV>ƒƒ¡c¥bÓpŸoh}êÆCÖéýgw^Õõçí´æË)ÝLY:ñ©HF™¾}ïDn®]:¶žµJÚÄ!Õz÷B$ývoiÕd 8ì¬!Âvº"ÓC÷’Oçâ²["~yˆ¸˜3þþÚ“¸¯¸j{ûú¢zÝÒµý¥UWÛ[wmo¿£þµ—lÒ´ö—–j??¢öô¦ðkÂ}¿Æ·)O™ÌcŽIÔ2ÔßmÔ”£wõ¾É¿):C 'Ðéö»“.!‰ ·‘ÞÁ3—êÌÛY#&”ETYJV%pýÍ€Äÿ7¬É俇õé,•lR“L–@6Ë)j‰c\—IÙ0‰ügˆ"yÃŒº¾þ8»’5›¹³“„Vv‚CîI†‚ÍSô塦CæH8ç4nû©ßþVË[Á¡eUz¯•c\joE”–c\j;¥ÃrŒ©j‡ÏÅTµ[º¦¤CªÚ!ÑYLU;ö-¢³„¿ßTž’|Là;Ä#’è-WŽJ›ìÆ‚Ž*?û>Kþ¬AçŒdxœ»j²Ådƒ€ØbU1–É…’¢“¤x˜õ2¸^xê#xœÛbrØxƒ9ûf[v–Éï¸Ù6ïâffßüVȃ‹ ã4&xœRÏkÓ`¦®íú¥hV¶F?Ge-£Ñ¶]¡Ó®¿¬”Y̆‚›’ÅtùXLJâADðâñ½‹õ<ЛÂþ Þõ" u¨§ËðBª%Ää:ª >^“eˆ¥]èËÙ…Òœ‚FIx#_Aô]>oåËâ4J+ÁyåÜ?¨3E”ìû3Ó±cžÍåà ‡™Eø˜)3pô3sq 3àù9È3°¬ì%Ã%YU`_©ß‰6É«­!_›F%[ wë˜ë!gKü+OVxÏ_Jg }`W]œ÷餆ïV˜ô¥zÚjþ/hÕã:ƒ xœmRAkAFcfÒ¤±õ AÛ¡˜VwI¶%ȆjRMĦ¡Kµ6»“ìà&7K[A(xðàEä=(è­xUAÏþ /^¼ô8;›fkâißû¾7ï½ý¾÷={4wy‘lèi›ÙTÅ‹hŸ¹¬×i0bÒ=fÐ×™êYIÉVŽZ_#g ÑÎ¥ Ý“u\Ù©ßܨ•5›µNÞpÞD·ãmÇíꞦÀqt~D‡Í­2Ò9(¬äÙ ]ýÀ¤5<“>«Ól ´‹êP×k9ºkr¦ÏnëõAÙ†YPnW9ÅãÞgwlg_60Þ¼u—OÉæø4U64ÙYÂX·mÁçد¢¿õÀ!’Cþݘƒr6w}«YÛ¬/Éî{–Ku“ds¼!lÇ›3kÔ°²ð°lS½÷h£5ø×"þïþŽ—ÊXnT7ëë;*b½Ç'JOÝËUþrت0¤0ðÉ@Rçàšu²àÊ£‘Vð 3xµ˜PE‰P‘ÇD1>ÔÃæ ‹®Hd|«‰%*O{z—äkñE2ðIð1™8?¡g2 §§þüœ’f&PóÉL,€¡”,¥ÇwgÉ‹ÑáÜŠ?SëÞ¦.ÀÏän,ÐŽSWO)Á3ø“º_RJÔWCÐ#-ý~z9(ÁÓy¸–žv©i ž§g‡;*9‡GÉÑ0±pp   ‡GÊÁ0ñ+…7¢4p ‡q´íôxC~½Ë#ÛüŸò?~áh¸ˆÿJá%ÛæƒJxœ&Ùÿ±ª°f“gl“Ô:³>³N V“¥ ʳp Ý“Nãs"ºîxœÕXko9ý ¿âª+µÐ&<’ín”G%Jó@J²Q´ªªaÆ€ÛaŒlO(Úæ¿ï±=f€Ðl•T]>smß×9÷Úžêë"½¦@Õwk;….óBêó #?þˆÌ”¦˜Î%5•ü2íÔê»t*d ":cQÀ¤Qóžæc öÇ\чŒð;õ¤&1¤—<u¸ut¬õTíW«S)>3_«J ÅnDLW¥§¦&å|{Ê«nþ$±à“*2ʇ’1Rb¨gždû41ù^D’\iɱ†š¼(¨ Iðáã·ðÕ#ü4¶‰:/ÑÈ&à>Ãð·5¤Hè-RðûÐpžÍf•QW„UC§CUß=iAU‹Åßxä‡q³J\TÆïò¢Vd<Ò+2OŽŒ,#¼/'~‘ô•ñ‹b±Z¥.ZÀ†™ Ý¡=„ó§cÝ2ÿ’ÔÄ‘â£È¶½È•nÊÅŠD1Fö>iã[ÌèˆjÈÙéÜähÊ£ †•\Š[íÎU¿L…€…Þü‚ûR(æ‹(PTª—ÝSö%î”AÍ!íá÷Í^Ƙ±I‰µoGÐÊG\{!vÂÀ™(Óá!ñ²uƒ(¾–X”¾g­Ó3ŒÓC<´îüòz“ãDwÆyÉt,#çáAñ®¸Ä£ËX["5ÐYäí„Ù¶„A;Ãø6ð}ŽÍs(fH} f7@C߶԰Íßèp¡g+D‹îyhwE‚=;G 2ÑQ)OÐÞ1åaN`'r¤xøylœ []/„C3NiQ(üç• 16-¼Ë1Á´ZÉF†´û‹G«3=×UgÂK¸®Ž„N¶èÍHT·qAèöÈ‘¶ƒÿOî ™x¼f¢¤I,3ÂAÏ¥z|qfÈfl¤b£ø(Û¦ÜÈ:3² f…œ¸{·Ì÷,hKAc#±ÂS‡[#?ô Eµï8¹x¶”5µªjžÕbÓ¢z¿®Ê„«ÏÆÇuDt^®%bŠiž±µ¯{uúF%“U4‘Ú×ú‰ÝEêå$+YÈ“œ G¥`?óE`¥¶ÞŠk_kð&y¼Éÿçe/äfš3ñ»$YY6ð½º[FšµŒæ É"bd÷Xç=ܲöp-ééÍÎ2§CNv¸ã^&m›~6 2 ºwÒ±Ô>~0ìø{ïc~3^êÍHÎ_8“`óMKÂóÉùñî]\éb0çÖ¦}Ÿ²!ð«M~SÃ; G7 Ík“ËŽV‰Ñ—´k9µS6Ò…FžB”Ia“˜ZpZ×÷^Å—›—bÂìÜÈp›P4c¯¤yÓ…rü`XWªÏ½DXö.‰|CÚd;2¯ŽÒI¶:|'JuY™Jdé[‰õ÷W+ƒþ¦Álýl¼•e†ü‡‡Ôê]nA®; HBª.›ˆ[F33º=•B3_ƒ ÿ„ßxT¹ýxœ½Wmo9þÌþŠ¹ž"AÃ[^N:%¥:š†‰&ˆ¢è®w2¬œ{e{CQ•ÿ~ã—]–B’~èHÀŽÇã™gf­×¼EÉÌ0)š³3|¬ŒÙ2å Õ©À,( YÌ(0a¨J쯩$*n¢º5p!Óµbó…ê¬Çí£ã~œÀ©b)à#1U€7©’÷tfô±’s”jÞ¢‰Ÿó²¾LLCÂ0üN‰2 X1ÅÄ|È\| cR}Öjå®47®´Ñé”*µn¤¬åwá&¾rCÖx¢(-³"ŠžÁZf0#ÑŒ™6ŠM3ƒ> "n!ŠK³dÌ 8³˜8lÒ¥¶^Ú‡W70 ZãÚ*¨"†Ù”³ ØŒ M`XV¢4†inÑîíY‡ÆÁ!èI<‚ؼÖ2\Wð€YÀg8ÉO 6ë U°S%ÆF¢@¦vk Ý_'f³»¹MÐ1–‰³¾)F·@‹ïŠqS ™¦IÆëÁêÃmòñúfÝ«;¸íŽFÝ«ÉÝ9ê›…ÄUú@½5[• cpŠ³Æ‚‘O—£‹¸«û®?èOî0èõ'W—ã1ô®GÐ…aw4é_Ü º#ÞŒ†×ãË&À˜Zçh°ñ2î‰K"SC×%î0õ½å1,ÈŘQö€¾˜aküpnƒ9Â¥˜; „Ñß~Bš:hôû­a,áÕjÕœ‹¬)ռŽ ÝzÛü™ ÕŠ¢_™˜ñ,Æcµ‰™l.Þn‹8›îÈ)¬¬$,BÙRM±8Õ÷¦<ÍŒ†?O?C¾A»îÞðçh,¦ ´2ì÷º—•ãv;ŠZ. ܲëîã¡,uˆÏ™­žÁå{hr\F8_{]mUS? ­ïq{,ö§AÕÆÆi\· „g´}‹ÀÊàuŽ1<Àš3Cø­bHU%:CD"ì{Yõ¨¤ú¸Q—s‡~õ°r$ÿö<‡2IBèŒË ]\Ax´Ox¼OxRb¬!Øa¦'Õ•|—#…vAߢе1±TäÀHËJŠrJ4ÿ[(¾÷ ªVìÑ°à°zpË;8W«çç5üi5 _ì@Û!4˜ƒ7pŠß‡‡¬æV‹ ‡¼^F”Ä¥ra5Ÿ@57ßÓÂÎ_Üa]†ÆkÎGàsê÷…0ÐÎþ³‚–5?¸¾ÝUt¼Wø wà(Ä÷D•{ÍúÎÖZð?V ;ü°+xåd…—ב lIð&ÛÍѽ;¦èè"e€—ºfsán@Úàô|mdêQN‘ âój”O8Wå£Õ( a0aKªþ¯|0Ş΋¯°'$Áë˜ä¹¹ ¸qäã¥_™ áF­\ 2åaÀx1¥ç,ÕE–«ì÷r•YÍ›ô½¸Â(ÉËÕUÇëöý?7Cwˆ=å“tN–¸”éŠ*C¼ãµD ^ê±\:²¶¬ìÚ5+$t…·ÞLŠX×-­ ˜r"¾@³ÙÜÛ&fC…·­›`BŽ°Ù]VìVðxA’ðL/ Š—ÖSÑ%«¹]ÏÖç)Tkp`Û-_ñlä â¨Vˆóªj×öj¶‹ãö4wðá>_´÷}-ª¼ÔÙ÷%Ë¥ÞþÅõveÓÖ¡]`7 < eÁçð{ ª€Èfá·vÛ^YívÑ–Nê×%’,¸W€T€×@ê€ ‘¹Çí>êÓäuïz§]«`3;zG•oQ¥”5K • aV¸Þu¤€]Ï‹½'8žä,xÂ…T8Bnþ}…»ª…½¡ñª²ƒ8:°ƒÕ¦šžIæ~p·é·1+*ÀNºsézì䃓–cì£Àr Ÿ¤ZQYŽh¸l÷ûÄpŽÏÜøœ:Pá F#–Vø7ç v¦s¶·^m·FÞžÖv%–k»Ø*Eÿ9l¾×iïÓ DUž)ì…ÖsµÄò~+_¤¥ž{*QðvÒ[j¡Ó¢eœ9…T¯„sý1úÁScæ.Šdxœ’OKÃ0ÆÄ‚ñâm/Ýe2ÿì"z&¨7aˆŒ’·]X›Œ¼©"={~?‰g¿ikke3CžäyÞ_Þä³õºíô<è £Ááqzê[·È"¸“14Ÿ-Î÷vp©Ð ®P 4¤Uÿmgóúýã~# 0™ðy”P6=|²høCž½¶3ÈÀ+ÅD‘  Ê~W5–»ŠŠÑáZ‘Í· †]8+Z–gàÇ92©´Ød݇bù»"³,Ë\…Ãâf&„iàIë@,™&žÌû/ †[æP!u2W.]8+<œ¤ãÕMÊÏVT5¦zÈx ƒ5’Ï"N™ ±"dªRy·¢÷$ÉjCk2 m2¯´e°©ê¡YŸ–$NNèBËiË?Ÿð¥üy_ì~è’¶xœÝ]eƒäÆý~¿b‚²;74qœØ1ÆvÌŽÙÉ€t»ñÝîeoÏÇaffffffffffzU7#õìnIªž–4›õ}qmoO?Uu齆š½Ç¨~öîÙ{LKñcþÁiëk›­duÜÚ¯ÅÃÍxÒÝÐ\í$øÍö?8.÷g‡?8yýÀhu Ý^·º¹ÒÚ\‰[ÃýW†Ç­>o¬Ž·ÿÁÁõÍÕõµÖzÒ:}#Þ×:c¸qÐ;ÔZß?iwêIœ½íÂpT²±~ 7ö¯Æ­kãCèãu²ýö¯®¾þ¸QpÍÑöÌõ•µÖ…+«I²?ÞœanÙ=V¥ãöÚnâ!Œ1ÖÍÖ*ù`ΈW÷­l¶NhE­ãwnqÉêsÚbÖäðÚ¡Õ}ô¤Ç+Ã#O劫Z'ì¹qF,íVûúv»å]}¢Gƒ…‘þÿXþÕôg7Ù§¨|ú­T'e¨ÂøHkŸ²^"Ÿíþ‘NüÔ>ìOíøoØ¥ö£É¬=uŸÙƒY{ßo—èg‡qNQuU¨îTŒ*IŽô>ýIí“ÑÔÞæ…íÇÝY{dfÃY{2÷#£êª.Pœ¡ ƳÖüвÞc³w{{86FcôߦÅæÌ旌Àý¶T§x…½HŸ*²9T}úm¨Nõ¬G/µ×úp¤‘Ü6튧Õ/a—úÑgöˆ~Õ*)çHv)wI¹ÎUÜÁ>E5 T ºs±¯¤giÎœ›½ÎÔΣ/¶KýHŸ›ófr1¬3‹%=déõ)½nµ¯aésegùÌ.F€u–á­$} s°ÚaötæìBûpbÎc˜ãt˜sO_k£¬ÿ-Þbz1¬³=ë`ÓÚµ C¢;;´ŸÁb~1¬»°ãc§ßí¦ö¹`Û·öæìa;þœ=i§Á6gSû¶¹Å#¬s 2˜˜O'fÐÍž¾ KÛ^´‡¦wdÃ7½5n§Á¹3Œ°Îõ ƒAâ²RPIùZ²KýHŸ›„¿Âë¼ VÔ6@®ÓI”e¤RÄIh/õ/''ÁÇðIgodÂŽÑÜN;63ž1WbsnÃ’ÚKý‹ã‘aÉðIh]P„R(2•UÆSdÎ,b>)­ ¥å(‘kí»Q´ŸÂêËðIj]Tœ ¥©+ÙÑñº4§úÈxÊ Øs`ËðIk]ìÆ~à‰¹]œÁ\½¦£ K*f‹X†Obë®õ-8IsHkÏñ± ŸÔÖ%õ¥ ©¡€êvzüg€uió™PkÏñ± ŸôÖeÅ°\Ù]y+³ Ò[—Ï-±ûqÚ~n8ÒëXjïNòw˜eÞº¢„:˜w2ïùö,©½Ô¿,f¤·®´Ï„;0i+»è]=,f¤·®*†ÕéÍž&ÿ+|I‹R{©=¬.³ Ò[WÛÏ-m†Ô.lYÀb–AzënÅ°´Ã©0ãÁ"–bèµþŸvµºD2À ½›Ù¿Œ«^¹Õ¿µºÄ1@ ½›ïÿHö%ôQ °Bïö¨Äw“£öŠ§9CpRmy·,’V‘Þ¬Òúr¦@cØF  pBïVÅÙbœî:mYÒÖ[ŧ#ñáM&}n*â „Þ­‹÷êĉ2»Ù>LG9¿÷6IŸÂ¼OÄÕh¡ŸTD/À=Ïž¹;àpŽ³EØ¡w”Jb­]‹–ìZaƒŠÈø w´çþS•v±0CÅÜ*ë˜âl¡]O‘˜”vÇ"™[@dÝÆžÞ:Ø´qÌ{Ì- ±Žmž:ÈR3TÌ- ±ŽsJ±ôå:2·€ÂºíîóU*æX{ T]£µ)ߦã*§IÌKZÈAñÇ´¼¶±ä.ð1‰¹Lflµ½EôJÛYéfâq b¯c﫪#P±ü4CEÜ‚Øë.€J˜oþ8CUF‰¸‹À>q b¯çŽFä——8¸vaWÏûÄ- ˆ½¾Wø©âåØh_Â'5øŠ¸±”ÐWÊÌ+¡Õ§;TÄ- ˆ½°ØWM½¯${ª€Óò"ûl¡}Æ5øŠ¸±7¨•Ä•>—fD*æÐW·s¯Dšã}æÐWÇï>T² ˜[@_ÝÞýº…vÎݺEÀÜúê{%âJG9èg†Š¹ôÕ*X©øMƒŠ¹ôÕí­º½»=‘€¸EúêD÷úJk—8Šþ}·èA_·²´÷,Dv+<‘g*߇9¨ˆ[ô ¯Œ[Y®ø[Õýä "nу¾:ynáèp‚;Æ·èA_âÞW®ì¾"nу¾:Õ^_‰JD8D\á“)ª¸Eúê´åE¥_9 ‰[ô ¯N¯`^¥¼½P®ÓÏ«¸Eúʸ•ål>8ÊàúÌ·èA_·²š:̨Ý[ÉAÅÜúʸ”¥]Eqµêâ0™[@_U"…•°É,+lyÆÒí©½x'KÌ- ¯Œ+YÎÞªŽì™¹ô•q#+:rKãHç%"$N?u>×io ;ÌÌ- ¯Î)Ž@éb”´Ç!rsG?s è«sݯ1¹²ë³EDÜ¢}u^œ½rn·èC__Ÿ¯´+újû›c†Š¸Eúê‚ú|U}fˆ[ô¡¯.´÷•¸B&­¹ ëçq‹>ôÕEˢô«1q‹>ôÕÅîÙmƒ9¸Eúʸˆ¥­€àê™»;0q‹>ôÕ%î}%q‰sHÅ"[·èC_]Zì+WWíµ«¨ÒxrP·èC_]æ>µhÝe‹s è«Ë‹×-šÚAÕsös è«+Š×Ù]DUÛÕJÌ- ¯®,ÖW•ïGI± “Q1·€¾ºªØW®Î×jí¾bnA7°êÛ=¨þÔ〹ôU‰ûWËfß!‹ÌP¦êsjre¿M#€ÈZYÞD¨—Ž~›F•µZü.–¼%VmlMÆo3ŀ̺G‰L(gCÛ^yAÈ:ëšv|ÚßÊó“ ­ýŇ¥wÏ ßf–¥uÀ>ÆiʘšÍídQ+À‚ÔZ³‡µ„™ wÐZë5rÂÊ×q}.ÜBllÞ[6¿RXÄ2B¨­{î>–!ïfù\¸3„ÜÚ°‡%]³WÔÛ´²ç!±ŒzëPÞÒ2rÁ+zésáÎzk³øдXôU¦zy3Èì&,ñºZ,b!ôÖáJO-ÝŽ–Ï…;Cè­k›‡%-5ê/Äø\¸3„Þº®>XÚ½.}-Ÿ w†Ð[×»‡¥}ú†SXÄ2Bè­€UõÞ^ùý¢³ è­{-À2”WMµ×)õÛZ>î ¡·n4` •„Õg3ÓaÎ?eµ‘*çÀb–½uïú \Ö ·¸pg½u“WÛSvåõ‡Ð[¯®1e/w5|.ñ9„ÞzMñÜr<¢ú·™[Ì2 ·^[ ËÕ0ÕsȱŒôÖë2XÎl8ä÷¬›h*óÚíù/ä\¢ö),b#è­×g°úýéÓ<ò_jNE|{Ë”^¢ö),b#è­7T74©nÖÍdbR]Û§°ˆeŒ ·Þ¸ûŒç¬©ô@Å°Ä×wN‚g–½õc‰&΂m.”¬A;L±l–0žX5x‹k&Ð[ÿ,±µ ½o”véwÅ`–ÆÙcó·Àb–½õ/¯¸ûŠ·Ê]z‹YôÖ¿‹×à]±‚ a1Ë€ÞúÏG•e=´vXÌ2 ·þ[ß&k•)ã¦ã÷ü©h™½›xœÅWmOÛHþœüŠ9Nª’*ØN@'DÉ"‰œpwª¬½Ž÷jÖÖî:^ï¿ß¬_â$ÚrTµ„pv^wæyf×æû:¼‡9jáÞ!þ®ÙžG¥§Šq*!ˆ¨Âd<Ÿ.J!æÙÒyiªíÎâd)؉b>Ï °ª°Q¨ à±Ò„¢p¤Œ8~xx0æ<5b17£Ü…4OŒ·d•Y¯×eÜ‹RãJå³ØO¶–¸Ú\ <®¢-µ¥4Yìm/GŒ§¦D¦áP-­Ä;Õø w0Ó„i5\4ÇÉ=E€J”Ô~'‚‘Y„˜H]ô%pŠÀ„ØKß×’$ÆtѤ€6ÎݺTH§?ï1»ÓƒcØ11«"9Ë°v ûŒz¯c¡Þ^SO1ì«2}”_Ÿ?@ ëY•Óñ-d*›*{\U&‰Þ"ª´-ý@·†%j_]|Z×oÿ¶Òïш,³¨Ý¬š—±G" 8!¨.ÔGJP‚x5p‘b©BDáªDèM»øº8Ý/Vu ººO›g§Í×ó[ÁÍÆpö†ãvg8pTX(ÍrÐt)žÜP¯úlΉ´uuòl´oüm ,bæ?¹hèÍë³±••!ÛF³þOVÝÔLƒé#üÕù€ÕÙ8•Çhêeë.RÅÅFp FqA—µ²ÔñN™ÂãU×N¿åràõepŒnÖuÓKUÝóÇ=+‹C#I¿žZ¹“Õâçch4ò¾œœÀ~Þ¡–5hf>V¡Ò::*µV3wVmÞú€š+ßÝ Y[Ë6·‚BC=º³4(8¦ã¤\²9GÄë1Ù\ÙÎ ñ-úN¥áùR=ÇÐYI|Í,Of’uJ©‰ç†ŸJÓK¶t*ܼæå šÏy›ô„FI™–hîptæ^áÁeŸ÷íf Þ¡XñßçøäP’ÝÖjU©È©@rÂäí(Ξ9Óçhy}kXf»i”MÛìéœàüÈ©˜]a4CžØEE¢ç˜³ÿsö_ÉœoâËÌj·­¶õi´F;×ø>°[?åû?åx\¼ŒrÔ9Œ«Þbq¢Àçµµö‡ JHªÆú}$ÕF©JðÞ¨ž¼"”gKN‡ ôõƒ±L1Gyàç×Ð+*øUmn÷jÔëç…Ñw„&•Ð, ´Û®Àû„§÷=`§ÃéÄ÷÷väôrWØ××äòFžt]ì?Üɸßï¹æŽ2,¾ª@ßëªøi==Ñó’ „CÎ#øyF7?„©ò~Üýdc°–é@C_[*¸­¨ˆDÅï3žq3cæ‹rë4_.åKGMøåø‹Õ ·0;ð^-_¸Ñ¢ÿ¢¡ãç$ŠexœÛ«|M|C+k}yfQf^z@fp€§^†—rf^rNiJª‚RzjQIR~bQ X\__!$#UÁQ×E!9?¯ (—_¤PžŸ§^¢PTš§X¢›_”ªP’‘˜§`èëQ¥à `¬g\40%5-3/•hA¼£‹s|p€«« §‚¡¸¢È»8¢Ë£j7ráäDr1rää4ÜlÉ.ÌÈå’X’¨m«`=y"Çw²§¸=DÜ0VÁV!ÈtÊ,)V°æâRP@ò;HMP¸‚ÔL…â‚L˜Ž‚Ñæ.&F˜á“û8Ä&ßãVc344ºq2'¬¨!€ 1ªdu=’Õxíz ÙNMˆâ¢Ô’Ò¢< ¨ŒB´A¬‚‚¹¦BBh¾‚¡¦¦‚š‚A…±›Pw-0Î&Ë lÕ@²1h^’…(q29–_‡bpˆ DP±Ôä ‚¼B‰§Tè;kxœ•RM‹A……d“ö,«øA-‹ IŒ9ºf!*ˆ—e1‡Å“t¦kff»COO&‹,¹øæàßö¿èÏðÖtO&qľUwÕ{¯ß«ïG_áÛ—Ö³W…4RÅr”œ±©Â4Ííüâ==”eK–¿ZOËÇí‡àϘŒ¤Â.µ|z;™u»þáEyÓyPòöû¡V™©,„ WpõíìÚþé–wóƒcÏû úpŽliAiRk‹*“ZÁÚD‹lTþì|Üd–[:à«ë™â©Ž? ÐˬÉCÛ€œÆÜ_õ+¼ZA£(`Ÿ€A›1»Ð܈}Àª †NÌðl)ÕkžaÁ)»a¬V±ÒR42.´øß:öëOstÂÊããG0ðMåºód3'ñË—ä^÷ANÜÔ¾W2Dïf¤ Ø„ZœÔú)r—n+ˆw[ Fp‰z@­êñBÚ&@"2R„HrÜàÀSàwÜœ¿Ö1ûЦã\çèÆ—öXþ µpoÕáÇÝx3]øƒâé•nØ]ÅDö{”u-¡µT¶u¿#p>ÖÓìi±ÊÏ7XÇiϳÍwÎw•æ(è•&÷M-ÎæŒPîÄ:Èó8=qU|?M³ ›ÁdšÍÇË%&‹1’8ͦ£Õ,N‘¬Òd±‡À’¼8êÿî{ù2DnlANÈÚ¾ëÆGoYm] â#“<°Vœ¯Æ϶ÉZ«ÝKþt˜õNK(íú°¬ûÖŸa>ÂÇã1Ü©6ÔfÕ¯ Ý…>ç>ù $R=ë‚p1è㪖¸h]Óº`´ÍÆ€¹“NÔk#Ýû4.Ä‹9g¬ãiÆ‘ðÛK€Ÿì"ת°UzUé8Ç‚ñüÁoÈ?a™æ)ƒZxœ}‘ÁN1†Ã®Z&^á²¢½(X‘dD ñDÖݲ4Áîº[Tb 7¯Jö|>€GßÂÇ°5lˆ+¡Ét:ßü3m¦¯èsé´ÃŸ¹}ï.ßÛ•"V8˶i‚ð@ô(4ÙµxœÉCU áʳ'/Ū¸âùÀ¹=†…q}EÃ}é•ñË‚.óãÐäþ]Zü•Gk)"㨗j*÷ž:RNÓŒIº í+p£U”{ÓÊ’@dééhU_ž¨vô•~ÒŸG+`Œ3í2NQ³V5íN‹¢$l´êU‚ŠI~ILéÐf’W[„ÔÑV—Í ‚J1Ÿ}\;'h[½…ue:ÛïBe˜Þ pHWÒð€3”;¬‹cxë1Gþ€lÔ2l‡Чî:À4—`3>”‡L ³°7£¡IÝù ¥Í«oÉûþÔÿ{@c~ƒ3*>Jj÷©(Õ¬=ÆSù4ÏÉ7ïwxœUÁJÃ@†)-J×›âý/m)µ­µ‚^„ô Rì¡ç´™4 q'ìnR JžBÞ“àø¾†wŸÀ$Æ‚sØoögþŸÝùÜyëÖ@ †=;!sÇ?Íîõ±æXº„Ì}G) Ø+¦–Ž&¸ZƤ0ž^ÃDÒ:³€à±Æí(7›<wlY›N.Œ8\i¹ð-ó&úÝ^¬]V¸¤\Ò†•@úQ=Ož¶“·¯½üIY…Ñ,Æ'³UúZî–ú•œ“2Ôë÷ïJ\iü×á¬XJëg‡–j1–b$}©>¤im°Þüwª¥% !•E(Uy;ADMœ º·¤U¡m²Qˆ?K÷×öJöK•”<.9,¸…ð$ËO“Ú~ýQd;žøÆÂ9ã 0xœkæzÄ)«¯Å¥ ¥PœŸVPž«—aäqå—e¦¤*M”WØÿ‡Ù#3¯D¦Æ¹(5±$UA$V™§£b”%攦B˜E‰yé©š Ö\©%©Ey eù™)0½“3YTm‚Kò à†´q)g¦¥¤¦)ÄÇ'䔃0W-—rj^Jf±;‚ï€xœ…ÁJA †/‹Ðzöþ·»EW𨠈¨xjQ_`º›íîNÆÙŒ¶^ŠÏP_ÄGðU|3*^…9$ä›|I>o»›£éSô\Ë=;*ÊMW ˜( 9±%I`墫Š¢HÐeÐçh­HK •§`;¥! ¸Š%iè¨G×0˜[ÄÞºeú¯L6j:Îq=¿™Á[×øJ9oé…ãÞ“y 0µ”Z‹'³ Hc— lç©2NE¿äêªØí¯±hMGÐgk¬9jÎχѧºÕs'IGùûY–ݦ\2¢sY]CK9N‡´ Ol«¿;Ý {à_lûšíeu ÇíG6ú„ÝxYáxœ›ÂýŽkƒ1ëä(V ÆòÉE¬J4}.àxœ}OËJ1¥XÆ¥?pÀMÚŽˆ ÑU«PÔb.J:¹í†dH2Swƒ`>¥¿á·ø &­} hÈæžsÏã~±Ïû8bˆ0#ã&šÑM/ý|ÐK²FN*²˜j—FÃ[*¥g¡Õ¬¥u³UAü¼‹"å\áþzx~qzQ𬓤\)Êp§ÑC¢Ué÷µ j?(J‰À­3'…mÃR¶"JÉ‘¤2ï¬ô»^èÕÍÁbÞxß«â™Ø\À½92 ¥–b{nOñLÏ^Œt„–O¶R9„~mlç’gàjm°ß&OÄ6&ÕËŸ"Õˆ\‘ÿV(6™oý@sö_ÎJµS6—ªÏí²;–SASŒÇõëþÑ7ÈŸKµ¹xœÅýo»íçø¯à:`µ[Ç_qÚ }Íà—ı|ÁNÐEœïd[ëùäIwq½×þï#)ÝWì¤y]›m(~‰©æ‹ ¼€Ðþ|Ûº_âí±gD'‡hy+tƒ13iÿÂÈi„øXY4Ä3 O{a(BQ,ôÄóEa¾¡ù–¨Œxø±Œ=&áø°Û}½×º_E±VHAƒø9_x±7…¡Å‰ÇµXi9ÅPõkÐiµ;ð^é@Ep,¢Q ý9?ZžÈPÔ(_ jK©e4½¬¬Y/Ì›fs¡Õ¿„›F ÕÙˆDÜÔžYŒ…Ö«í…lÚYøâdÁ_JˆˆO´`Ô$^zZ¼•JÀ÷"Ð"&ÖrœÄÈCLŠi* sÈÉÊ‘ApBÒ³VQósC\ÒÇû³+8Æ î½ˆš.’q(}8‘¾ˆŒÅ"ˆ™¡aÆ)EšÛ'†FŽ!è+\‹¥Šê $â5QñvÒÕÍ:(íèT½˜$Ñ 4µ†ì¯ ôâ|vc³6r¡3w™©¹RDy—2 a, 1b’„uGÇÇÁåñùÕ%ôÎ>‡ÞpØ;»üøÇÇ3…Xq+,59_„‰£pÚ‹âÊàˆœ ŽqVï÷ÁÉàò# ýÁåÙÑhýó!ôà¢7¼\ô†pq5¼85F‚÷€£ñ}½O؈¨Ø@Äž MAÑô¹ ˜y¸µ´ðî <Ü‹Õ£mëÈy¡Š¦¬€LÃÈï`‘Šë`ïßȇх—Ëec% ¥§ÍÐÒ0ÍýŸº¡š•Ê_eä‡I€Ëš8ª1Û/ƒB9^ƒa@YƒyzJ°ø,oö¬¥¸†€J³‰ác>Ç dpR &2[ŸnNŽzí֗V»>>?="h§=:»~$p·>?»9ï÷ ¾W¦}8:ô/Ñn•ý«³„vÊЃ÷ÃÞ)‚»eð¡ïµ*ëÌÜŒŽ×™·˜Á¡`«7¿¯Or˜ƒu©æÐ ¾&ÈM]# ?[×ÃO¬F6éêfxâ–Áø1%¦CÌ#þªüQHÐönbËØÔA«%þõUhàm©Í…Ä`…DÆøRBa ófàÓÞ5"¾áÿ‹Á üÄQ§½Þ ‡#ŒŽÄÇ«±°ùRM§¡M Õ¡ÀL¸bг£g5XPSüˆ[Ü[œN{¾Ù }6Ã)E!ö(b ô),+²&H’ÆŠ`*~Þ¦¼»=MŒQÞ‡[%ƒLš{uSCsÐÆ:S˜b9'öü™M…á‰e–&0l"ôV§Ò×ÊLö¨Új­‚v äÏá-‘Lénï;³Õ¡]ƒ·›&î¶jlӇ涜û-·¥ˆb’ì`°AGx˜ÀTe bø6n`~$1©¤Y á'22ä|Àõ’ƒ×J[E¢[uÉ}ñ¸0qz¢íïÞA·†P 4æTYîý}DÀß÷bÿ-#É¢U‰Z¨V ¿„—/e±–ÀFƒäûM^ב|ɶkÖ~nÕýýwÐv€oü7u>r3˸c¹³|ÁÓ3FÿEHÙÕ^[|ï·b•–·vXgàŽnrO^$±KrG~ÈŸÄ}s®彎]ëÀç";€ ÅÝÁCê «œ;¼t˜™l7Y‡ü.o•‡}Óí¹ïºFj¿¢w¤°Ü=rŒ_`c¸¢£çÂ3ÖX„j Xˆ_æNÍ´F=Vs,ðå žf/'û´Ÿ`¨9bÒfd똟XÞeŒÊñ…†Žb˜8g¹×¹Ðì¹b\³åŠûƒ/=:¦k°È?u>û–Câ(l¬‡,Ý<9ÃÓ«Ìûž(˜¤ (0–ªážú?è¥;2¥\(#©ˆe\-p‹º®‡ƒ§uYê„Ñ“h&SMÊ^®z~±UªŽƒÙ Y-Ï'øÔ½F¥üA µ…g&,>èo»Kw»ðÍÆØGês“B¿ÀK¨fu |Í^]×Ö|ï"ÁC¯ÛØ.}qLs×8Ói~2~*÷s¼­»^~Þúzº?{´×óšÕ$¯³Ac¦¨.êœØ’âÿ¬+“+ŠÕöÂrfµœQW­šÁ(§UL³òåËu™OXjûJââ‰ûO%¡]øŽŒsaŒ7uh4VÒ[ï&”&Æà9]°]yà8™L0~j·:]ç8w¨Ž¡JCëàH¥ÿÖD ·¤ŒŽÒêìdã꼂¤Èª)¤¹MˆWK`M­ƒHƶ¤õ> t¥PqÓ»sc!ÇY‰£¤‡2Ùˆ:¯3\‹8ÑNà 0 ‚X)nÙñŒŠÛm*?(•­•þui™Œâ²²]z£N}³ýƺ'•Žõʽ- ÚîÙqÏ÷ìºç®{¾rÏ×¥`K \a=V gÉIùl3™½!ó}½ÝþNüÍjºÒ*¸L~Â,¯Ÿk'Ó´ÍQ¬_ÀE-I9âìêäÄ5©êQOX’Ç#ÁLøŸMÊÌ_ ZÍëKøú²Ï½ZÍÒvþºiU2²Ò²Søk:­fpã'›Á_÷Í  ”¸=nM °o6žÑ×5áiKg§«r—šMfEÜWü\ªßò¼Ï–Úno”Î&¹†ÊÇREþGàVÜX²¸¢À-3¶NÔ¥ĽC¿ç™Å¶ Bé-‡³Ýx4V¶[[¨Ä>µvðÄ¿ Kñ< 1QqS~¡ÕBèÐuøÙjdD»½etÙT w½»‘W?-òº •ÏÉQmFµ7¡:ŒêlBí0jgŠOAÜ#YCí2jwê£^mB½fÔëL0±É¯íQàq%$uO©Æºƒ;¿º¼¸º|d ¬L#Ãå46í6ûŸ-U[i²J—äߦ‘Eh[p›ª;»Ä0úØ|Tá ÛÝFFè¾Kü?·ÎÿÑ€ôÒƒ‹Á{›‘âç†î3S îPã[©ºTS󴱚ÌEó  0Cu"g~LL `¨€St³eì½ËRéÏtÅ9Ó*™ÎÒ[/¾H‹˜î°JT‰\z©ƒÇ/dÎlšk4 ­–( É0UOlÍ&MÄt37öj‹ ˆü4Ý6Æ^/uϳâ ÇcAˆ'‹ê½ Cäp²~Ë[q›.Ïö2 6èÚg¥’çȃŠŸ:)æê´HÄ÷Œ‹ÖšL’Kï#§¸Õ=„õ "Áùk#@fj)n‘ëÁ󀡉EäPNÜ‘²âÄÃÖ™:ÉjqTW²ìm ¯Éñs Ù—…­[Î(ûpñO—•¬„:ßÞ%’.*)ã{.2ŽRFXj"¬cÔ¡5»(ï=ÔŠ¢štëø‹Xk$ß$” Û‘@Õù3Þpô©…‰ÓÚ1”cMå5Ò$ï#ë1m"ÆÌ⩧_¦¬#Ï@ -ËÉ­&tiîr†>/:ÞAz!ƒ5Yán†¢<…ùŠXPTêe¼½‹]4.M˜¢í¿-mæ'W’€e «¡©ÞlôC æÐÍ‚V¹ü°NÓeÓU‹ËÒï>=üÂñÅ£ˆËÓûоã%_s‘nÎÖ—ÉWÙ¼Ú`Xððì(j#±ÿNDä‹}ƒüæœ2Ó{HZ*KÚýý-¾…tzz+úèéîJÒMÏ/( ¢>8Ýu×`ÃÏMßué×Ó왪²ÿ_¾ý1ãµ”UxœVÍoUWÛ4Ä›çSÁiUMc”Ú­ãØ©KC%v>,Ü&8 (E!¬w×ñŠõnØ]Ƕš`„„¸Áበ(ªÄ‘SPPïü8€Ê+ ‰yowí]c’ˆ=ì¾7ó›÷~ófÞÌ~¶rüøäËò¬c >W‘uYÝ[—£ÅyŽ ʪ ”E ÆAŒÇ©¤ ŠRÁ·™ÛZâ‚8–U‰M}¡x2»¤Ë Ù Kj÷(S[¹µ\S;íѦ3ëÙ…mKÚ`â_{ʪ`ÊšÚØœLu~¸&«&ä]«à[Ðf9ªÐuY€aêy4Ä"oò87à­™†P¨¢qüÝŸ1LÞ”&Å ¥lŸg£œV­P0$Üâ©&ÂÉ2ùÂï–àôf×'—ì1¹ÙØŽ@Y5ä=UA(ò:ãæž Ç¥@©–F$’1õê‡<÷E¯ ˜ rÇì{Âýð¢m<ñp˜ÙÒ‡*?ïþÞÅÊߊ|Ú³ÆÑüSø„¦É=àBç[}¬ü;Ç ;KÑϵ‡“xï~ iâæRò¬÷c¯(|^ÁtÜŒæ0`Z#í† ¦¼&ÉCÈ}pŸ ÍÀC³hE¯Y¹F’í 7}‰[x†KqŒ#]Áº?û|·LçH•é©y†,Q c­#ü-„žÙKŸŸöÆÞ踰Ú×2FëÖ¨íÝð0„‰fË$<Ë4 ?Ü9³Ûñ|íÑ=ܵ§Óöhv…üf-‘ÊžXªGqÈQ9§D™‘[¹ü¥º[¼C-Ãq·—R*pqL¹™8c¤\ž¦,Ü{·­ oïIá»S[õÛÒÞÓæ#gäÌœöÀq{ÝÊÛKkÌC3šLËœÑd>«cTgk{¨“»á"_?iwãΧBwÜŸ- "ï‹´ÙxÔˉð¡°Ë!©?ï‘ÆwEœ·ÎÍmŠÒÚ–`¦&q3ÑR°½ädÞ]Œûý¢4-vÇw£¢™¸8ŸT¬VéÝ°Z@g};Äó¸8^¾n*•Œ#°ô¨$6b% þž-zÝ›ÞÂíÍh§‹cJ¿=`\V.ISÇ%J¥uLºÏÐï²s¶Ç‚ÙÆLS-ßQ‘DØ)4rU$fH°k‚tš€ýe¥¼æT´óªºÁÁõãù3Ò8` }‘/ŽIíÊ »ÕëCøûÕ ?Zî +•÷'4#÷‡˜ß{S×NÃɉ—%@»u¢´NSZ%\9¥EÀ ÈÚŸzÓgÜaI½›ñ°=*ûÄ’Üñè¾ìKøÍq»í²g,exÝsgû‚Á&°f mÀ_{ 1Òù¼ŸÏ?ÿ®N3NÙ§ÈHy?x–qè=2µ×h«ßG¥³µb^  NœÝN{ínízåIò@-} ’(ÚÖ­\ûX‚­TɨôõÛ3LÂÚ寿^Ö „ö`8Fw¥U·°wMj„j\£ß|$kì$†Š} (w‚€ÓH]/@Où ÛRóaewƒžÑÎmäôÜ?y£¨Ñâ1„g¥¨H{+<2¬aõLa‡Šâ̜ª¿åXú\¶jÕbêN•m¬ôNœjfM8¼á¯ëabC>u™Iâ<‹(†v>ft·úëob.¿Šq²¶*wŒ9§M§¬T¶Ãƒ"_;Y¹NHÁáóRÅzB*NŽL9¨’G[•78,„§aí2¿€+«uÏ[S³ÈöåìX¬¼ÅAÅzm‹ôªÐ÷ü}ƒÕvĨío½õ"-“ýŠ¸°Œ}©(’&8îd¨­v¥øÑÐ7,4*ÑèB3ÍŠb.Ÿ!¥·íX¼½–ž Š% “9°_åV`š%ËeyÌ­$–‘–gg |F {§J}ØPì){‹X”¿Ñ„œ½K¼pý.Cò`Ù31Ç$žÉ,«öúSB™=Æœ*ó§ç™Êð53/è*þT:ÿ•’IüB­˜)äæKA†q<Ã+ö á¿Tì¿/%Íõ6•¬½”+<Åä¯=›ð–yê‰ÕÕ…9Ní´X'”Ø {»Te~ŠJËR/Û]øÀvâZ;ÄÙùT¸–sÌãseÿÂqÉsŸK7Ç>“õ‘N¬µFÞ×êiä€w7²bâ¤Ëü•Ÿvv)CE™ hÔóhpèÖ=¤G¶=æ‹°Ä}ÈKà\¼QX×én+.1Š¶¤1¿åÅ¡–öx»¤x.Þûb”G_Ë/5éBœuŠM*0ѽmz!šÖr3bU¶£ >ä¾’š!š@¿*^ Gx亰{©R•Øi£“짦´¿w£Yö÷°Ð1ã,xœ#ÜÿÀ2Ö*°‰³Ý4³· ê³ûN““¯ó¨˜$Ëâ2xœ»¦5WzƒËdw–œžnŽÎ®œœ Æ›™X?0NfçYÀê”Xœ™<ùÌä¼}“Uø'ˆœ¼€Wj²¯€›XjEIjQžBY~fŠ‚†VAfžo~Jªæä‰||™y% @±ôÔÇœÍÉøD&óó L¾Ä)<ùŸœTKJfzfIbNxQf P_PÑm~ÎÉ^ü<¨rN• ù ‚2ü@# 2ósò“³ƒSKÀz„ÓŠR 5¬¹œ3ù —Èä ~a¨EÅ©%‰).E™e@sÒuøàæ¥&¦hNâ—çz <h&Ä?ù`"A‰yé@!5!-¸Øš“c…Äõ¹ôõ<ó€6•”sÁ\ €òÄÌ·ü"¸ ÉBÝ“;„'VŸüFØŠ¤° (äÍf"Œ»T„Ôã,Exœ…PÁJ1=ô -ô"ôäe¤­ë¶jµE"í¡‚‚PEo%»™ívIÒZAØ_°ôìxô üÿȤ¡Ô—…÷’yoæMÞ·?ªY³Q$!õã3ÃÊw8ÓQHáº×*Ù¥¿¬ÄLù)*6榮E^#<I’`\£ŒHˆ+~eýySÆ—òÓ$Œìúív§Ûº‡Pp-…i!pjŽéÑ$HPÙé6ä|X/¾ø.]Ìß6?¿J[uŠãX¾¹|™qÃrw‘Uk‹æF-3{ ä0ŒÚõ"Epß®É݃óÊšª— ‘ÿª†ÈiO¤©ÍéTL 鎴 n YïV(¦™à+Ý=û^0Ëá¥È3Ñaì2ý™EÍ {T¶¶¬Ë6 ¥%ãã"“¹×Q¡'E¥È=ð}ß:­Ve­WœéÜ#ųÊw!¡H ˜vL:4!¯R¶”¶ò+zèðÈá±Ã¶Ã‡§;‹×êÎ)ßÕí"yxœ[É»^`Ã1¶äü¼â…ÉoX$'ßgáE⪸dä$V*€€D<3¯D!-EL—$–¤NžÈ*¬â\ZTœ_¤@¬B§œÌ¼l¼ 5‚SóRœóssóRЖæg¦ç¥¦($g$MVdÕ€9Ù“UÝÆ(æ’š†Ë%™y)©hF(¤$–$*D[Ä-S‹`Ñjk«ª0ª<˜7y«.Vñ7¬ºõñ¢üòb¨ ˜ŸœŸƒÂOÊ,)ÖáâDÒ€"]\R”„"b€,bˆÂ3‚ò,!\cITsLQ$Í`®odӾݻó´œxœÝ[ëSÛHÿŒÿŠ¾\Ubƒ…° 8»à„À He©Û­-YÛ³+K:¬Ýð¿_÷Ìhô´qR .uwxÝÓóëçŒæ:› ØÏq{ý½ÅËÝmgÛï";œrGX#[0·oÀø'mÓèí” Àÿ¸Lð‰ãq †!ž2íÈö<æ÷cm‡åèÑ+¦/§O˜Ï"î®ÿr÷œ)i’Z‡E lüïÌöødGÜŽyà M+˜šÞ†ipÏ;u&€«Ã,±—ÁØŒ1|Æ=;¿‡Yè±ócɦ¶"]q\b3ÝÂȵîy„Rã¦àq›xpŸ6sgŽ\ǹ?ÁÙ!‘w­W d`ÇprÚ>Ì#*—Oxl{#³ã„ŬÙ"ùDÈÉ)ò0‘xÆî‘z[à L">™ÆÐtZÐïövà]¹(ö)ó]D6ðiê·ùG J„ÆÜc¤jÚ'c³Ii%Ó8Å~§FÁ̉ŶÃgq'²E8bQ”X!ï(*ü¡÷‚ÿ Z´HÄP9Á8¾G]ïCÌ%^7qÄGóeˆÁöÝN¡j]>N4ìžÓÐÜf‚¤¤Æ»‹p΄À±wdb¶W󑇖vÎæ£í ¶CêS~”r$ÚèF '.!-¤ ŒãxdÉd1;éjšg‚Hói¢âq'!‘¶€LسãŒz»lÓdm’û4™2%Üï=GûFkFsϽ¶æ€óáãÙíéå‡[8º¸ƒG××G·w8?ž8Š¢¸‘ÕsdŽ›‹l?NpšÉû·×ÃS¤::>;?»½ÃÍÀÉÙíÅÛ›8¹¼†#¸:º¾=~8?º†«×W—7o·n˜t|ÍãqÜÇR‰¬Ëb›{"‡Ãª^ ´ž‹>‡ñ$bðႠÚÿÚºÕìl/ð'ƒ0Ê{6?ˆÛ€‘Ɇфïïï·'þ|;ˆ&Oñ×ßÔ¡:Æ?¹ïxs—±Ëƒíéëb—ÇGÔ—ë4bºŸ?Þž>Ëõd»Üð¿’¸lÌ}¶ø÷gonO7pV¡÷ôíÙ»ÓÛ x¹+ÉN1ÔI«§ ˆzŸ i4BسFhŠè6„Ag oz½n®ÝÇvÏ´on¯/ßbWßt]ß`sG ú\^ÛãÈž±Ñ|k‘Î(¯HTØ'´i™÷Ž³Ú” L R“ˆ(gš%ç1²¤¹Ì°oç e·ÐÛÿp×솭Æß €|¾„¦²Ÿ6ôZp€ûB]¿çNæ¾+ IýK‰ºKˆ~ ¢‡†ÁჀH¤o0»bìVaär‚V#”0sŠ¡²º'B"é°ÀR(–VCµ!kSYTƒžÌK4¦ ( ÓŽšÄJiUdÿš5ØæXö*(ºCVÈUø=|Z¬<‚Z¬5@l^ßøŒ. †QÖØ!QVPŠ‡·I4>Ç`¨‘Š%,NàÍg>Õ=€^ˆ‹ëF”õÄE’á¶<^€¿‹pv»]øL@ Ýsè.vNZ x¨ð§+þ´¿µ8Þ£$´@÷UqªÉ†óíY¡:”) ²´Ò4Uœ¶Âèw7E¹õ’xùh—±À цñèêIZ-–UŠ>hlð14 \2ú þ‹µZ˜ÏLpxˆŒPúoTij;My@_Ëã×7Aº¿é~é^ÿU õËÝÿG¬ûE¬küaRÕR!@¦Õ^0ãÌÎ4ã‰\×H¤z+ýI”ëOÂK;KL;)Dÿ·´ì«ßdi¼»A4³10*_!+òÈÆ‚ʈo·Ý¥Þ8ÁÃPA´½}8Ç€*;”wý}¸ÒDr<†Ì¥þܼüÀÓl*a‰rt¥\ÎÍÀ±£|©NiˆŠö4DgŠXà•9¯c㡵»¯­—ª~\'ïfàN¨ó‚afù3õjÉ­WíD”cW\§Ê­ÿMeÛù²-ñb¥œa O ˜ø„4ä#÷¹H+3./,‚eNðDfX‘YYâ¦vøMíñ›pA—;ÔÏBé&F׉„ËfB=I±±”ZÔ° ÷5v)¡¯µ1’¦º€Û¤$±¹ÈÚ”o”øKØc“S¥Xô»Âµ~Á ¿5ø©l&_(örCœ°øƉóé–Dá5‹ç‘:ô¢ ð ;rfü¿˜Ø† Æ\¡¯’ºâÆãÌĦ“<æDº´$>Xœù–RæÌõû‹öZØZ½­fHkû¤Wªï )ÜĘJìÈýu«í“¹ïÈýïNYóa€HH_yAŒçÑ/˜÷TÊ‘« †¶>~zx4Ñ9.Lé nTáOe5qé9ò|žè¬FuV‡tTýü™ É×¹ˆ­ú’l8I‡U¨o©J1R^!Š>ª“|iøŠ¨6Q_àPm¹_lÞê\†;x(<–g[jÏ@VÄ/O¤ÏœC]­ýwÑÓí^UOòâ!wU\¢¦À¦Èš,ŠÚÀúZs©Z{E½êhï’SÚ#T#N°P}¤Ý u'¦h¡éÍE5¸À£ÊO-÷ÁR¬Ñ4KŠc8ˆ2á¨KV žžd²ÔR6X‚… ÑÛOëec] ¤ÏŸËU´©V«‰e±@키È1Áþ×`¹IñXC“¬AŠ/ýõ(}Š4ò?Xⶪ¶änS‰æ’ËCIܺjÑ‚ôµ¯Tmz€Ï «ñŠˆ9'žÊAG`ÚT°Û ~n÷ú'èÛàyD&H³Î }Ýîç1Q¿ÇœRcMU´ÈS:'ÕTgs³#Ðöɘú©õ”&9HZŸÖÎÀ•Úö°žÐ\sLÌAš\Å8¤äÍe£¼„^aÙž}ó÷å<Éü4×’çIJ(m¹W–¨b¯õÈT§õÖŸÖ+‹\cÈeÅ žô‰€¬§¸«Âˆš¶7ÁäOgO•uõº5¾­6_áÝ“ßå%Œ‰êÔCÖ¢@¦Ã˜¤”³,Ù:{˜[å=ØŒ–{AÕ`š”áã•ú"s”³qo 5;Y×ØÒ0oV\²N~Þ*yÒyF ÇæÕ‹‹ÿs?¥Ê£1«Ñ%~òò±ñ“že™`¯4µE)ÇÜŒÉ| û³€‰¥·µ¥;”ÂsD†$Í"EÝekרC:ÕJ=¥”|»ˆÉ r«Dn­KžèÕš<ß^›Ü*‘[5äÅðX$gµÔZÄZXU8[ks~ÆçZÜj9¯…p…³µ6çeà×eæy<ª¶8Ášt¸‘}OŸuM$†Q&vÿ+˜úðoæûÌ•/¨ÞÛÅgôáFÀF/èÉ”¼¢´ñp ïs0 Ð#&ò:±÷c· WÜ àØûän—§¶ax?vw»?ÐÈÑŸj­—?Of6÷¶`FýÖ0ðÇ<òÕ3FCôíÉú Ò½I>¯by~Ä6´ý1„Tê={@Ò‡pN©½nê/,Äì#wãi«þ*¸©?ßмSFZ­­[¼Ö" ä/4#õ–‘¤“"y{9ÈÈÏ;t"6ïGò§»¤/o¼·Ôí¨LúêE ‚9­ÕÕ]u·‘½Úà hŸ”B`_kc“^™ÉîW0é—™ô¿‚ÉN™Iï+˜ì–™t÷¾œÉ&»_Îäe…IÿË™¼ª0é­b²,¬ˆüËDzvŸ{«ßtÂåˆ%~Uïð~Èœñ0?Ý],ÉY1꥜Š (÷cÁ£Ñ ‰gú#Òl¡>/Q‡ù²¤ó±Ë}c&ŸÚßLqê¿F/Š‰"e«›(#¢4ÏÂ{™Þ¯Ò tÖ NVq®†eµç6m_ccl¢¡Üd¡0w½3[,kî>&ðÒÄæxL§µ!ý*¼tÐf¨^A¨²áÉîK¥0ÍìÔSs™ÏåÞLW)U…*'ä¾f™€ëgi3ŽxS~~nÉÛs®&hs¥oŠuϦæ¡ðÌç1·=.XEòÙwWg—ß:ýh?'Où9'_²ù½ü†±¨z¸t*mÃå‡Û«·ÚJ‹/ˆ‡7=ù‚°ö™ûð¦¿|0ÿ¾2H“ e#'Mº^&Ra°¿|0]¯v0]¯°ÓÒKß“ô&àÞh…^^Tg»ù™ôn.U¿ˆéÿ·&“úSwé*ýµW鯷JÉ—Ì¿¦†é+·ò¸~!lè5VºëJÇø´pk>ï:¢Bxœ•“±NÃ0†`©„„#·‘MŠ‚1ˆe` ΑZ²ìÈvÃ[ Î<#̼o@»Ô … /ç»ü÷Ýù¿®¿lì†=‘,ŠOÌñÑÁø´ö›P"ŠJÒ|¬! }ˆÑðíã}%@£Qrx4›e)ÔWµ–r˜®`r½¶ø_‘ëTSÑJÊ5ˆYlò¼¶¹kÅ6š!3ÊSÊŠC³­­šq¨ˆ¤‚9³Ë§Zôp Ý0aÝ  ×QÙd‘­fâ>° 2µå©7ÉÍoƒô)¸Æ¢F#¸W"Þš.ÎM% JHZ˜ Y«|¯#¦Ò)Í‚3~‰Jià 5†R¬Ö`Gm³ +¸y‘Ò4¬Æb*,ˆœÅP¥HÐnC¯Ö«UÜHJ ºöÿTDõ‹€”¶¹–/\Þü·xÏ›u’©èÛç¥å®U.>N™ƒOpÅ·ª|ÿü]*áþ<ß—{årou¼;ì@%2VéÍ­:û1üO»»øL°}wÐm爃ÿ#IÕybºÚ"Z81ð$Ç ÕÔÇõŠ óŒ-ÏE¤•á˜zŒ½:hÖ\ràs=>nC+¨¥?gўݷo 6ªšì"ü(<Ò™¡ïnekó)r¹ï2.¼¨ß‡€—sÌ6øϺà¼hl4Ü”Àzç4 ˜ ì(åÑ7“Ïàže"vùÇTbŒ‡¯D–½5Q¢”ids’àEñõðÎÓˆ¶ ‡c‰P«J+.²’eŸó¾ÝnÜ°oxÏ]éÃÞ¸y€8âת!!£Ãß8¿=2I7Ñy çXÚjÎF{~LÒëa39:aç ‡¹ûU]Ix­_]=¡sn´ ¡¸e¢šç lþª­æO]Z+—2mƒË–$ú!Bà‹XÃßs…dA/•Mµ¼¨2ÏJÏУÀFL‚Ôgj+=‹ fZ>rZ~®{#îhpo%Åa°îq18žÅ>\ÇöS¢`‹^:ÌKyrwËòãæ™oð”‡n×gt¸NhÓûð®¤hBÇql­fbؘÏæøéƒq8¼^>s²óJƯgÏJߘ?ªÅUzÏtHï,¦uê¸íüÁŽi¤Âª9aÛêGÛ2f,þ Û†©{}q7yF—M7ßœŸÍÀØ/J¾õeûÏXü0—8#N7«“)_ÛÇ«×ÔrЫŠš<£&—v¨Á_6.ø…¥2žŒF×_B%¶öxšNÀ¬„sµ€`ÿé¸ô~¦ƒ»Z)ï ÿUVþÍçþ­•‰[>À6`­òðŒ¾÷Caƒ¿¤üŽÇʿǘi ãïxxœ»NÃ@E h¼tHô#¹I,0¶+^Bâ™Xâ%ljËòÎÆ#9³h½¤@ùDÉWð#ðKlP,DÇt÷êÎ3Ÿ_b±à‰ ñ$«IÙ°>pŽw1íšÒ"´zŠ ØáÄÈŽX¯Ò :®,i.²óÜÖ²êL?Î Mj ƒjIíï$QœÀH©ÆÈM«9tá øhÞ×|‰Š½«ìô2½Ïr/½uÝ[±>)·«¼"ËÏÓ›¼ €¸j:‰pÔZIìè…ïNz{]×îÚåg) zGÞoC¯ª?Ê‘¢¡Àg‹†a¦I‚›Ÿ–ÛÎþ»eͯž•ëtX[ÞËŠQ|‚á|9íxœ]Ž=NA … H‘©¡wºd…²ù« $4¢A)†ïŽ%âYyf£PÑpƒ= \„»p¼QPùYÏïóû4_Dz0PÀΙ)`]DØ»TyNI¥“Ó2oÕ§ÇþøËýØzƒ'zì ‡½Áøé"©Á®\È MÍ‹\ÆY¡ý 6Ô _?¯¿àTïcÿ®?~b3núãÁçшnî‡Ô£¸7÷¯îzCŠ†ñýèsD4’r‹ƒ—yŸ'‚ØTz¡r·ÅÃ\ï mžR&!Hµ€®IR¬^ôí®HäFϪ,]3Õ"ý)iã[ä üdÄñr¹ŒfºŒŒuò Âu®¢×̪N£ÑøEé$/SÜë|ªL”]í-iÏk[‹ÏÊïˆÎ“âô̼ß~S×­ì ®êbç«Oj¦¼È­ò2¤nŒ fì<°™nmÒ´Ô Ç+½]Ù&FØôՈاdaTº§%5‘eâŸ70©UKo5Þ[\‡Q¤uõ²y)ß´kOtD'ïZµ]4¾ÿÈÌPŠô¯ˆá½—x9xä äòP¦ýILmR¨˜Å `Íœ&QyDÝchìñÑÍ6#U d+*E’EÑëß>çLÚŽùÿœñŠfØÖ ì¶‰wÛWxÿûéê’º‡ Î2+}iõ‘µCºì"™;ù‚äÉ»µø¶ßâ2ÏŠOúÚhoMþƒïŠÝýÿ5®÷tý·¡]”iÅø¾M;µ‚ÜKU%Ù"„¨üEwfp'1 â ‚F«´óBƒº¼® ¡ÕÉ*Tù<ÚüB¥¡hjKº³ YfµJK4_Ýö¦` å«èÅì„æ^UÏ©iO`%5¡}ÌÍ Íѳ2.tù0'uÛ¼Wóƒ,Y•0TneJa¬ç3i•g¡Ãéõºd07´§'æ’y%]Î1œ¸:ë}ÑR¿ê7™àVcå¥Dþ‚$ôY1©Æ>Fg½«ÑBª=¾§E'¿UúY™„þOÓyËß ¼º¤—UÖbç¦}/Ä!d]?Ês`¬#æ¼ÁÉ»^®o®ï««î1þk$Ô…=d#¼ìƒg‚¦¢K:¦ (÷ºø>:R\F¾…Ô¯!j¶áñ¬iæžøaŒ‹pOÌžïñ0µq€û[”.þÒì|¬b‰gúΊ^.7”Éå`¯¸ª²U5q»žñs¹Ws¬ºÖ®dµ¶ݯ—?©1¬l]TCUøž´ÊäîÁxœ›+ÝÉiª¯Å¥ ¥Pé–˜œª—aäp:çç•åç(”d¤*€%<óJR‹Ò@¬¤üÄ¢”‰VÚ¬ºF†ÆS72On䞬Ï.ª•ZT”§™W¢508µ¤´@A#9?¯¸,^™ç”Xœ:¹†W /(¬º•xœÍWmoÚHþ~Å\Oª "@’êµ!á%AJÁr(:UÑb¯ñÞ¯µ»† {ùí7³¶Á¦i{•RõüìÙ™ÙÙç™™Ým¾©ÀˆÅ€¹¼ñß:ÊKD$Á•«˜¶9T…j0JDKÅB1µ_*0‡ Óñ‚+”8‚ì»2Þ*± TÝœ¶NNñç n¤òd·<ò¸Ò2B]RŸBƒ/p#AD†+C0uïØÐ æJÄW,¯i ÈCÀ4°>tÓ³éÉ9Ü8Ãq®äÊ(â®á¬³þ¦Î‰n åË<„ß~ø3e@ú¸ÂËÕÀ˜X¿k6c%Ç€tÃSr)£FÄMSåÇ¢™ZáKŠà“;"ç¾â´ô͆)þ¶2¯¸'´Qb‘ŒÁ ^ùYIOøÛÌ ŠÂÞ€8¯4EI7£{¸ãZãØ ,ÈN²… wb¤909‰I®t±µ¶ hš‰S0#dTŽ¢Ç5²ßp–Í–9Ê<×ì2C+Q c2­aø[™Ù[7žGc¿hsÇÆÈW G\ïF„!,8$šûIXÏ< >̇³Ûñý :£˜w&“ÎhöðÞfÄQ¾æ©7±ŠCÎqqŠEf‹kÈœ|èOº·hÕ¹Þ g´ŒÁp6êO§0O Ng2vïï:pî'ÎxÚoL9/`ðuÜ}K"ëqÃD¨ 8< õ£ =Øšc ¸\¬1V†Yo¿Êm™`¡Äâ¶e—#ÜÈT†>DÒÔAcð—”ȘǛͦ±Œ’†TËf˜ºÐÍ«­ªf¥RùYDn˜x8¯6žàê@’„»àKª¹«¿¬ÿªÑhæƒÍ•Ÿž=µ.NÎÁ«¢RÖ­Ð㾈ø‘3tºýÇ©Óï÷ŽÞ¶ìs8Øëÿ:µp•¦¥m£„á×[ÃmO˜ÓÒµ@u?†.1£‘*™¦ß®§eß/޼׋ׅµÞ>X¨â†`. ÅW‡üëœÕ*V`'ѱè¡~{ûÞWp`'h}„6t?ôç“ᬃ…±CÏeé)IiŠÔS@ŸÌ¡Z¹žÖᬆçˆ+μàüÈñö•\ýß#œÆ[Âü›Qžô;½Ï‚üíh¢…â&QQ‰‹rójÛKaXhsÚ‚íàN.ÕÊ¢èÁO"—Ú|q¶Ã/$SÞwƒÙft9J¨â摸f‡ÆHz|šŠÞDø^§óž¢ôeÍ„—©X1ýî`Ø‚-H¨ Çm Ûã+ü¸fØX‰ÒCüOàòÒ*‘Œ¬,'9á6õžNÎéÓÉp>TíÄÐnC«V¡~L–¯ÛPý‡ÜÖ¬3j¾û« Ù”)Ùû:.Oa#¯=Ï#•Êçh´eôCX$J!þwŸ#nWE~ªUKc™Å¼†ó%¤r )ä¦ %l¯áýQ³ Ã(Nlk¤@y:°ßufÔfœ2ÂãìM³y«ût¡¾€Q¥9ðÓ.9²B½ÞÜ–3#¸Ïw’0¼{QWFFÉðÖãòø­ßƒX¿µ„ãÄûb—òàÙ4øZå:÷×Å4I¼—®[œà™ºM(S¤8&úìËnÿÚߪðZ€_†‡x^ÞðÜ@XÛ9Þšpi8­Œ¸]~z*<ù…pÔ g˜™"=^úBiéЂÓ‘p!G4™]š°ÖËôJ‡'teïxosMÂÂp KI' ¼­ø\ñȤ÷:åÙKE,^˜ð’E§¤' ¹½/Ø™¬GÚDy~â•iå;û÷ÛºÓÔÚ÷]\’É3Îæ‹M6àó”îÈ_NØ}îTŸ0Ç u6GyŸ.žBk5lIå.@SV°§ìó!§ûs 6wÇ£:žùéÿq8ÎÒD}^·7œà.ÒzjµP눺—ƒ\áåçø*ëcúK¶×d;”l¯ÉÖöMM1ZLö8Œø†³ÅI×1-ÓÓ:-îPô´¶‹O4Ó“@Y3•íU`û™FT<$µliþ ¢yùµºxœÅVmoâ8þ\~ÅhOºƒ–#„nÛ½¾IlR$¶E@UU«ÕÉ$†øìÈv@¨Ûÿ~“ðÒ.×­NUÉ"žÌ<ž™gfo·D»”ˆv¬æµà›3 bAÀ!«ÈFœzbª´’N‘FŠé°eg|¡’…“ÈR9¨P£îïS[éPIºâ2äÚ(éTßæçFÂÐXÄœðŸ0mIi.´“žÈBˆ¬M̱ç%ZýÍkj¡V¸!¹õ43Ɉk½ø=^n…‡"ü–@|¬9'£ÆvÎ4?¦…J)`’4…±ZŒR ,1zJÓT…b¼(` N]ôYþ,×Sã¼t›öõ-u‘\¼ksÉ5‹©—ŽbPW\N a9‰‰xH£%¢³½t ‡èRáf…’Uâï5ÍoìiyZY%¥ œ2³.M*q¦¸¿ ˜Ùµum{6ÖA‡$d†©ÑE@D¼sÇ4â”>Nãj}ºë ¯nn‡Ô¼¾§»f¿ß¼ÞŸ@ßF oùŒçhbšÄàN3iˆ¡ùÒê_\Áªù¹Óí ï ]v†×­Á€.oúÔ¤^³?ì\Üv›}êÝö{7ƒVhÀs¼ÀøyÞljHlÈ-±ÙÈÃ=¨7ð6)b3Ž¸˜ÁWFêÿÕÜp,Vr’%`•aøÛ“T¶J~ŸºF ÏçóÚD¦5¥'^œcïüMÊ+•~2ˆÓǮ܉Î7¤Fî7üON¶~(¦FôÂ…ä;½N»{s÷×çæ µsptT*‹ú P.–b>©Ó×ÃotFD‡U¢#¬OXX±þ G:yfâ¯L|¨û0ó¡îïcùXõ-&õ)u BXΧø̤Tò6FŸŸn6ÅÒ¬PÌD˜‚ÁnëÏ7K÷óÄÏ”—>`~*iì2Œ*­·Ž“Í=*AØE¥ôP¢L´ “.‹ ’1•ËR½Bß¿S¾;§F¥‚굩–Ð,üZ1ÛÓÁ¦"4½Ý]/Sw@ggÐ.¹R^{–ì0yŒfÚÐô·hú+Íß5ò™D›Lî´À”-oTí­Ô¿:_¿U7òÓǧÜvùä»S‡ŽUŒd‰Ø{ð ?^`x £$r†þÜ'ÜfÔfÉü_YsC´, *"8EªOhoOäh¯áTl!ô £}þ”ÒýœNáèt%Q#§pm¹¹ŒkW°2®ùU#e.xæ3_ʯïæ—Zò‚_Îh}{‹üÌÌÿofW5äÞ')¬`øÐÉîéü³’~ExS>ßN‰†æü7í>,þ„e¢ŠÁMs¦s^òK°x·{eÝ•…6ÑCÆÓFãã&ªç)|"ö·‹+ñ#²÷V7༲xœµVYoÛF~6Å  ɇ(»jø Ø²­D–p"VË!¹ ½K쮬iúÛ;»¤ÚŠóâ9>Î|sPán»‹š?¡ûK-QC¬4Ø¡×Áµ0Vð¯À•´Zeé•ôê!3ùµ^À@8ï •/´HR 5^‡£æá\+‘õ ʵQ’Ì^çp‘Sa ]s¦-¨æB ™ „Ï'µ67'a˜kõ¹5H«DɆDêeô¹ /º!/MÇÈÇŒŠíœi<…šg4FÂX-¦3K1X`2 ‰º‰xQÂxæ’÷ŒYÔÆEé®{è¢1¤»F‰še0˜M3Á¡+8JƒÀL ’;¹I1‚éÂû^¹€Fe@p¥èÌ %÷é5P =ÃåÛJ y(̳.*gî\ëþ2f×Þíl¬“Ž@­ªœ²K ‘ò‹,ƒ)ÂÌ`<ËöK²‡»Îø¦?C«ww­á°Õߟ’½Miñ 4ñg‚À)9ͤ]P%Èm{xqC^­÷ng|ïҸꌩOGpÕB ­á¸s1鶆0˜ ýQ»0BÜàà׼ǾˆDl„–‰ÌlðpO¥7mAÊ‘Z€#ÍLŒ$_ü²¶Õ:Ë”L<+†¥I'©ì> þÌ52õñ|>o$rÖP: ³„ï¯9Uaü&$Ïf½vSúnCü¦Xé’E ‰;·­¿>S>è߈ÿ£ãµÒ)†ë›ñNó[ó°"¼ô¨"½ìßõœômE:ì8áqE8SÁI|جŠÛÝö…“UåïÄÛª¬ådÇÍ Â.™e`ëêïJ™ i|G ãéÆ š‚· Ñ Èf䟂ïÐÀ‘H?8)÷!òçŒÎpü yÓÄrز|‚¿ŸñúiÃÕ¡)׳sh:]úV5hg9Ui¹¾ý:¼ÐHãM­*qî—ûÒÛA¡Ž§Í@»2Ñìa•;­Ë_¯Åž6›Kâi°PsÒ‚²5…îÎX÷‹jÉŸÃ3ªê#MØZÂÁ¡#ÖÌ®|?5Ü‹ˆ¾¨(Îv^Øð—l²Â¦,2E"–ewZëµÌgÑíßÕ=BUÉ7•¤%æoU´ò¢¥9˜Œ Ç•Šÿ\Up×é•š`ÅÃ*ܽ=׈«~¡Îˆž¶Ë¥¢V1´è kÜ÷®\n› þ¿Æ¨ Ñ“ðŠYæR>t,›a9à% ¶ÎÛ®òsøýYYݼ[ c•8ºÌÒ8€y*èšk4(­ñ´ÄB SaŸ—ÞÁ¼+JyC›°ìÌØâVp­ Ò^‰ Ô·õƦ÷º}~âìb[Õp–|”ÀÞ Äu­²tì©9$h}:¿YøÓ˜âå„pù¹íº,°Ì÷(Å•F%€ »×¢^6æ\»£X]¥\™ÁHCÙE µI‡pö[³-Xýô)œUÿj^ºŸÝúƧ€.àxœ{ȵŒ{ÃS5åÌ´”Ô4…øøä‚œÒbæJ­(I-ÊSPrVR¨æRNÍKÉL›ü˜¥N– ‹ÚZ¨.˜§(§Oxœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°Húib î©E%Iù‰E) ÿY b~.+³9¿#yۆÉÒŒÒ!†Ó|³SÓ2sRNN«=²Ÿ'úá‘ŽŽn“í»$˜ÿVŠ@Ì ÈtKLNeþæÎòô@ÕOå:žÏ5¾ÛÛ_]…)pÏÉ/gxŸå*^óÞ™ô;‡ª&9'? ³‚¹‚Ý×¼¨9ö®ÝŠ3aß·Êì2¨’”ÔœÄÊÔâ 2Ÿîœ%,S7'íPNÙ÷9^"gî ˜²bCc?¾|ÄZäûñG²á¼Ï{¥­È_„ªÉHMLI-ÒË`hú®|ùpÚ¼““ýØ5¶½µ>¤«ùëTMfq‘n~q2РEï¬önû·cîÝ’ ë,çø¿¡¨`õ±u'§ü¹__î/‘óìz¬fï´½VP9É)º‰)‰iE¥™ w»ŸÜ¹)¦FšaAÎûž@Gñ8¯¿Ž Tò‡)¸Í÷|W:ùAÍí”_ä>Âä—ä—§‚,|Éøü×Úƒùþ†ÛEý±z)¾ÿ€TU^*(6 'ôuñý~úŸOdº!ó¬š+goYÃüžŸí“ ²i2¿ZvŒ—EEÁÞÆÊMNýšºæ«‚ò\ ‚Æœf¥Çá·õÃ\»¤¯dÌZ&_zÌ’ô ÊVü^½TCöÑðƒ'þlæ9·hþu¹PíE%Æ@Âò¦úxþ-ûâaÕ ·Â¦O¤þ‡*)N-ÊLÌ FPݼ‡R‡&LîÙ¾p!CvŠá¼lù­_–£¨ƒF:oîÒ=¥:æñ)Wjý¿èÕ¯ ×ueù@%«¤6¹jZ ©zíûÆaõ3œI®¦$?­$ì1Áïk¹ZƒK”·M)J]ù-á ÷ô`$E!ùy©@Uúnv³NŠ> Ü$Qo|«Wò.+LUA*8¹œ6'Mt·dßh|àYeú.N‹W·àJ2ƒ¡ª˜8>,Ú=wÙ«ÇÌ·ÚµœtõrâTUyZ&PAö¶Nõ·W¬ÿ„o­ºûgÆüÆ-³ üX xœ340031Q0/NMÏMÍ+)ÖKfhŸþdÒŸðæðoÙÌ“÷è|-›írú¶!D™obvjZfN*Ci¦š`(¯×Ƈ%o,+b[kÊU“TZR’Ÿ2(¾¬ÌQñà…‰%6$M~ê²gFÔv¨¢ôÔ¢’¤üÄ¢ ²u6ªø¿¯gÍš§±÷qð^Ã-…s¡ÊŠR“óÁj o¶<[½ÞçéÞ¶Þ¹W×Ö«òuBÕ”¤æ¤%–”¥F¶.T:oå¾²_hÏÜk"Þoà*,ËÏ)ÉM-I-*;rIÐ^lù™Ü½¯ŒÚ…–-úý9âLY)LÑ4ç5/ •Å|[0áká~g e©·_}r}´»‘xœµW[sÓ8~ŽÅÙ0Û&%iœ´IaÛ2Ó-…²[hÊîC‡é(¶’hpl¤:Ðÿ¾Ÿ.vœ à‰ZùÜun:îì´GGŠOf<Õj?úïµwb–'œ4Wšr™M$›‘ÎHqNbL NK)–â'FGmÏMWÏ w,Tž°{š+‘NHO9½¾º&–Æ”­!˜'ŠS–ZÜ[¦ò—òž†ÜFÀy–ßK1™jjDMê…Ýz™É —<¹TY ²Ÿó@P'Í!w\^^ß\ß]žÿ H£ds:Y‰ƒ ÅþôY¬t,2[‚´˜ñUH¤ïó5ÒFœÖ±Þ§wÞ3–ç@y/P»ÍÚm³ûJæùj¶c»­AA:Ù åvm’Æí6QîÞé¸à EJ¯½ú@i¦ED&Åb"´óíàÒ¢£u»X!ÖVëЈ ã*g‘Rt{ä9-¢>Ö!8 œI¡å,µFYŠ¬«HxîL¸…”à‹1˜Á8QL„CÂ%{>ïFehPMP=PC¶j€±$œ”ÞdûA@ÖˆµŸ# 2\ÂÊŸAv—œU’®EöÖņäÁ±Ýyè9WezdÙ­ +:׬=Ú~NÇùd‹µ%òéºØ*ç™?ÊVƒFKkÃáy¾â„5÷ÅÛ9òb¹fЋ¥Aá†F K?&ÛÈf¾oT`_;£I’XBŸ˜l„&µ˜ŠhJBÑB¢kñÔtÀѽíY3†ì)#úš 9‹i,³YA¤§¤§LÓ<º©…{­ût&Žr,¤ÒFÆ€¢)“,ÒèqÄ$G å1rÔ@ >º}òÁÖ‹kêŠÄ6ï›)lÆ/›Ëª »Šä<5åÍ¥D@ùBèéÆö ¥@"X*%L=¢ì’,Ë[”3i»éç^{ÑçqHFSžÄ 7R ¬îiêÞÁû?­u¯7ñá«»›Ë·gÏ©±â•&Ú-»Y«h,&,X ùnQl1ÿ"ŽM[ÈÅ¥JA~Øtq&©q|ÜÄÖHô+.¤c§€NÐ~ŽéñcûÖ´”ŽÞsúOñvBG–Ë¿7=Ç— ƒRgó<ç²<ÝZéŒiµÎÞ^ÇÜÌFLÏNi7ÜmÒÎhéoOw›M“þÖAÜy!3¦¶¡5ì\‘p¶"á…—pÉ?oðŸíÒcÜ…*¾ 7Ôð€óO[zAÍ;øt½¹;L"æQ6Ëkö”,ù5ÈKÏ¡ *bÖ´Ñ´÷ÿ¿Êé/2ï5´‹%CÌ?½ 们aAh4=e-*®ç¹­ÁW©0Å#·uò¦žMÍàž“ºÒ!~Y=|ÊDìl¢†Ù/ë@´p}Ú”.îÃwŽÌ&º¹.Êë»Ì{áÓU”‰*|jÓ·b$¼³Ìeû:‹7p×ïo†ïo ÁCà.mçê­:ßÓY„¨ÔHKU­ê$CFù}YU-ª» ¨»çâÆÆ蜞j_±$>{ºV-ñ×ã ®ŠûÈIÍtaz¯:í9ÿ™‹è#:ñ<Õq¶HÍÜìfm•!3²1ÃÎafÈ9¥§ö±º6œbê®ðŠk1*G@õ¸z¢ßÃA\GÄ‹´õ†e"GÔFµÚÇB~Ä5«R0ߎ1ASe‚Þn‹‚%õnïà°?ð‚*]µâM'öæ}1*5¦9OÙ„K[fo2âŸ!9Å䈯ƒ”ó÷%5Þ@d–ršà %ý­ùk+¬°¨ZdöÂÞ›q¥€A¼¼ëÆ0pĹâiÄFnFÇçÔØïFa8òn^^O•Û§|(ÁXÒðjšèƇé eºÅÂ*[ƒµ¤èIñlc‹ [ômIšúš–n¿L½- Öë,½þ÷ û±\-èËlúYaG)›œWÜuù1¦®ŸˆŸ÷ͺ¢i(ì·#F´JÂ#óÌhÏ :æÛôN[¯`ëRÊ]xÎOËTö¡<µ¬(ª÷WW뢎Qs£JwjÙŠ!Æ ïÅ~K0àX§4#–8䎑Rpmmn½¸Xh-ºýLÏ}‹ýL¤ÅVñ¨UX´Ìwü‘ð‡LMv#Gþ”õA˜°„xœµV[â6~ÿŠÓ…¨†0ÌhU‰ÎV á2©²€¸h„Vó`œq×Ø‘c@¼ô·÷8ÌTêv·Ò6àsû|¾Ï—¤Æjð‰Á­TØeµ›“´RïfZð\ !4ûŒ;¾QJn,·gØ .E˜ó<Û %ÏLRmê\–wÛíÌš?P¸ÆîÚª„ÈÛ¿ÿÃ1b¬6öWã›ÐÚAkzÇ*súÀÂ;!X4 ãÕ`èÝQûÛ¶2‚«¶ÔBdá(î­7Šò&´ž9íˆzãRèR+©èîȱxp­iÅoé„R(Žú ¯ÕëMV x$+s©EžÐhO,`Q®iIBûýL;Û¥þØ 2'Z(ÚǾƒ­"c‹9ét“É1Ís(Gb´£Q ›ö§œzƒr»ø˜&cýh²xë$©Ö%‡uìV؆Ý|D‘øLL¾¼Uo„!©k þª,þ¢o³z=+¸Î®ó]póä„ÄJÿÄX‚½}I=}”´Ö¥ ¦0™.a0Œ‡Ë!û *}^ÎãE†>xœuSÍjÛ@†ÖV½Ši)!?”Sh}°›Ÿ‹³§8$) N ‰-ô¢®VDXñI‰1|Í%PPÏy‡BÏ™]ý¸Pv¾™ù<žÕ÷éiáùÝÏÛ‡»?µé( ;Â¥ØÍÁÆfG0|¾ÛŒ™Š‹ÄTuýr|QäTH.¥ôaÄ8á “XŸm•ˆÊ¸H ζç{Ó ¾ SÈE¤Ä°ÂÉäŸá*HOð]D5’˶/#o2 ÎJdzÑ©ôü"15ìÓ†~²±µŽw\Ó+©ñ‰Ëxæzñyº¾•ýªo³ÙŽðR÷t¿·w¼ß|@AŠså6]xÞÜ=ürÖjº7np‘­¦mÇÒ‹¢IΠ˶émrýR³ßõµºFŽµ<¯50½.6-¡»T‘W5AÞ\5ò‚É "’^åiŵd´†FÐj€4UÂòKŒP\1z‘\Ô-2¤93œOzrFæk„óÁœÁAó1b|ÂTĈ·0桺EŽñWàŽVÁF -£@ŽþÞA¿÷ù¬E°¸ ´@5¹ØýŸææèpàº/ à:Æ‚<÷"­“c ¼É©ˆÒ(à¼-ŒÊKÏ"«’m±ô0 +0íJZ2õÄW˜ùL‡ÜÏÒD#hÙ)mšk©Ùv^(°*E²¤Žµš][GÙ£uŸ½n|ú CŸQå#ƒxœMQ?/A„u³œJA!ž(DaÍ&¢ A#:…±÷ÜMìά™w6׸N¥ŒÏ –ø*•O T{3›ˆfޟߟ÷2ï}écñåkÒO>„Ž6³BÜâèjÄDzos¥øUÎf…8O…¨Õ•,[}´ti¤ $ŽaÑš*˜Hí­É ¿“lûçd}¼ dž0OWÅI‰Ò!ôŒ^#h¤#„‘Z U!\Ž+©ÊRé>pm,C.YYË,Þ y_h  HÝGÇC¡’×’ 4@¶'iûH.ƒ#b¥;PšP“2ZŽ$8bkPÄ…r¼È¤ ¥6 «¯£«amix<(LU«ƒI݃Êð*5šš†×f5jÖµ<=bç,K2Ø88ÜðoÉîlüö\ÄàW:ËSmv:½Ði¼E zè@Ķ[ôïÅ}·½CÞÞÃov!i;4ÿw›\ü¥aÆ¿*x Ò}ÿ“î½~Îù‹܉VœHî)æFæ• Í-…™Z 7“Æ*áçâ{,Å êÁvVk"—Ôä;Ü6©Éù ÑÎ9©‰y±\œ“%xê%ÿ”Ì»ˆxœ­Uioã6ýýŠÁöCåbåØÈ…zsð&†A›ŒDYldR ©FÿÞGŠŽ“¢Ýöà Al‘s¼yofœ~Œè#=4Ö*iºÙ!Þ¶FœådKNW\ÛÅtþj@,+IINKQUÄ2KÌ“8JUQ8o+æóŠ“Y ÓBi: \×\Z\œX¹¤gª^i1/-ÅY‡öw÷öwð”Ε¤k.s®’]:®µú“gÖü’k5ljäö!¾Íã°LJa¨ÀÏšiKª@‰ZÈùPxRJkks˜¦k(Ý ”T3S?p­W;µH[/| eâYrÁ ÍAŽ*ì’i~H+ÕPþ4Ï…±Z€h`«2OAÝBºUƒãÆqâµ±\/ŒCé…º™Ò€ƒ»+.¹f ›‡Jd4—†;•jwbJ5×ï¥4€èR!³BÉ„¸À½¦'¨€wȲ…˜ )âÄ̺J4©Ú¹vE³ïî?³±):'!}ôRÕ¨®DDÔë»ìScxÑTIˆ{šõ'×·Ó õnîhÖz7“»#ØÛRá–?ñ6šXÔ•@p§™´+Ô‚|¹]ë÷¹?èOîP ]ö'7ã1]ÞŽ¨GÃÞhÒ?›z#NGÃÛñE—hÌ8bü7ï…ÄæÜ2Q™7<ÜAz´UN%{âhŒ‹'`e”a4þ·¶!«”œ{^Þ~ARÙ„ p»F /—Ëî\6]¥çiÕÆ0éi÷[TEß ™UMŽ´ÆæBuËÓ7G¯q¥)õ ÎŠ¬¢GÎk²še®~×R~cD»£â¹¡_ïé„ži7ñôBG>€Á}öKê¯[N&Q€Évqù©n\ï'îبÄQ+©¨DÝö²¸™s¾K†Æsº9öƒ?¡ +nwæ*Šž”Èßd¤Ø¡k-;ÑsD.Gœ‹¹°¬òË4—trB×ý«ëÎ Ôrƒ+rjn-]EŠmýîé÷Ú£#‚W_b¢,‹é‚YÈ2Ó{#þDÛGò>@§ º,ÝŠûWhƒÛ™G6[3 yÅ™ë0<9¯ Q¼·ëb½´Š,†6vt„ºq&ÚT5¶ áÃh½ #¿ùE ÔM¸±¿Ék|¡-Æ ¢¦¸Äm_˜íº±Æk<ÒÐABŸú!¡|ôS°ð3þ=íõ°nigíÖÇ‚=b 7ÚOóÊÙáçË­­%[9ßxê] [`#¯_Ž™’…˜»]Šù“{ûݬã`;ªb¾<€F‚Žég|no‹îž=yµ_ß?±H«k8¸=·ïTÄõn{óò·ò…tÕ¿K¹R|5eÈÚ¿y“´nªjZŸË3%­V•7NÏÿ˜×m ‰û6M‹'¤>:Údú÷¼›”×’C;­ }‰þéÔ‡Õ½™xœ­Vkoâ8ý ¿âªÕhH #Ílh™>‘ú@„ªê@ðL°#ÛE£þ÷=6áÑNW;+ Àq|ν÷Üc›p¯J{4fÊ e¬’`tˆçJħyÆÈ0m(•ŠÌ„QÔëÒ°Ð$…{¼\A°ÞB®0œÇŠ‘f¦ÈKå,ìP.•¡}-¦9S,!#©ž•ÓA ~`$ “†bÒ\0šÇ3f#m1Ä"!»¼¶P¤#,ËHæ 1Ž÷Šfèžé`­äôIª’§[‰"™[¨‡ô”ÅfƒÞVcStB|¹&ÖKfFÔ;çYFCf–™_2`==tWw÷êÜ>ÒC§ßïÜ°ÞLà|b3¶d³ƒÅ©X˜j(InÎû§W@u>w¯»ƒGCÝÁíyÑÅ]Ÿ:ÔëôÝÓûëNŸz÷ýÞ]tEÌí’ã¿uO]!lÂLÌ3½¥Ã#Z¯‘m–ÐÄnOÅFŒÏkLnçýloKº8“bìX+Œ|») i|œ"ŒŽ­‡aáù|ŒEH5³%‡ÛÁ¯ÜPaµºËÅ(+„Õ&á2˜´_M órn›‰©î&,Å¡Uùüuÿ8¯´ê®5~Z9»{toº·—Ûôëj_°mŽ`K‰`4á°ÚLòÄ«~¯%2bgˆ1¾0aq7*0·LßÛR˪ՖâzœBZ—n½yB…{Ô NÝ´ü‹CÏJm[æX= l¶>³ßOAÃsàçê:¿££e&ot…–]8¡)î4ÛîÈO¸*‘6—{G`χ^µ†¿U…WšCü˜YO¼&é³8‡WêñoAš¾E·ÛÔÂÊ úÕlÔ‡8&qûôÉ qû® ³<Ïoš”¬3_©ag×Î|÷!¡iäӻ߂)EáòÂŽïpu'¦¿érm3ë‘MªÑ°íù±õ¯¢P½m#|HË?":ÔlD°»Cý¿luÕ•¾ö·5Úsõ՘̘âD‡oxœS]kAE1-Y|Sð¥‡ÆÝ°ùhD±Ä ÕJ‰ˆŠ©ª"“ìl20Î,3³]¢–ü!Ïþ Aÿ„/þŸ|ôÎ&iƒO.ì2{gî¹çÞsæë•ßW¿ü<ʤvp¡²Üá„ÉœC«2ä¸ù “` Vâ„'Fµ#£¥j ^Õv$¤ôߌ«]¨\ÚšÚ–Ð#'›“AM¨‘ÌŽûÖ%R çʵÝV ‡„5ÔÌ$8€Ó؇ J ÷Cá+ášAPKx*¯>|ßï?®vîÜ+Ç—ããמðüWeë:(àŒ´´è€u&9BYñ‘£ àÝ:š"ÜÞû¿ç­ÚŽ(›0ËŽ¦Br¥R7BE1ŽzÏzÏúÇ1n‘¯^ÒØCÑ,ì{Z£Ž‡hµfØ—›Z¢+œ`RXâ&ˆÑø…hâÕÚ_jÃ"ÅTçH´ºå 8O£jƒ‚)ù±™\y‰ŒÖÎs†_“É+Sh3êUktm¨-C=Ž9ÂÇfÿŽ^زš}y ÊÓíC»±ÓîÜnâInÝÊMèÂP?ÝÕm]>3ùº%Ç×Z¨—þŒÐ®±]/-¾HM¸Ÿ`ØYENÿÒÇòF¡MñÓà/uµQضNxœµSÛjÛ@}¶¾â’TJŒí¤}ÊÅ–B)qB¡mkíH^*ïšÝ‘ý÷Ž$[uÚæ©é"Ïì™Û9£á~„}xJ׃ôXŒÞMc ¸9A•Ú8,Ï—äyê”׫‘ïÝ¢ò&Ÿ1â4ÁÑèð .%ÔY| «Égö2G £è•±iQjÂi`él0o»ª0d3§Ú»å^olþÉ<ç›YZ´¦ÌXê½{˜\}¹è½ɉ"cse,â$zŒ€Ú68‘}™2êjKU€'¬<÷ÁVËï­úN¶Á•6˜Ü’F:SÓ2ËÈãk[å^YHwœ!Þùfw’&¨ót|CÓÜ£U†üŸÈ³gÎ ‡8/Vª 2ƒa£ 1¸Û²&Uˆ˜ •+!Z¾fX"-)z±óX)Ë ØÁ—*À;Çõ]8q¹ÂÙºðÕ¯ŠO–ʪÂåfôJyY6ÆBÈ>¬©:ÎX“±\&-o9qM¿Ë´ªïm$øxw}½FdÒnlp†ND·S´¼‹qp` SÄÜ ¬í熔^×qô÷bΛR€<õµå´»í:Úk÷!ùMî[ 7›R7º«!Ÿ¡Òá»…È+Úõ×-ovjÀˇ@é¶YŠý‚Œ´|ö†©!¡¿EÑ3eþ «ºƒàÂ˺x[Ïýˆ¢ŸF@p °ˆxœ­UÛn7}Ž¾bà"¨(»º$}£ªâ‹Ç$¼PÚY-Û¹ ¹RIÿ½‡Ôê⺀û}ÈáÌáÌ™ ã7 zCŽ×áJÃÑrÉ«O¼ÖÊ:ȘJˤSrÓ5·ÐÂ$4$§é-µÚ@ÆÆo×â/öÆ‚¬\9{³Ökö祕j@n?÷ßGÐó7tQ¹Ê5—-êuº½·øéÓµ6‰VtÃ*acµŠèCaôŸ¼tö÷Äè$ŠÝ ~Îç}™gÒR*á7þ aœz+ üžÈÀJæ\aq¼w%:ºa‹S½-d¼³Â¢ßȃ§†™¬NÝVP¥KZ E† Îå¢ëÒ‘PI¬ ­u"Óª†¸ôœ&ÁëÚrs÷@·l-ήY!9MÊE.—t+—¬D°¼ÄfœÐbèm¯¼C³Ú!ºÒ¸B8©U›Xú$’l±§þþ¶³MÚÔ8Má|$†táM[p¿¢\¸£uôßlƒNHª€žéÂWïVæ9-B¦eÞ® O_Æó›û‡9 ïéËp:ÞÍÏ¡ï2SÞðÍ£8‚3B¹ 1Ô Ÿ/§£X ÿߎ熮Æó»ËÙŒ®î§(òÉp:n‡Sš´ƒ9»²H©/o|:§…BM¬P\& ½–*Àf·Óñ€®‡A-àR‡­¹üA£L(Å9uè¸îb=?¾&Ïö=ú±§‹B_4ÏÏ[X~QLY$Áÿ-w€và )§u,Aiïc8ë=;ëîyíÞ'Ï¥ ÎXq ¹ñÍ]µ€ƒ”^?ê “úQ¿ÆÞôN•zÏ•ü%ÏÉô„|¯‹ú).ÏÚu­¶NmŸP„–_h4ðžLêý3{ú‚bTˆ_3!ºÓG#ܸRaøæ•·ðÃÐ,l5 NÔé.ð` Œ¢¹N‡ïõ»¨[ûÿDðÕ„8@ÒuBïÕë}RÒ4/mFMô=fñNú·¿È ÆŒBÑœ7°ÿ‡Jƒ4¶ÇxœÅVioã6ýlýŠ‹öÆWœ-PäjÉ$6|Ôší‚)‹…L $×òß;¤(I¶iª²<â<¾™á¼QóSŸ`!TðŸKÍÀÄ ¼KB3I#²…Ú(b70SœÎ™u ¹ 3nà‰çÚÅ²Ò ûr3„RÂú±¿ S‚$€HBkŽ[ô˜%),¹‰a0½³~–Ö…LWŠÏc•° íÖA»Ž·C¸–Š"Ú ”)-ENR%ÿd¡Ñ¿R%çhÌœ!Ä÷¹,—qÌ5Dað?»yÌHåq*ÄØHÈÔºV‘þ Û²¦Nvm¶/Ë…5n[ åòÕBC>{cãÂ8_ü<if4üÞþ§ð ­Z ^à)‹¸`¥A¯Û¹¸úzÞ]•Ú­Va·õOÖ×AïíŸ7ëÑ>”ÐÖÞ±]ö§váao,AÙ œ!sEN™æsÁÜ ÎuŽæ=Lò±m œ7ù «ùðEè ÌÝ̽©Ÿ»Y f…ʉë#>Ï”Óð*eÔ 2†@>F7Ðí ŸÍ`3AFÌd)T|Ž]!½iëlåo½²\àήO6=^ƒƒVËÝz³ W‚Ìì—€ðß2i–$õ,Õð#hc¿ òádÂà-+ò–j~ÖóøŸö÷ñyÓÇh’^Š â«pÇx0¹D•©¾×ÝvоãÑÚê3Çäøx³¥3øÖÈÙù?'øg òîÚ¯¢#]ÊßÓ.§‡»ûìqÖÝ·JÕòÁäëWg.çAi«SÑPl·.Y¡lÛ+\ªkäuÏÙU?ƒ½Cj5kg¥_ú®½Š¥ä¥ç§b‡—H‚¤¡þí4œÀ«$ü)Øä[IØ5;£bNZN¨ÿgU³záQ‰-xœ­SÍnÓ@>Ð*Ä*œ*âò5’]LâZ I* ´‰¢H'Zco’ñÚZoú­ò ÈâAx Î<âàWfw“¦TqÀ'ÏÎÏ÷ÍÌ7?®þœP[r°„„)™Š4aÕhìòO²ƒb¹B7•P}†6ß #.“]ý×ICüðýBñiÆ+I.zÕþzñvÆßvcÖå‚•ÛO·6m–—ƒÀqÆH<Žlà´áÑøpSap$£ç·pÄÂÏAQŸÙ|ÿm.¦Œšãä*T<Â~ÊãI-¸Úòœw09ï kšìP¡áгîÁm4¨t¬«E"™æp=ÜD½~{µø2{½LÿÀƒ¶zÚc,ª¤3úœèºÓ̦)æ'köÛÆÉ¢TÄR÷Æ©ç ß=ƒ\·È#‹\ÿOÈ'Ήã8z,IÈ\ýÊ^ä#ê‡Kô¿—{vŒÚYíd‰$o3ù…ʇ=#ê)úÛ¤™ˆ‹Ri±¼=ÑQq¿T+’Ré2Efü oKw%(>_œíör­†çŒÅTÃhŒ'$!t‡"R<¹ÉÔ’Ûaj˜Ù]+(Ïn•wáê°ÐÂòt·IQ‘«ò"{l 7r4;ÔË‘1‰Á [߶ë`o2(vÈÕéÜN& ¹’Q’0Š®ïù¨„-š…þ©ÇÌht4¨P¥|š4!=¢‚®hâÉêøÆZÇrpÏûKD_†¢G——SˆL‡½¾Ž†îÊ6e{ú§–F˜.•H®ô¡f(k†´”m-Ašfkd•ÛC…œVªYÄi‚g›‘…\æ ­èŅ貌Eçëè BñÕjõÏë«hN"670p£’ú”SÃ)¾Î^»dÁˆÎÄ®=ˆñ‹æ™«˜ÔjêêçÅJx“d+éW-Ô‹×sW~UÙlá2„Fxœ…RA‹Ó@F\©Ћ‚×ÏÂb²”¤IÁCE±ì‚x+.zÚƒÓfÒ ¦3a2I[,äGä—ìÁ“o’¦[Ùƒsš÷æ{ßû¾7ï÷Ë_Ïypéà•ÊÌš®ýå”âók¾V²0šŽ²àP LÊñ‰k³PLǘÁ(\c©dE9®m¸f?¸-f(Ä:Ïø=ëÝÇ?›ÅÙëzÕøéÇÒP‘p=ç§ØxŽ°ðŽÂX• ËB™Êf(•kÂ$p‡·rèµ cæ^[L⧸é4|ë5TÒÌ£&œ5ûÁÓ:0Ë6lWP_aËÝâ[Í…¯'ÑÍ®p=ˆ;U’,ùÆ@r;Apî* “ƳÐ¥+ •2Ví±œ›2'òimPãÏRÔ}ËË$ËÔ )Ý7Ls0ƒœ&ŽÇ–ñ8¿Y k‰áÒ£÷ßùìq•2)y†1ìýY„Ø[lÞ¼¨­²/œÅ­¤Ë_L-3ègðþ ¯õmÛ·èÁ[Ø{½êvÄ·µ+ÁVü@YYJ·ûgo[‡Èh4ñÇ´’r ¯¢STôd»Ì­ÏŽõÄ2‹·þ$ÁéõVG‡­êõ'IVN ·0ÔÇxÍwçÕ#ç/Mí˾ÎxœµVûoÛ6þ9ú+n-Hyø·MÓ8@i ]³ÚY€uÁÀX”ET"UŠ²“uùßwGJ¶¤ªtF‡§ïÞßÕßñ`–EÊ ×½ùž¶¦"Í¿^•¢ˆ0ï¸æ9˜˜Ó¯Ò÷zÍa%’rfU˜ñ`0(y?çs`2„¬0V3d†F#íD­ö3–牡)ƒgø­"Ölõ`‹Üy[ˆ%'ý"‡aŒèG¡TIØ”´Îr±,Ùƒ[t~Ž!?ƒ0ŠElH;Ó*,æ4¤Js@',Õ ƒñö\Ú[3´$$%€ÖÉl*æZe±’è!VE­M<á~¦¤qYHEʹ*0,«îâXqçb¶ÄBªªp&F F©=’-¸O4°ì£ü“kÕëUQ½VÙ½¶†üy£ÁðΔ1ów\†\çJ"ìÇ|ÐPßó 9OŠÃqnB¡zñIS”ˆÛ–ì>ï‘r’ÖÄ+¡±È—¢ ^pmnÓa‰Ž0‰hköñêÔ{Œÿ ÉíaËN&Ã`-{ûòbŠÂŸèJ1uy맯þ˜žÿvºE,Z˦NÃÑ¡çå†1'Bbs"¬4|r:7ð¢ñðÒh˜À¥^ßCÂÃK®ç\;,e,=ˆ›–,)9’+s8¶à1/Nßä?¬;í>•a/•kQ‚Oy”¡ÞW 4 <´:ÎW9ˆü '0â/„Ü †ˆjƒF£hÔ:8hÆ ñ¸:ì=yÒ  §O› QèÙ³&hÜ:å¦È¨LTA²±®ËôòÜ=ôK•úr8p¤4.*·…@`pðawW¸ÊgB¾WxYø˜ý‡«ÙåÕ¬´dÕ6;Ú­ëcp«ÜZ ‰3ÒîÛóçe‹JMìK½wôÝëG³ŠÓ?80= Ì!Š’"ÁÇûO¹™Ç€£w>)·Êh@o¶·ÿ`„â±Äp6„ü•ê€ÿV‹j +ÓDšonxXÞ`™8!å‰Ke»›Xóm;ùÕ:¯ÙݬÛ"n¬ ·}kÂr”žÿ |L!e\-ðC3¥þd^£Ïoðõ®¿‰JH‘ÁvŸ¶Ã£íð¦úÆ ØëÕºö7¼_“-§¶¡†}ƽLEDo׈õ[L­'k9ßû%Iº§àŦÔõ>Û3®Žª—ýš¶úU©tµ‰äXÃJ¥fžÝ"‡5@y3Ÿ¾vÀMJ¿^0‡ªoˆš2uÛÑiáˆs­8!ôäFvy6(s!§¸ÔP†F ì06PÉäbö>°Û¬8ÁH+„’þÏ~}r9§ ØF+¨Å %ÖBÎX>[®¶»?`òANEv¨È..˜g *@,  ì06PÑæ?œÓù ~´â„Ð`¿@™ —Üä¶rHMÎÈWPŠvÎIMÌ‹Uâât˜,ÁSÉ ‰¼ä )xœë–þ'°¡U«´¤$?¯X/Y¡(51¹$3?ÈÌILII-2rSKŠòAt~I~ÑäD6ƒÉWÙ‚ù!Z¬8“ ŒÉ ¹åÙa샒B0“¬8a,8¨†b…'˜žüC "’ä[kÅ ¦@ZY!, 7Ø%@) ÒÅ qPfò~ž3„WN:µŠxœ½WánÛ6þ?Å5Z;pd'-0,© xipÁv–E0m±•I¤âxCk/°'ÛIÙrÚµÚ …CQÇwß}wd;{ Ø£f6^.¢äßvb­DÊá’ŒIÉsjæl–LsHµxà⛋ˆ¬OT±ÒbžYh&-8ìîãÏ+8W:U\¦\%Ñöû<äð4f"ç€ ¦-y¸ZÈy,\™µ…9êt ­>ðÄš(Õj®d$¹íhfŠ{®õj¿¿ ¸Š ñ©€|¦9_Ç~+UBÂ$hž cµ¸/-ú`É´£4,T*f«ƒÓ%6ã`¹^8éåüòFÜüvÎ%×,‡¸¼ÏE#‘pi80@ š7Oá~åÖž‘C“*g ·`V(Ù.𻆤ßáeØ-ä6 ›Mf) ª ¥-t9³›ÕÑ—ÙØ‚ΟL]†ˆïRä9Üs( Ÿ•y;  =Ü §ƒ«ë)ô/oá¦?÷/§·Çho3…_9)ŠÐĢȂcpšI»ÂÈÅéød€«ú¿GÃé-…q6œ^žN&pv5†>Äýñtxr=ê!¾ÇW“Ó`Âyƒoó>sI$•sËDnj<Übê z›§±ŽH8VB ¬oæv;Àr%玀5ÃQ0Î@*ۃο&!£Ž—Ëe4—e¤ô¼“{Óy}Ϫê4? ™ä%ÖþkcS¡¢ìMmª°™æ,¥ÉÍìîÚùl·6[uœlt:pÑÿý.^NŽðeÇ/þs<£r|æe¹Àš$Qj…u”0,¹+9–Ø’åùªêVåìœø¨Pôçñð øcÁ\׉`h_"ÓñÙL$‚KW¯µýPMwè7FÍ#hNâa IqøÒü K%_XL»s➯!±½ ÚX KÔ±Ž¢ùIùLH¾S¾sÐ=|娘b¬Ø;©Žÿ(¹LV®®¸vRšiµplìeŽ¡[±à»¸W®–œ¢¨¤´}›¼%»Y…Á¬” Ut%F¬¡9wÁZ"}ùDà‹²¨Ð÷Wéº|ý²½š=Uû?OP“ ·ÙÌ îuÐíº]XX¦æ¹àÃìžûíáo»‹„%”e&’,D±ʯüIî’‘Kg¡Œ÷9ùsŽ¹„ ÏÔÎföJ¤Œ“2‡s!Sp_CÉÐ_¸ù¸Ò*ùHˆfÓõPäSÆtºŸ+UЮUä>.Ú¢ µÀò¬±*Ö“w öˆìdpúönüdð¯x‹hìgÔ»Z›r†f%åõ!\Û&?äsô™ü&VN|4 Óœ?âÿ¡(Ûü_ªÙùPÉ/ÈëKÒYwè5¹L&<‡æUó«Œ>(w.lmwbÚJq·êž_é­ŸÒmäèYçŒ6xœ[ªØ¥°a&çd#.CFÓÍ)\Öl,µ\µ\Y4mê%#xœeP±nA”•†[:hhF¦¹‹âó ‰PBÙ‰hÐùvïnÁ~{ÚÛY(rOƒÐU|5 ŸÁ/ÐóÖ–M‘nwfÞÌ›÷ ¿n.û»»˜Î4½óÇü&.#™Y‰î í¢¶¦´ÙšðA[MåXÇ8ô\ƒŒ0<~ŽÜ©Ü)é œ« m‡“ñËjM13>éÈÔ «ËÊ!Ì# ’$ôIz'ÆJCx¡H*ÛŠñ”ƒß±kóLòŒríÏá—n£¾àõšJILÞh¿uÞÂP犵c×ð÷¿ËNû¹sãîúlf¨ä*®úߧmw¾.·¿ê@ˆ~ÕlÌ­{[o‚ºÁáÑéÛU·ôQ,Ä=© M*à‰ B“Ã?kw–R—Úe³×V» ›rDÀ¥F´2’j–->H{b>Y×G“ÍhQ\ŸeäJlK¸ÿϱLï‚.xœ;ν™{Ã;¡ò̢̼ô€ÌàÔ’Ò MëÉ’¬N,žî“cX­˜}üÃ'Og5Ž‘ï#3.¼¼âfÔL¸A•ê'Ü?ú왉¡vϽái2Æd´òf닜Ӄr},Û?½gÿ=…·]€éÄ ž¥ÄSZÉcIH’æÇY/ mNÃ,õ|È™ž#Ôªb¡„s6±Ype}Ø; 3W9e£µe´Ìv^ØyB!ð67ÊøùÌú×­û߬V¥½×CjB“2^Ø!8²<»¯xœµVkoÛ6ýlýŠ ]åƯ¤0ØI7'±^bø Xº‚–(›ƒL $Ã(òßw/EÙn`)@,Q¼‡ç¾ÎUëC`‘[«¤iF|ªLÅ:K9Xn,$Jƒ]q‹‹8i¹Nèn¡˜Ž›¸,&œÅn›&cP¹Írë– [#žr÷£þ•)ÌàRe[-–+ aTƒ“öñIÿ}„k¥c%á†Ë˜k£dÎ2­þæ‘5¿ÇZ-qErû !Þæ".³•0ô3¦-¨6B ¹ –•µ™é´Z%•æžJK3“-¸ÖÛF&Z…Þx7ñ*<Ñ#¢»ašw`«rˆ˜Íca¬Bä`)„- þZÅ"Ùz\Î)&.˜‰µ!–ôp};‡7ß]sÉ5Kaœ/RÁHD\ Ý¢³â1,JD²¡©'…G0+”¬ø^ÃfŸácyšÇ¬ƒÒ'd–<Ñ 22­!ý-¤Ìî­›¯GcïtŒÕåÐW*CïVˆˆþnDšÂ‚Cnx’§u€ûá~8»¹›Ï wû÷½É¤w;{èâ~»ÂÊþÄ 4*fàèœfÒnÑòGryƒV½‹áh8{@g`0œÝö§SÜM ãÞd6¼œzÏ'ã»i¿ 0åDŽ{Œ{â’ˆ¹e"5qxÀÔd›Æ°bOK ââ ¹2ˆ°5~8·Ž¥J.]vF¾Ã¤²u0ÈûŒjKx³Ù4—2o*½l¥†i}j¾eCµ‚à'!£4ñXcc¡š«O‡k;Š¸¼_͜θ­¨5^C üyúÎá+´ëîž¡­Ì1À'í67E*²±`>è²åÄ y"$¯Œ‡ƒÞeÿËEoÚ¯ u€P.%ûðÂ)XçU[悪©7h€H°2ßc?iÊJ\§M’Td…ÚY¬{ðù‹”Æ™2FK]D®oïï#ÿ¤D|à „Ë‚~-øyÆb),K—áAHà¨Ü çç0º»¯¡Á>ņÏð×9c*臻×õëU¼ú ûš·Í°,Rªz¾ïbÔ*'T2\Rm:ðÎ<Êj=¨TJÀð#¤Ü®ÁoP½K’*tðWV‹cžü·Y‘Äÿ7ßÑ7ž²-„Çô¼/Kc’ÿo‰¤¼­êbH)õ¹“®xêe=vɯ]'å$ÂÚß íQÙ n¨ã[j¶~,#³3>ÿñë¥ñ‹• ê†ª? ÕÅæÅWêº[\»ïµ\¦N^qkdzŠ AÕ'¹‰²gV(ŽÞq%£â«"×±ÊJ¡º dª 7H—@«”Û+h¸'Å‹æ£ôÄIOzé†m †XXÁpVò%®½Öç4ù_±hï:¹”ÊêN$ÉßAìˆv»{FnÁg¸ ïÎàÔñ/u Üu¨reëv›ö—ƒî×Üå¿íÚø¦©;>¾ŒxœíXmSÛ8þÿŠm;7“@œÐÒ4t(à†6™Ž×NGØ udŸ-“2=þûíJ–_’mæîÃy‚±åÕ¾>»ÒjmŘïó¸ímâ þja쇹Äá$”Mø-•ºn§‹ŸæBFkŽóLH/H}¯å‹°=Ù®â¼:–JÃÕ±)S) ÍD,äÅPT #ÑgÏHÇhܸvòátßy€ÏBrýZ«wz½N£4Úß9™á.£WÄ9¤šÁÞþÛÓ|ËHߟ¾û|¼¿7ªÁ+ÇqÖÖà‹@M8à`*ÔÏû3sˆ„L¨–&¨- µz42ž£ëaÂc^0õwv÷k]×u/”‰!Ü'!XÑŸ ç|#Ñà6¡Ó„nÖ›ð¼ /š°Ñ„—MT ðB6MŠ)ݺt[§Ûsº½ ÛÝ^:7°e,…SZ,“*qC˜Æà‰ØK…‚DLÓ€)J«œ¦ç‡«·L)ÐWÏüûµíÂV YþÈ©.x ‡ëêLEÌ Ù™nÛu;fnÇuÝ´_ï¢k/¸ÕE­¨p2Mæˆ÷Dâz$ÞxåÞE¬Ä”I¯dgšŒ8’ú‰ãXƒM|`‘¹3dE~tÖtÆ%\¥¥[m‡1›j\ èá8æž ®I,”`H¸¦Ø4J8¯Bá… NÏ Dhd RÀ&ÓˆhF×°†ù ÆP7952ÓÑß èõ …éC>â_õŽ&GGíKFþAÖ<–,€( ‚VŠ!1Á©.йü^áÿÕUaåi´'wC©â0€ºIXÑ„áéÞçÓ¡²Ë€hÆ<•¢$gʱ+DÈ·€`ìc""ÊÌD.„cJÇ,€¨LÜ…5¨Çw8 f¤1?Ô¬E×*þåŸ »þ*=èÜòa5›Ý²¨)ÓÍ3éì.ÿžk¡yµÈ¡%#  “1Ùøji<·,óáH±XaÜÕdhœÇ O,4:rP÷@gs“c[PˆŽ¹Ÿhx§ S;Jaà#”€‘tt¹$&¹´CöRŒçŠ-༠—:;hu…°~:p¬—Åò)A«ô©g¯rñcíÍMøe£ÝkÐ%HÚ4ÃËfdQÑ3ܱ.@zB6¾0¥ˆÝâ”RX]•UU»ERQ…­¤´¯'ÕyEã¶kS°°dëºh&›yv_fÙ}‰Ù½®³û’²û›Îð…ü·ËY¹ àŠ,.„bÁY,0ÁëvéŸp¥3šÓ¢°k¨¿p];òy»s¼;–÷¶w'` —V±e’j.ja*•Îd»Ý®ÈÉù· £EnÙ­–(|ûS†Í«Q$øLH‰µô¿˜â%ÕnKòÿñùXøL£ytÞ.åQ€iªÞnQ¯|[ ‹1BìŽïªóixųYvožWµ6QŽŠM‚-vhmtyûq‘<§wÍzîáˆ]ƒ[Eñ^qjü+îÄZùŽµ´ä¯f4¸°[„-ÝÝL©þ¯’,ü/ÛÏÇÙ2Á"òºmƒ ¼КéˆhÝ¿ÄŒ|úrÕ‹½KUû;tný¤ÎŠ†oQ`Ì¢‰FË U–8G’FQ ¸ŸõgÀ¬|çq¹æ=.6JBÝ6,H±å J§Â à@µÏŒfð­1B š>¾ÊÑ‘ñjØt%ŒttÖ•ºÚôgü¶óÄ6…#Sä»ñ¤P ô~5£ÝZZ/ìÇï®Ie&ùä¯osõ$ …w<ê 4Þ±/„8ëÅ8ó©¥@ö Š>5lÞ„{_ô÷óT)l† VÃÊz‡Ϭü€ZÚvI÷fǃ³¢/¤§-»ˆ™>–ÎFl ®úh<þn'Çÿ’—¬Že7-«OvEÛAfhˆ5ªÉ„¬(~ãüˆ›çKmšnñ´>o²Šœ1ì¡quésôhv¹Ns™Mû´©,¨ ±|0¿Ã j7eBbMÖ§|bAÕH³/Å2•‰¸Ü7õnÂeÓ$Ç ®%Í ô¬®‡i¼§}’•ÇºifÐŒl2ŽÂŸ9$¡+Ë“RGiÃeNB²uÀì0q}>ì 0v~ê™Ð ÞëO´€ÐëÃgí+ž$\Ÿ‡äÊS·Mi%;òQ’z2Áä¢üJc8`Š¯þLYÌg ÷7Xí£¼@nmTÒ$Rpð~ÓȸòδíW<ÅœÚæÕ’ž[e $¯õ,ƒ¾o+eË2·Ð4W݆Å~6[ÙC²ó`†3¯¹zCÇ5g$Ç`ê,ÃmÜ91i¿âRP¬áXÙsÍ”2XOÛ†º]ýê垪A›¹e‘K²ýVƒÎÿÎÂ&aø¤bb¥)L¼'ONm.G¿7Á—Í»«ôÜ0è÷ïÃA^”îB)Å~ Ei^…¥XÈn1¦¶›æêo?ê…ì¢ xœ340031QðMÌNMËÌIeè5‘â˜âóÊô Ÿ˜Èóƒo·ˆý 3„¨)ÈtÏÉ/7ÐKf¸üÏ{Úôc¿…¥kî™\û²áœÞÄE†@E ¸ óÛïž±[.ôê½g×ÚJÎ}Û W”TTólÑm³ÂôêßëéÈ}[*u’ÇK%;.µxœ­VÛnã6}Ž¾bº}±×wçÚ8 êÍÕ@66lAÐ. Z¢m62©’T¼F‘ï!%ËNëÅöa!¡9Ã3‡Ã7>ô‘,7¶UO1Þ‰EsQ¢ÕL³Y•}Û9§¥ÐB΂¦© ­PÒ8«ñ\ÂËÈð¿R.C®Õ‚½p` ³KÎ4)I't}å C%%-ü&ð;èõ)ÒÔ1íÈ]ªd¥Åln©–©Ýlµkø³O·JGpuÇeĵQ²Ngàû'œ™_#"¹½€‹ó8.>Ì©€>øŸ0mIM E¼|sksÚh¬©Ô7Tš™dµ^ÕÑȬ0ÈÃÄSHë6Ñœ“QS»dšŸÒJ¥2IšGÂX-&©KLF ¥i¡"1]ån§N/'t_ÇÒkûðH÷ÜÌÝrÉ5‹iNbÒ½¹48+„å3ljLÖí#4Ê ÑÂÌ•¸À¼¦Wœ¾i½[î³JJç~J̺H‰3-ƒþŠbf7ÖõÝjl‚ŽHHï}®D7‡GÄ»qLN©áÓ4®æ°žžzã»þ㘺ÏôÔ»ãçÖÛ¹Â,å™7—ôÎœfÒ®CîäóõðòVÝO½ûÞøÁÐMoüp=ÑMH]t‡ãÞåã}wHƒÇá ?º®¸#Çsß×}êÂFÜ2›-žqôlãˆæì•#B.^Á•Qˆ«ñ¿Ï6wÇb%g^€BaðíMI*[Åíåtær)¼\.ë3™Ö•ž5â̇i\Ôä…jÁÏB†qaÛ‚Îüb66Êaï XLþƒ i½mÐhP^Æ6ÕÙÊ0±7ÖÖß ¡*õe£?º›ñc¶ ‚ŽNþ°Þ„~ûBçÁßm=Í*µÜûlm@Ìg/µ7`«÷7`»6à~nÀƒ<Ú€‡x¼ªÁÀ£Ù° ÕªîAœë¯V³u´øþÄÂb3&dð.¦ã]ní¼‹éÑ®˜wE°K§Mô­]:5ÿ­è–âß ”è—jöú)œ÷‚鮃à:Èœ:”—Ò«QÙºÃÐŒ0Ÿ]J ¬.¾c\™*EΞÐ.M©ôa¸.ô„òUÔ±í–ú»üPÎŒ ÖKFܦ •Êt~NµVÙËο¢¾•ZùjW'JŽÐ95©ã©¡›v¨RÁ8³Àà³Â•pëÞãÁã87/¦NªÔ{Èprj „kÊ£«n“jt‡. dm¢˜Ž¨ýÒFKˆã˜inPˆQÎáj­„'RPët‡ìºÄ˜Ë®P¾¶RùB·î_a¾¹bdÑüšè›k®Rí;ÔiÚ¹)g¹ëô,ÅTó E^Êöq&Ìú¿§žaøb…Ly¼eÎ"1–ÅOZ Ý–ÜaçBfûäÓCÎ"Hê÷j–½œÚUâȵS×î Êm8wU\£ðà‡ÎL»þ¹¦ãÒÎPŸ[ÍrÛ 3èŠ?e¾k©[äT52GKÏ[ð¥¥î$‡lxœ}QkA…) ’¡oâƒ}:ЗlÓ¬š·-T,íC‘@D|ÉÎMö.»3afÓ¤ä7húПÑßâÿñîfE‘âÃÀ{Îœï0?ŸÞîn^(`Áó­âô­\:ŸÈ¯¸\C¥³¡òºbgáf¨2˜ÏÅ©ÓÞÄõ‹,…Fž|^½aOiU¬ÑGpòX$OXqQ`Jа´ÂøKUgººä©¯8[Æi¶5gÚiò/©Q:É$ÖuDåê(µµäãøûÝógCœ;oÄzAÖÎJá›ÓÇÉÝûÞNù(Úg›KC8 ¶îg'Jíš±¥ÎåÙû¯ïN'gÑpx£žìmø9¥ Ý<Ûù˜'T-“u@7Ú Û˜fîï€V›9n’D2~“Ó.Çx‰Œ# F¯eêõ8jôÖ‘·ŽM.ùÛÚ‘Gª£­.Üü³çŠþ°ÐC~n‘1£QC9Ù†õûCþÃØ{\«kõ g©¥2µËxœÅkoGð3÷+&‰ÚB‚y؉Õø‰¤ØA¥6ÜÈj£j¹ÛƒmŽÛëîE–ÿ{gvïŽÃÆ8MHk)ñÞÌì¼_ëúsžC"Î#¹hÖü#ü*ýÊÕ´˜&‡€Oe¬bFÈdf¡gÉa$™ jtc8fšk‹vÜðê¼+F„'ïd²Tb<1Pö+°ßhÀ¹T2}Ïã€+-c"ÝÍ ´:…mÀß S†´_%âqOX;'Æ$ú¨^O”ü“ûF×%ǨFÌM]1Œ¸R˽DÔÝ-<¤¶àOƈ˜‡ŠsÐ24 ¦ø,å |ƒâ@ωÑÌ XÔ¥‚© D¸LÙ xFÖ[¿®¦:óñùÅt¹Öˆ;ç1W,‚Þl ºÂç±æÀÐ,‚è `”q¤»g¤Ð UÎ$Š°ñ«ˆW0GS<2i)Ï*H•ò)3C–( ]­ úKˆ˜YÝ®möÆÊèDl¹Od‚ÖM#Ú»Q#Né΢jÊéáCgøþòj­‹køÐê÷[Ãëc¤7‰X>çŽ%¦@æhœb±Y¢ )“_ÚýwïñVëm§Û^£1pÖ^´8»ìC z­þ°óîªÛêCïªß»´kNÊñ”Çã~mÕ†a"Ò?\cè5j0asŽ)às1G]ø˜ÿŸÛ”‹d<¶È=ŒúvBˆ¥©‚F½O(‡1…‹EmÏjRë‘ã¡ëovZPuÏ{&b?š(V›@ÈÚäÍ:(Âr_ƒ%2ŠR冬Ú–áHŠ˜—zóîå‡?Þ¶íÒ«ƒâb©„¥aÿªí=pt@Ÿ˜®ÍÓÓf¥>kum(?!4±LjÐó¼º Õ'¾L 8?âLý¼Pg¸æGIÉÃ{óm‰ýMb™b ISA ;Œ·Æ¬ÆMùìÌõwƒ  Ö²¥e f@y.EPñn<,¿™o€|ö—†cöXCýœÚÞK(S,±¾s ª4£‘¢wÙív.ÜeÅÍLÅ–Êß[Â*4«Ð¨À“Sh Ñm®érׯE jËå¢ú•Šg»Ž%sãO˜B¨c›F-™EšwÓõèÃÍ›nû'`d°vJE|\Ê2ìÌrŠERØLÙß5˜³hÆ©ë”ðjl‘lÌDü­ãe}’Ye ŸÕ“¤«ó } çpj3eÖ·;æK:½x!ÈU7Ö]é܆rn22t¡¤BˆØ Ã}ßz+HÃr Ž³€7NØÞÞ—Š¸½ª±«&6µÓŠäG UØȔBÇÀˆ)ÿ/C0ÎCðŽ·l\Ñ;uø#¬ïô1.ùÚVÄÿàlÒÍyû+óÜ1Z¥àNþ(óÛÕhê¶Ïÿ Û½Aé`­c¼ü¯}¿}„Sk*¼Ä>¹_…ׯ±ëÐÿ9?S¼[+h%¥ß¹ÈÄ4×ä–5ª÷þ¾¬nÀ t&…Ò¹€)@ ˜;гZÀlÐﭻ󰜇uÛnÏvl÷Ûv_gr(ºiÉNqÜØb½Äõ:Ƥï,\ÆR±é7+MÊ^œÅY%º“6<ɺ<õfÒ¹­Èî>"ÆùÊðÁÁ ï¨z½t¥í ¤™rÜÖZè„Ï» Ä'N`5‹©5)) ~Æc€›EBwí¸'y• {ïI·ÓÃÄŸHMûÚ3b¸3{Y)[†iå;ÜpW‘¸®º£xBùéüïñÓB9†'k» »mÅ"ÉM®«ÐéßTÔ¼ì`!×cRZÛ‚±=žÀ¡¥vÑÞx¥Õš]Ò¦„^½»4•ðé¤8û”d×íËrm‘’èî­h™Ç¨nuÙ&‚á³Çý¹­0A27ìÀ>œ®Û3â>~÷±ÚDµà ã¯ÑÈLÍçÄ>'ñ±ãAo*@”¬é€/é@Nלߌåâs¬¿Yy 8Î÷ Ó<' >“ÒØã ä3ÕR°P¹µtmZ›ÅVÆs¼ñ‚àm1¥¾ú±Q)ÔÎfšŸgÂj`?hÃöÄ/mZFÖ‡}jÉ!ZBˆ/0¥±fL–ŒäR$si@!ýŽü›"S­‹ÈùéP¤Üu¸R+Õô-X[îç†Üz©)éóÓ½3ÿm{mù½¥xœ½VkoÚHý~Åm«v!e1!e+å%Ñ–$Hl‚xl6Ú­*ƒÇ0•ñXãŠÚþ÷=wl!ˆT-R{ç¾Î=×ÎaŽ)’Ã@ÍJƒ¼ü%ôœb9ŽAž«06Ú5R…¤|2#A-y…ÓÔW®öJ|£;’1MbÛí(ÙöÄ´)û¼Ï>ªh®åpd(?(P¥|tLWJ{½¡'t¬B>úk~lÐúäKÄ€ÿ‘« {?“Z†Ã–´qŽŒ‰âlj´ú*&.yZ áF(Œ£Ý8ê ­ç¿GÒIná!¿ ˆÁ}-ÅÊ73W‹š« Ü´ð$2'û ¹¡ç(McåIžÂ`yÂÑÛ¼¡Çq–ã«›5EcïJ„B»µ&ý@¨)"Œ¹‹Wâ‘ð¨Ÿ!òÝKv¨“:D— &lýŠ$$ö5M‘o®çqf-Å,’Ò)NÞ5‰&ñÕÜŸSàšåíÒæl,ƒöH†}¤"D7"âÉ  ¾`ºø“ ˜"à<Ý5º×·½.Õnîé®Ön×nº÷§8oF »b*4&¦8‚Ónhæˆ!ù³Þþx[µf£{`è²Ñ½©w:tyÛ¦µjínãc¯YkS«×nÝvê%¢Ž`çDŠ±;ï¾-¢æÞ0® â•<Ü£ô1¼ <¹S „œÂW—àÿÞµMáÜ@…C›€E†áoçP™"ÅðûŒ9 Ïf³Ò0œ””:A‚;¿´¡œ\î• ÁăÙØxR•F–ØÃõ5/€` ‹>ˆîtÛ½zî!y¾ ñ+Èvt~~TXY¾¬5;uÊ¿àm¬C!¤¿j‘Žæá±æbÆhª¤G>ªÔ‹Ý¡ <¿rßsD~ãS>¢Ï‹ô29"¾¹,|ñÉ¿áËne¿WT±±²ÏEhUËÙŦÕEfƱÝiÖ?AIN¼~½ ¿ Ð¥1YéÁå"ÍEÜÊn8DK¡hý~0¬A4I#öqÒE<ï«ä5xö¾ºÃ³"C*S¥º ‘¬¤²'—™9*—— éP°¼¯/U¨jqVs SI'HbÞUŠ ~uÄ7hX¾þw£ûå²ÖhöÚuÞø¹`¬ÓP˜–ÐèBv#WÓ¡™G"%ˆÒ]‹˜½œ“k”¤|rÖF#H>Û?£r~ü ÅÂûV(àãnŠ=‰üdabê2 XM¡D–‹Ä=ÑOüia&:\š>Dñªrl2mø9ÇŠàØ•¡®·4&ý† HAÈñ/S¤umâ´²qÊ󓫇ƒ"%¹Çó”þù¼)ûÉ;׺hi‰z8úxæÎclI#]ÌW±òÙà8½ØÎ êàÌX`8y\'žúøšùÍP(@4GOBžÑZ)ÃeÎ0:HeÄwó…Ô^cièÑç“%ˆ]°÷(o•1å"Óƒ#¥ós:*$XjÝÊ¡Å©JÞ¼a‚è‹Á8²HÏÑgÐâ6àØVaÜå99X¦S›¦3tÞ)½}‹çÄjæ#7Ÿ-2UV¥Ì)§TZóúxigÙ«í“xWùœCä:≠Y \ksCç[«æíÝ—výS13¸ €üoNdu7ö}½‰φOÔz7ü->‹®êφ·C`7úU»^¿y68–ÝØš½çûm‡Õnì»ëF÷ùàfkЖìVû¶ÛÇ3úÃÒ_ ¹ƒUó‰tl0k¾g¨O ³ !ÉøDI¦øŠ?-lj ïj¬wËÆÚÕ1è×YȼNz>™I«m˜ìZYIÄ Kür…Érù=wðtà|øÉitðtìYôÛõâxÅÑueZ+ÖϽ˜ÂuÞ˜¤”+[³”’(M“}» ê~y²§ÿÏDmáõ>¼«.y·•r,Ò/VïÑÜÚNÀ]ôÛÝz[¸g >.þñC·–~·Û«¿Ÿ“ÛÊÿnámRü£´G6–ÿqá׊¶z„ì7ág}?õ±xœ]=N1 …ûœâu4@¢ÜQp±v‰ågfs{< ËŽ°”Ïö÷¬ç¶P‚œßNJ9ru/ÿ˹÷… ƒì‰nhªH$ü»b >4åmáŠA@¨,5Ì»OŽÄchG.:Ó¼ÊCÃFÒŽ -(]î(óÚhL¨ºkÃ-´2ff1~¦B=´·';ô!±|Xƒïo§NøìÕ¼Ffç`•è‹oÍWJ|E6×ñGâ•Ëh‹Åô|Xúz´ïšÏѬqmuËæ¿FÔx–¿ÿxœµWmOGþÜûãˆDÅCh •(2Ä*Á–mEU%Ö¾µ½Êy÷º»‡kUýï}f÷Î6„¦ È÷²ó>Ï<ã­g»#¥wGÂÍ’­d‹r¥½t>Ùúaˆ/ò3I=µíè¢×éRn,ÞЙɗVMgž^Œ_Òþ^ë€.ŒM¦÷R§Ò:£“­ïýÝáL9š¨L¾sa=™ -”UzÚSÇpùc¸†ó\x1ÂÁL¬°Kšbé —¤Å“ž ñâSi`­+%93ñ aå1-MAc¡ÉÊT9oÕ¨ð0îIètç&U“eÔ‚§Ìxi玽㛋«kº”ÎáÝ…ÔÒŠŒzÅ(ScºTc©$pø‰›É”F¥B=gw¥;tn`AxeôI…÷–n‘mÜÓAe¬T¹CÆF5/„ç0,™œ%_Â÷%e¯…›%boJJÕ3“#²ô!Ö…Ê2I*œœÙNT€ãô±3|ß½ÒéÕ'úxÚïŸ^ ?½Åq?3x+oeT¦æy¦ Y¡ýþGÚý³÷:ý¥sÙ~BtÞ^µ:ïöé”z§ýaçìúò´O½ë~¯;h7‰’]“QÅÿ'|Š‡”¦Ò •¹U >¡àžf)ÍÄ­DáÇRÝÂOActý7—4j™A;rì«ÜÂ×΄´ñ;äàó»™÷ùñîîb±hNuÑ4vº›En÷çæÀ(k™™¶­e¬£‘þÊ嘫<5þ»›K’ÒÔ‹—Éß @2¡ß©ü9:¡=úã-gS'œ+9žªÕp=QIuKÆÏ@ª¦z‹&(Tae“Ú•Çõýöšê,–I´4ÿxÒJþ aæH¹‡ucÏ€œ§ˆ®²ôkŒW±™wÜ}!’&û/³;’­$»ZFÑû’h¸õ©¨áž‰2±11<á‘UGÎóÅÐ~‚ÜTFÊ´S'õVtT§'õ}¾d_Oö\†\N¨öü`ÏÑóýô˜ÿÑè Æ ø>@™11¦À»ÁdÊ ïXš­xRÝ8ù'Õc`uعyK© F§¹2<²%Õù$ž²$ëlë@L}VËy‘e"w<çK€°5+ƈï1‹<< 5¾ o‚ºººù¢M¨(ÄZ´žP|ÕßÔ,ôƒgfñ‡YßW\nÝs9ö^Àªª°JõxÙ‹XmÕª7àúE€}97·2ÅfÈânˆó1ÏV&¾¦Ôýõ¸î`=¢©œ:ÞðsDÂÚÄpÒš²ñ­¼UL³'1…ßnðp }÷®Ý=O1Þ´’“øI’°åàOc’Åz•)0$êé«,®c a ÷Ê Õ««dsÙi&ÉUwØ>¦Sd1JK«òs—£y½#¦;Î{ʦð žÃ|a»Í°qæô8+R‰é "Û¡ÎþYè»A¯–Ô‡y× l:Kš"I2Ör_Zéx4Å83—0š„™R˜éê”ÅŸHHD»|)ÓòÁ šÑÙr0>Ô=6ÔÛŽçmÅÝ骤„z0¸‚»ˆýÇ 7 ”¡à…©œ6AQj ,l&¬Û M­âµ rðaKÒ2fÔÊ‘1å2†%KL|Ø«0Œeq3> Wƒ§IÌrؽyQÜؽ29áÅr†.·"l…XÒtYðÞô2) q.>c¿ehb³ËUæ«Â‡4 ú˜¥öհݧÏ2ôŠã•.äNÂm[QtCS 8<3ÜñYãŒOŠ|m6›T í‘!JâŒÂEù„@—sNˆ,KÊÁå¤O6§Ä,SOµyÀ¿édX­é ³á5Õ†3Î^­¡$z‡áz‡Ë'„´ WÂpYAò„ö7ÌJsë5~v_+‹dO ”¾` K0+ýÈ}ÑdIå6äZæN¢ZªUXgF.Ÿ@iÌ”Sz”)Žöjç‘k\^œch´¦a ïƒA(÷Êù€nÖ¿Uš—6cçNŠ€ekK4j´~€®qÒhôHKrÞhŽ“èøßù3­£¢)´ØÓöfoùœ4Š¬o ±†ø/$\î퀜›×¬_aãðòþ¶±`Ñ5‹5j?EVÙBy´;WweÚúg,ë_Ÿ¦ŒÅkƒ‰‘„ý¨ÀLc³B ÁMéÒ0 „fN…oª5?&²Hùáz¿óHÿ±<±OÌð€ßá,³qxœ}‘?K1ÆA«íA7]l¥ÿî*h•*¢"‚b¡›¸\ïR/´ÍÕ\jqêpËê"NŽ‚«ýºº ÎîæÎk¯X1$ü’÷yß¼Ïë\¾—_Mbµ&e ÝÈY›ê¤Ui«Ý$ðÈe‡0‹À½"Â!¨Sî è+G§hSæ!‹ãƒ}ÏÚ¥-bÃÁËCÂEÍ5¹A­#@ÅŠ‡ºIyó„N­œŠIâñîsRÞÇæäMlF¾Åv&(“ Sý³Bº®–?“Àz…`ê…!ôïCXŒ`aˆ¿5äûÔ¶3rQ㯄Å!ÔÿHèù»4©O?ÇÕ®¤òkšõ²J:«:†jØÜs¶œÆ–*£Í)u¤–ËÿŽñ÷ãdÏeŒX"p6„;p¯§ìÛˆÜËøœýüiÐL”ëúMŽrØå6áa°Gj¦Õ€ÉltMa9A2Ïq»K¡„ÒèR%rQIÐ*ª¢”|ˆ/Nèkò%ž–›‰ÛEå2JiMÓòy”ÝÆ’;1yƒpù‘8™õsÛ¤i^‡fÉ'méBu¶vº¶xœ­V[OÛH}ŽÅ'ú°I1q.¥  h$.Q.ªÐnµìq2‹ãñÎŒa£Uÿûž;‰›vj!b—ãó]ÇÁ{ÞÓc"Ò§£H…º~„ 6ó,á¤ù_9OCNò™+:¢L¤šdJŒŸKÃérxA’©¨i½ºbÎ#b†ÌŒÓ5W&ÊE*}zÌ ó‹¦˜ •,hÊS®Dè|Æ3¡ èZ7×\;L#É°äÉý«;žó)³oÞ@†¿e!³…Ó™¡zØ N«ÝÙÿº–*‚ËgžFÀ—i“>eJþÉC£”œB’rsˆŸsY..œX wø͘2$czJ¤Óp©“éA°¤Ò\S ÓÙ#Wj±—‰ ðÂM&®%Gdl^˜âi!s YŠÂDB%sp0ÄÒ(Šæ2ñ¢„8·9qÙ4\͵eéR{7¡®5t׶H,¡AŽîéF„<Õœ²=C©—ˆÖ÷Ê•„èJâÌ ª>q½ZUyù¶Ó'©Jœ:š‘(’™um€þ‚fÖÞÍÿÎÆ:èˆDÑ&3™!º³½Û$¡Gn;,οD°ù¥?þ|?S÷î¾t‡ÃîÝøáöf&¡åϼ@³!ŽàKÍ1” ·½áÅgxuÏû7ýñ‚¡«þø®7ÑÕýº4èÇý‹ÉMwHƒÉpp?ê5‰FÜ’ã%Æó»""±7L$º’‡”^ƒmÑŒ=s´@ÈųD 1ÿ»¶%Kd:u Xe|û1¥ÒøX œ>ÙF ¿¼¼4§iÞ”j$†Κ?s Ï{'Ò0É#¼V›HÈæì¬"Z1Üb“°aXbÅÞ»ˆÇ"åµëÞpüÇywÔ«µ[-ÏÓí¢[ŒÝk·,£ß¾Ò©÷‡r,-i—ŽüÇÃÍÇýÍÇvkóùø•zß÷¾Ñ‰ç½Z±Š0- ŠÚX (Œ›É›Þ¥O÷ipÇv’Qü„-<ϳ¤­ýšòÆmû÷ZÞ®ÈaSüáêTäíŠ|¿"ïTäù~E~X‘ø ¯÷ë·ý’ÐûÛ(¶Œ Ïç,|"6e"õ^s?ÜS•Ëáî[b­roo‰µõ&7Õüý(¦BwlÕN‡ΙzâÊ+ÁUrŽx©þ,EÔpµ,[úâÞVz`Ôê9ÁúY¢ `bªï —‡a%îÑÑšk¦h¯ßÓ†ó_™Ÿ~ïzkþVB4Ñn‡QÇ.R#ñm`Ïk>ϤbJà ×ÇÊ3g¥7©xë>â&ÏF ýÍÓÄ¥¡tžo‡ëAÿžpŒ`M‘›oë㆜ê«óqüû´Dü90fѽí¶vP—öa§Õ*_jiÝf÷”Ztâòü Ÿ6'´»‹û†k/»$I}¹ðûƒ8&ãge³1àØý»ÂÈÆq^äe«ù‡µ¹ÃÌ“d’]¦25J&o±“Ë?&ƒ²ß5þP5¶)+{ÈE½ÊÃɉ ¸Ø tÅN)mww¿Q ‘œ…Þj1Â.åÎ&Újs™+÷=@õvËÌt£˜pVî)7j5kvL{gnNn‹9±FË·D! ¾Hs^ ¾°‘˜ |A~QÂTʘ ˆºQZº ]n‘z„ïtr½N}êö!n·Û|°6Vïh(ô¨J×oÞ¿¿8óè6ˆrxœuRÁnÓ@U-qG*½V€Òb”¬“&ŽÚKJ£ÀjsDB›ØIVmÖa½mNU¾!ò¿@9ÓéÀ‰O`×6ÍšÀh3oç½y»šŸ[7OUöKØGÿ‚ñsâ,¢)džLDÄA×{ûSÆ#¼ÆûÎI¤z­6›>¨„îìBöC*üÅ ±øúl#Í¿ojßnïÏ«6ˆ ÇFͶ¬JÃ*ÙUPºÓÞçãöY¯t‡YÖòe=_رùûæ]ù8©Ýüu+žnüÒÎT4D *YT“£¢ià w ¼ià-wW8©xËÀÉÎꂤhš“?y)þ²éÎ 1Œ0…3Κ‘LwÝxë?5Œgórý¥ÿø™åÍæÓÂ=âÄ·Žâ­â‹ù›ó` “•Áå2Äj­êz ’¢Ü‡›¦!O:Ú½I0¢ŸøîÕ„©`\QÞÕ“‡"œÀ;qT£/GcxÇLóÔ.†Â„ßå˜J—#b}:8OfΨŒ“yÑ8œíd,5oÆmä±³@*×(+8^{úiEËYþ°žÊéE8: ¨òÝZí¡‚zêùZ % 8ª ¹.ý̟η„xœµWmoÛ8þÿŠYݵÙ–o›Këiê$Ò$pôŠ\PÈeóV–‘ªÏØíß¾H²ã¼,.U G"‡Ãg†Ï¼°³[ƒ]ˆü íâÛ΄ýO¶¦ž`œ‚ ãßYÖV3s.ÿLðYŒó2ÑÓ ç R/ó¢ˆEÀcɲÐóYe½ õZ)•ø—ž?çpö©ß{àÞ€ŸÄ2KPC^àç"õ¤7˜ Í‹ý%Ò,™eÞº˜|}‡òržà,ûδ6¾H#ŽÊѸ̋å m0J>ÇÇg¸êèãè|4ùŠÆÀÉhr1¼¾†“Ë1ÁÕÑx2:¾9?ÃÕÍøêòzظf*‘Oû=T‡ˆŽ ˜ôx$*~øŠG/mÀÜÃü”1Ÿa ÀÃPKWÏ>[£Î‹’x¦PxñŽBˆé€@Üï‰ÃHáårÙžÅy;ÉfHë/PZíý(p[!ž´çÖ‡">½7†Ù‡Æ*ƒyŒ 6ɼõ1Élciá…5Aª!Z.ÄX w&ã›aíàù„&ÙìJ%J‰ó›ÊºZ`3o2ÑþðËúk©×`·îÉr…“ÇöÆBEˆnÀtcÅJk¸oÅÛ#Fù˜ õ<™p»U÷N«Pv­Oõ̾1µWIÿ4Zƒ¡ ýÅgoý³ßl–Ñs¿¡x-õ^‹ë3^"ºô¨Íï«–¢êšŠã6š y—¶ q½ÑHìwÏ}Š’- ¼! =÷Ÿ#±]­Ê­TM ¿éÓ(ˆP6~zÅxj”¤s ïà-Ýéºôö»óÆyë¸úŸÆÁ"ºZƒñ™/Þ׊Lä%‚xœÏJÃ@ƱâÁµ½4±mŒx)¶Š¢Ò Šÿ]¼¤É¦MwëfµÏzÍ“ˆOã+ønR/Š‡Ý™ß|ó½ÛÏ…§µU†Ut"75Çß4Éô)õGÌoï¸ð9ä=WÐ=ŽT¬QC³}x‚‰UìÇ)´K}ÀÓYc“+Ý‘ž *èÜi.Å=RÑ].¸"ß1L*œ|LØKh ”¼æ¾Žw%»R8‚ëm†ävª‘¸¹™·«œž,I‘è¶Éém3FB£ï‘€u/)°ÙÒUñ iåW櫨UÍv8ýò¡’(_J^òsÀÀŒÒ!¬â•(Ú¨³•=)„Y%3-1î‰COû=8Ž3’f—7B©`¶à¢BÃ@u”Ëd ¤è± ¸é¨àäü¬}~–r¯ ‹Og6ÿ"Óè›5ñ˜~Èn  .i/ºT¤yU°>6‘ýòÈÁZwÝïÚ#Ëž¿$ZÿÐpÿÖHÏ#û6¦¹»xœ­XûOãÆþ™üG­z•€ó°t6+Q RP´EUµ2ö$žÖ/y&r«þï÷;3Nâ$d/T ö™óšï¼fÒÞ¯Ñ>qüÕ Nð¼÷«H2ÊƤ#A®÷îéø&…ŸG2Pôè+RÿüW ùM-ER~C¡ä$źÎì²Q‘û…Ç"&™jQŒý@TäË[¥YjÙ³|û[>>¼¢ Ku‘A¾  ’9Û[šÔBiÊ‹ Þ%ä+5M„2:ÆÈf2˜ýìÕ¿À÷ˆ= ¦E!RÏ)ò‹°9“ ï̈Y—¥‰Ow×·Ôiþlä²4.·&Uûs }íS.SÅ\­¥ˆÛa‰ó¡»¢¸–â­(S†£Áí/‚ƒ¡µOçY>/ä$ÒTäu\¯‰.}ÊŠX]‰4~YÊ–ß懭`Ç2ì B§9€À¼“ÎHë\´ÛþO`¢Z!"7R¡Û…¯òGQóf.ÛV å†ð³PÄÊÇ…¤²±žù…8¡y6¥ÀO ‘Jòqªáƒ&? ÛYAIÊñ¼Tò”wo¢†¤JÔ"_?ÝÜS_(…µO"È<º›>Æ2 ¾ Dªò„r¦¨Ñ|\hdÙKvhX:D—LøZf©CBb½ ÎW¼Swa­ÔéPV”zê¾æ”å,Ú€ûsŠ}½’n=ÆjÓœF{”å\AЈýÎdÓ£ ©ãiì”ÀO_®GW·÷#:»y /gƒÁÙÍèáü:Ê°*¾ «M&y,¡›+üTϱ‡RÉç‹Áù¤Î~¹î_°º¼Ý\ ‡ty; 3º;Œ®Ïïûgº»ÜÝ/ZDCaÊ»Ôñÿq› ØPh_ƪ‚ÃB¯àm¢,Ñ5 TbH> /Ÿ¿8¶¥:?ÎÒ‰`‰0ü½Sši‡üþÀ9ŒžÍf­I:meŤ[ªýñM ª]«ý(Ó ž†0«t(³VôqËÇ-zÒ:mš"AÂM>ÞÝ: Å—n˜Ð2ë”Ä×S*¤%RkŒqÚ PrQuã½Ñàþ¢ö#!’c™ óºWw{=·Q¡^žõ‡–ìŒf%ǵZ˜!`ÂN›Ê©¢ÓQ£Iÿ•"¾¦LÑGÚžÖ%þÓo>€°`.üPQ½| ÅD5j×™£§EjÈ…Ï_ﮩMî»N«Ùjµo™ ÑæýÙ9{p…Þ-L´âŒÔWMÌD@wà%¡ý4›RiÏO'1Š>wè©ãÐO.þ»†‡]Ž¼C‡"8t3ÄãêIÓï^çÞ‡5Fõÿè†á`=‚W~\]À ”aëÍ:ùqsa™¾"'2µN¯Q•J ²ãà˜ê}Ä Â¤#^köx ±Ý¦+Ö3eQ€ÙíÐŒîS§udôÕ¡ë9Ä VzáÖsz½°]þAé²{†þ¼ò†#Þ»¹ ̺wçóÎNãM¯»i}kÜ\òÕ§2mÌp«Î•3…ƒ‘s4ò'Ÿ<»¾1;Sßôdû:ênÐ/äÇ6+s¸³’5Ñ2W+̇G9÷¡ |Êt ×sÜ#CõD‡Gk>ã<§m}Õ›œ6 Úiïl®8\Ë÷÷àëíÐûBÍ®³¡±û=G›UµUµÍ³Êã]*_¨mÛÉ÷5Û²ß\„ È.%vdhÄKÕÝ;A{à~Ð:懃ƒdÕ³óÍŽcæ‹ië‡2üÙk¾ÇÌÇ 0üDh:=¸`Èm¨Xžç˜ bܶÛä™SZ馷ËÍP‡¥³Þ.gw‰lôÅíÚ«ŒŒE5+œ0ój/•L„¸B¦Cù_>¿Ùs+ÿ{°Jª^ôì›æÆb–—ugÃâá;³R"Ô«°ìÓázAïÛBN1îG]¯lAœ9ûoü €0T~óòÆ·%{äç}ð“_LÇŸ÷ñü~ÿcí¨nOæµÕ]zhãÓØh›j\y+«æôtU#ë {ÁF[÷†­4šæ!núK+‹C½=ÏßÜ÷û ‰YÄ_°Ô« =sj_à/˜êng‘~DµÕõÆ^fþ9¾s:¶¤xœ­VYÛ6~–~Å E[+ëµìÍSöBÍ.¼l/‚ ´DÙleQ )Xä¿÷]vŠ ÉCô°æ 9Ão¾9¸á[ŸÞR,S±›IëzÑ)dïÏÂ:”*çRI”½0bE£ßWTX•-Èi’Û\µ’™£rK6] £taÉ©YYL©p2‹v]’.êá_y¥óQ‹¥£NÐIprŒ?ïèV›Xgt'³X«³ãêdäì10@“Iw ?çc,³¥²”(„Šß\G:A@<©’¥s¹= ÃJo%4ÂæsiÌî8Wae…E&¾Æ;OŒ”duâ6ÂÈSÚé‚"‘‘‘±²Î¨yá€Á1i¡6´Ò±Jvµ¨ æ„Ü’SbV–Q²pûðLci-öne&H驘§*¢±Šdf% „Å»”1Íl{À¦5 ºÑ¸B8¥3ä …Ç5²™Þ5·Õ>»¤Mí§#GbHçlþ®ÌykÝû:û cRYé}©sD·„GÅ5•¦4—¨7™i·ö€óôi4»{|žÑðá…> '“áÃì嬬A]¹–•7µÊSçΈÌíCíäþzru«á‡Ñx4{A0t3š=\O§tó8¡!= '³ÑÕóx8¡§çÉÓãôºG4• NÖ>¾Ï{R&ÄÆÒ •Ú^z ´iLK±–(Hª5° ŠÐ?œÛÚH5Z’ hÞQB™v]²À}Î5ŒÞl6½EVô´Y„iåÆ—½ŸÙP¡ïÿ¢²(-b\k]¬toyy *2$>þR×¢†öÐzgCŒY©c™¨LzW/Wãë©7è÷û¾¯0|VBeÀõÑ&·t†j«ˆ"¹mnÐ%wRîð×®VbÛ% «Viخ˖›™E½¯›•ÜŠÈUK§H,m„³P°&¡NÖTº"§N@t<|ΙÎd4¨NçêN=EA? 3²©”0¼†ôAX™"øróù…tšNb±£ÎoÞÃóx”`þ¿y²ßÄ®£ PÑsë¿ÑYƒ›V`ë˜À¿ùâÒSú5þ+{ƒ˜ƒÒ w‡¹ºàJÖÎ1ÈûXAâ _Ë@[q´aË–F†SòxAýí™Ü«'HMr¨LY#—Šж²@ œSU'%žmEy…§>zvxø@îDæ#Çñ;€¬m$ˆN,ßÅ2½ÿ¾˜ÖÖ¯^mw|IwxÃøqœ‹¹Â{¹C_fÅ=m›Š4E[Ö÷¾‘2ªËîUd4ò 3ÄÎì–›ßJ§ÇevÍóƒl ò Cgñƈ<—1_ÅÐáöÁGGµ|Q ¸Y¦1Þ÷J¦Â@—ÌRà{¯lÁ5Ðvd„ä@déóÞñÜHñoQ¢Ï~½h"éAÃzýÛTw°wtÔÔÞGõË7Ô~ιXö~¼ªtjûêüš>±/Ô³_U¯GõilÚÎùÈÉDǼ‹{t¯²rÕ¥{±­WÏå¿7µð¸Þ¯¯ù®FbC,d-ÑÇšPÈ'e+ú*¤^ÝjŒýظ ëÎèîû,¨ÃH’´°Kê`>ã% Únä>¨†Q¤zxqs~öÿËLù÷±áxœ½WyoKÿ>EmVŽÀÃv"["Ø$Öúàõ³¼(fè—aM7&(/ßýUu÷\»^)Š%73ÕUÕUÕuüÆ:.Â1xÂn5šu·ƒ/…s|ñ×ÝoH"–^¸ÜD|6—PrËÐlØ-øF^Àx,aPG¾_óGŽæ\À”û ðwéDÂ)¬yăÙ=W†Î¥\ŠŽe-£ðOæJQ÷¢p†fLZ‘#–E›Ú’[Z Œ/ø+"åÓˆ1áT®ˆu`®Àuˆ˜Ç…Œød%Ñ NàYa‹ÐãÓQƒäyrÎ@²h!ÈJzù|û×LÜûÌaLïWŸ»pÍ]ºE1gLb$Û'ƒ†Æ è‡x„#yTqÜàãïЊO3:«FFOÉ‘äIá’DËhþ|G¦ÒõýÑHö€Jû<\¢wsÔˆþ®¹ïÄÁJ°éʯ ÈW£/w#èÞ>Ácw0èÞŽž> ¿œ‡¸Ë^˜ÖÆKŸ£rt.r¹AŒ’›ËAï Ju?]]_žÐè_n/‡Cèß   ÷ÝÁèª÷pÝÀýÃàþnxY22Žÿ;îSu‰XI‡û"‡'¼zÖú̆)à2þ‚¶:àbþ¿ún:ǃ™ @a´÷j A(« Ðî”ØÂëõº> Võ0šY¾Ö!¬ó_ZPV±øO¸þÊÃc…ôxXŸŸçI>ŸìÐx ·iäIž&±[%CJÎ1šFC¬–6ÃdÃ(zlÊ&P^?£Þ×áeoX€FŽvsu‹4;GÃœ ±™#^tG—hå…ïnG_ ÐÞb|*à$G{ºì pš£=Þ#Û»iÔCÒûéÓM¡Ð²‹Å¢X±.6Ágª$ G|ð<†3øïïúÕdmeV[­w´öûð> >K¥èÄõFáEpýÔ»PM1|nè1‹ôóËrf;{ŒK䉶J9÷&‰ hÇãrñGòä‰]…Iý%oϧ&ØM¥(ô5±‰ÄRI‘ÏÏ¡]6›eŒ‰ÝP,“«( ñŠÖýsÿ%Pè\oéÚN£Æœe¡ö2|üH'V@ÓŽMé7·9‹R]Ǻ!ãnѲ•~5Ý0˜ yŒ8¦ªÆÇcþ}Ý*QdÎRÕÕ<-^.“¥±v#ò£XØ>N½!. âëÀQÓ«Âå÷%¢(æuðòŽÍ?ªðdü‚¬ …œUº(ò¤P©˜‹ù`Nþ©~ƺRQÑ&¾âëc°?¢j_‡óµŠ^Ê”û‡ñé׆RëL]H‚©7¶"ªâDfÇ€jë«j5ØJúÜýË$>ó –üwèw¯®ªŽWcœ’’Êûù c!{–_‘°+œ–W¯Iø ëm©W$bÇѳW†Û–Œ"8‚ æ»"•Í•$‘5ù€µ&<°(Ðp$°2âë"„³‹„}oÁ¤s1twÊÅTä$MO„°Sµ³²¥‚˜墘ÌÊO²æ«ÄϘuR¹Ú8PšÇ|TO·|ŒK„tú3E…ÒíÃõµŽñl¡NÇNÿªð6®c4`Ç0OÖåâ«`.ò°Šð) <‘á¶w¸<0Üø”emî°â§bdxé1ËÜÚÕë9ÃLY“ámïòâÇ}ìØŽ0sšmC­vvÍnfÄOvÄ×xTF~ÍØ7¤l8«@ŽXötGvðÿÕäÊÕÃP‘³þ½ë![(Ð µû(”8óäN·š™™Öi7ËdG2 vˤXÔ_˜.%…£™[ÕÝùŸ_¿¦ð‘ÊÃø3Ópµ„’N!mœP$€ÂUĹMcMY:‹fl3~Öñ±¥ö°ÜÅRñ  6¶75á»èE:”g¶†O<ßiVæ‰ÃÚ’â|•ªˆØ~] Ï*Úw„3Cˆ££Ïä-üÊNúU‡Œ ‘9ãò«ÑWƒ) “}Ü:ãi¨“ƒNAvYžàåÃC2'I0¬C£®s`Þ5ÓAÔÄé[ÛvºmïÙn¤ÛdXloÑɸ´÷ßJ´öèo§Ûí=Û§éö阾L› U­&úy[ÒÃè1C©sãmlÞß¿äxœ;Çý™W_‹KAK!-3'U/Ùj¢“‘îÄ@1 ›‚¢ü¬Ôä’b‡”¢üôü<½¼Ô;.…É™&6°oÜÎ _\E¹ÍxœµVmkÛHþÿŠ!G¯vëÈN ÷Ái{禉cHãBà ÈÒÊÚ;yWì®bLé¿gV²d§=î…6„ÍÎ<óöÌìö^´èIkδ‚h€¯“ûP:J´¡±r˜"wä„u”½6á†Îh<ŸÑF¸TÇøµ d–…NÀ0ÒÞ’ÓÞzP‰Æ§w³Åp²ÐB“)¹TÚÒÁVP¤•‘£W4šŽï(— gz _ÂtiU8ÆX D'X=x:z¸[Ò¦Ä&üS-pêå0ÛQˆ¯•v)Yኜ &#×)\†»€ÆI£Y./œ¥PŤ•@…(…Aýém·BR´ÓE8Co¥]–>Ï2ŠŒ lªó>´­VÏ­­µŽƒª:ïËÌ…TkUáJ­ºäv¹ð:YçRÓFÇ‚úU¨xk¤cyÿ‰æ9:U)6Q‡ê0òM]ë}@3ß ±ï}—?ÔàkgçßöÏRÎ5•QJ¹UÜÚ‚%äЀµ0(ȃÊêÔî¼f°o¶ "ïÅz«8ÔuÆebªJgE–x{æ|&œØ\ˆ¸ËbFÙ»6"çV0˜*6+¡“&‹óHŠGþ˜(Õ-ºÔù®äN;êЫþùkikE7BÅÂX­ŽÿÔÔþ#”ຟØÏL"3OÌ–(NA´MnòLÉ™P¹r¨@>^Í.o`5|?¾/ ]“«ùœ®ïf4¤ép¶_.o‡3š.gÓ»ùU@4œ¨0þ¹î‰o"  ÊÌÔá­Ç+²˜ÒðQð”ÉSb…ä»ÝÛ .Ì4f— PWñb+íº˜9Ao˜Ã ðv» Öª´Y÷²ÃöÞßs z­ÖOREY=ùƺXê }w$âe õ•ZœÉÕ±¬NÒV«×£{抿Ýü>ö·Î–)µ_¡p⇿aC=܃ժB ±H¤'`Ó§éxrrÒ¯EãI)9÷ŽÖ™^…Ù%&Ä0òÈKè142\ayࢋøø`ù±Ú¼ìòŠYeˆ/¦Gñ¥ÉáËÔ&ÇÁz–¯´(Œ˜È.hµ¬ƒQÔóþ?ŠŠÞ⢸@´žd›]ýâ|·î>íó£–ñ¡'j³¤ÓúÜ"Œ÷Zº0»÷7X»*p—Î;ˆ‘èåËãØ/þÞ¢Ï_ZUb? 4AªV#î;8¬—íö¹SÕ¹Rž…Ö=é(jï <ç—µ;ô¥Á%9NÔ07hF—N—jÏKÿVk®4zfW§Ø Î@KªíǯSv†°Œ\aÞ8üù…Ýcd>ò³§i þ™.¥E}ZŽL›gR> ߺµÖx²øtõatõézx{;žŒºôó•þszÀþ™ñŽn_\4Žö~NùåÎ/¢ è”$YaS®™*;â÷Âh7í|ûöx.;^ ôY¸£öy¿ß¯koô/á Ü X0ôì—ØÿátZx v¸svÈ—}šÇj”ËÓcâ}=†¾.U¥ú~ôþölÔȳ¤xµVÛnÛF}¶¾bà"‰”Ȥܠ/¶“Bql™€* ºÀ0PÀX‘Kr[j—Ø]JŠü{ÏФ%µm‡Ðƒ8œË™³g† ßwè=)gƒøÿN„ò”K‘öÒÚªôä¥óTZ“Y±¦3Šæ3ZKŸ›þrg¶äMíV§ Z:I>—47×ï•UQœU% Ôÿ)1[MV:å¼±žÂ“°’ÄFbUHNj4)]V(¬´ ‰b³.U!é-ÙJ#H!sª»Q‚\•˜^ŸëjN 4 ÜY ³k¥EQ£;ÉJehmIªJv=2186Ó6WqN¥QÚXq¹©Š„¼UY†¬‚6´0YpÜ5s‚ª ëFAM&µ´ÂK”E›/Qhý™¶þøѵ)wÈž{êÆ=úypþ‘FÆ&àâNêDZg4»¾ÎÅÌbʬ2›Âz2)m•U:›ªš®ÜûÒ]„!¨þCÆÞ 8 -}h…+WÉî¬Tásþ4½½$âä©•’œIý'}A;SQ ­L «VØÇÐHñáxTºc„¸`®¸ûš\>KÇ(™éÑdIcéžjŠ šV«BÅ4V±ÔP¡`ùÁâr™ÐªÍȱ· hÞ¢[ƒÂ+£û$U­š øÆ=}l«59ûdlƒ¬ ‘ K¦äÐàï¨ÀA[j¢Û“ýû¦È¡î%7%ËÑïV­$UN¦UÑoÊ$zˆw÷Ë 'ô0œÍ†“Åã%ü1x*7ò9›Z—…BË`Û íwè¡IòÛÍìúQÃ/Ñ8Z<¢º“›ùœnïg4¤ép¶ˆ®—ãጦËÙô~~ÍAXirü7ï¼Aj±'Ò U¸qôÍ(åb#!Xª ° ŒxÉHÿßÙ6XDatVð¢7àRÂð÷É÷kÞn·A¦«ÀØ,„FX.üüªv:?)¶Ë•ó‰2AþùÈÄ£ulÃé¹%…Z»µSÉÖN' éµ2šF÷Í¢ä ºeɠ¯p8©‡£'^ˆáÕDºZch4‘©ÒòäËr±¸ŸBEŸ°¼/™‡zo®wQ»‰yi½ö…”8ØQ T¢.[z¿:D>ûì|kÁý0`²~Åü€Ôè“Éæ‡ýÕ¶]#‰–|l攺­.çÒãßíÑ z „i!JKÞà á÷ét©[ ¹:¢¿ 7îw}Š‘õžØÝz2z=4§²p·šÎë[Ð{\ž¿Jº{)÷)š,žn¾Žnžn‡ãq4õéíÁá}7Läÿn„€È{°{y¹'¤åã”?´0©¢GJÓ¢ryÍV9w]·ŒOw½gÿÓñ,pn¾Yˆuσ—Ø—bôÕh<-fšÞü’Ô\©¶%ú Ôq¥=óÍYð ~ëü k&!çFˆxœ…’¿NÂPÆ#Ê]ÔÁíHBÒZû¿„êäĤ‘Ä Ò€mÓŒ!M}‡¾‚ààÄê8ù.Nž{oU”K¸œß÷{î×ózðqô¼ÜÎ÷+O[Ýf/_V3¤yèeX€¢Œ§á ?½gAâÅÐU{àBJ(‡»‡6-Ƴ(ÑJ,šØ¢o²dèÑÅ£äCl1K,¦Ð’%V‰Ç_c—Xl±ÅÙ`Ù£‡{9=Éß*7ùËÎ<‡Éeà5 òp €$Øïûš&Z–Ga ÕœƒŠMèé šxR<Ë€€?#"è¡~¥[QQyÏ{?ö!_ù/™E É?eZmw®ARó÷]8Te6Û/¢1¢ ˆÎˆ. #†€˜Œ˜b1b ˆÍˆ- %uG^ÉÎue<.xN,sD>©ÚÙŠâKóoä…jAªþ$QôÇkÙˤŠz€gMÐU\³€u¯[PÈ[P·†·AíECôaéÛ°ÓúÇM¤¸üÝø/-¦ç¿6®}Ç8¶Šƒb¯?aÑrYJ£ŒqSâ€-PJ>äUg¾èxœ½Y{sÚHÿ>E/[IA,žvì¬R…1¶©#˜âQ¾TΕÒf-$•4 ¡výݯ{f$$ð#¹ËÆ»ÁbºÕÓïþ͸þ¦oÀµìªi›NsQ³Nq©0eßDunF̆A÷ìe! °|›I–%ÿ·YÄ2 _ñX2èhy0¾:—"F®)ä{k.–’Å´m.¸ï™.¼…y,„ïEàø¡$ŽÍ(˜³0ÜÀˆã[¤f×6!_,”­ ´ÍV?áÊm߃kæÙ,Œ|¯†Ì?ç‡v•f:Üedk`†|Ö<äÞbÄ¥¯–BÑi½„þŸÌQÍýªá1Q3ª¯«·ðA„?‰ î„ŒAä;bm†ì6~ –éAÈl‰£‡P¦g×ÑI+ßæÎF‹Á嘬—®,\E¤%}¹Î`À¢iWÌc!:{Ï]nÁ€[Ì‹0 h­DKŒá<‘Hï^’B­\ú¸…I3€a Q"æD„ßá0ÙMË4Àµœ²)È’ü€^­ ú THß®=î­Ñ6pOJ_ú%JD{×ÜuaÎ Ž˜»†–€üpÛŸ^ß̦Ð~‚ÛÎxÜN?¥Tö•)i|¸…£q¡é‰ Ú …|ì»×øVç¼?èO?¡1pÙŸ{“ \ÞŒ¡£ÎxÚïÎ1ŒfãÑͤW˜0™ùZÆË~wdѱ6&w£Œ>aè#ÔÖµaibA…ÌbXX6˜X}Áæ»c«Å™®ï-¤R£¾}<_¡Þï)‡1…×ëumáÅ5?\Ô]%#ªø©U/çžåÆ6n ›ûµå‡ü’ËçùµØÃd°wùÈ’üšà+F+™¥ÔàãÊ Z‡æI~û ~ÛÁbr Óñ¬Wü0@÷˜üZ(7Ûíf%³zÙLÔr —±q§X,Öëp!éÛŽ–vDÌojˆÜÃ"pL‹ÁÜ7C·Õ;—_Î;(³Ðl4²‹ãÞE¡PÖT8€ãJ–z5îõ†YòIŽ|>@å³äw•ÜŽybó0÷òø6O=ÊS'yêÛ¼ä‹ó£<½UÉ“ßæÉÍòqžÜØ!ŸäÈðG~óIoÐëNsyãþÕuž¾³ÿÍí0¿C^ýÙ(OÍ;nлœæéè:™3¬ÚªJ¬¥š–жXŒöY [ºž¬D­»ôûó»;hCñ¯"š2o40IŒýÇÆc«ÍfS?âC³¹ÿˆoáãœI¯\Ž-«»g»ì4Õ s—Ö¯å²d—­+ŽÌ;ýiÝb·oЮr ˆ„òËœ»‹¡¹bé'À‚”±càà5 4“ZÁ«›§‹£è?^É€ô%Ô°ÁŠ8ô ÷ïþôËe§?˜{¸þPL ‹¬ÐwÝØkÿQµw³Æ­ÔžÐF-KðÈO‰·²ËQg™oöñ\O§#ìî·ýqx5ê׺7ë¥'R<¿úÜÎ[ etÌWC†Ím±T.—šÎc>¶î¤?3iø‘Dy˜³]õëPÂ1j+ë8ýËx¯È•")¥$Ù’·¶¬ˆµ  ž…#²Œúð:qßçD;Ck.u‘JËïw©~˜×£Dçršä4 i}%eŠE”c@a•­![ËÛ”¡‹À£¬ª@Uë¡ìÛñR&ó˜87­{—poW¦¯Âç8PT6‚š€T!ŒÆ=Uˆ˜~ÞÄ~"EU~ì馒D)¦sC­¿nÉòÍ\˜îmÈΖÕX3п•VìÀÊÉ{¬rÆYÖÖS¬4Ô#ɺõlrâÁY<Áì ¤_åS~\ËéLuµ2ï©È¢8d»ç—€{2$½BG!!#"t„ÕY„¨YX¿&0»¦í‡…¾sÕç i aлˆ(FhÎGT9Ô£ÙT9;KÖ!yŠ¬Ã%?–5Z5­PßÄNN„¤A¨2Wµj¿oÃ>p*ž¿Te7U³–ЦÛ"K캳àÂëúžÀƶÃ:š]à0GÞŽ¾žgÎq°ÑÕ8ÀÐEˆž­%¢9Ëõ»c|_Q胔‰@šÖ¦»ïÁÛŒÉ$nnõÎCŸfK²p»…é®ÍMDG¡µ|•rJîN­À—Ç1Kë‘d#2c‚šØ$yØ­ú¸†=³¨š˜žàí-¥e@óØ€#$´“¿zòœ¡›úu¬~Pk”ÿeºßVô{\I”ö‡s²¯ƒG fãhN¢Å¾‘6Ù‰¬(™^›\\úa´,ß/_»xˆ \scHΉGÌ¥ªT öK 2«(”iI•aâŽÒ(Ĺ ­RvQ(¹#l!‡€ã¸q´”nÃv¯ý¼^Ò­DY'Ô˜™¶Ì'%¤BSçÁm…²ê61?@1Ò½6C¿@¹ùݲ(Es¢Bô¢IgÌ}i©Y7ÿÒÍ ´€1{Š0Wß3!Ò¡˜ÄmbVKjr¾ÕÑû5³,Q+ž€S»Dîˈª æ=ód:&0&R–c:wÑ-a¦* ê E´œ%M½®š›z~ÇÙàä×mù<†:JfëðèíñÉ»?:çÝ‹ÞeZA?Âý€ÿÐ2|kWEe*""W•¨£†Ïü Œ¢F!é:M²úM(ÖíÕ¤¤ýü¢¼æ3ò°êÀÁ6®¬”ä{® +/ï´eŠÑË›‚~;lý_öŒ¨Ï'ÇÅ_jÍ+<‡Q­VCco7И4>*±-zšQk?¼þѳáÊÄé(¡Ž.,CŸ ðùëç»-ìÑ€ðlû•Š¯yœ®hCƪ¿!M^ñ¤Ç‹G‡XÁ¡ÊcüE¶Å°{Òó‚ßÚty9ÎèÃ,iŸw»Ý3{¾itwD×é¬LùÛÏþhþ-&oƒ)|žlßL¶O0‡DŽ“MÚ’;3(5xÂœùÖJ&ÿ>îÌ»ïK¼½†µ{š-}ùìÉJŒ xÍòW/ÕÏï°ûg+Óå‚9“‚L_öì–2ÀVs欚[^Œ 2´B)«Ìá¼FEbŒB{Òèv4¢˜Îñ¼|ÿ(ÓsyB¾,Â7H¹¨V·#ýù–˜ â³³í¨Ý¹û@oR£HF«ü šoËåál0Hˆ4æ]ß2]Ez¿ô.¤“.Vy=QzÕhÙ§éM‰ê±ú²ÄšIžWÜK#f¥‚ž {Yö³*¼£ÝR©šC»~Mn-è³dÖ}ú—8B¡ËMî$GßY@¹ðמ©µ™5àäç ?ô Tw^ÿÎRØè.Ÿ*xœURMoÓ@U‚â Ž=œ*_zIN(1‘QÔDm¤^¢M¼±W±w­ÝM¬Uù9öÀ€+'~üþ ³nQ˲<;3oÞ{³¿^ü|¾mz8EªŠ±*¸nÎ;Vz Ÿ/aŽ±xk0]7Ê4Œˆ%K›TãÊ&‰0 —!â™’Æjf…’ȵŠ5Ë€YÌÕ*0ã°+-y!­‚Q§¶[‡£D Ž -x3nÂl ¡„æ®)#,a©Q}Æf馱‰±Ã(ge"N¬›5ãÖRSÂd”ÒÌÙ†8.VÄ€cɉFJÈE¢°|%UaözÐSùF—þ¼†wí³ß¿ý~üÄŠŒïn_n_G|!$¯!Óñè:¸¬¼?÷¼‡v8#^]ÞQ0a J—ÆRy#ÿÏSÄŠ”¸cjŠF®É*SknV©m?Gž3­åyk%¢ÃXø.¬y_=ÀñZXt½}¿jk%êþÉÓq‹E©ý`ô&Aÿ‹<©c~hq=7Þ^âáÙý}úy÷ã™Þ‚Ðⱸâv•r¡àSG¥ÕÂ`Ž©ˆƒ™ýî¤[=™OZs!³ûvg‘ð´Žðb2 úƒ`úéãp^ ê¨ÞˬÝir.úÝj·Fÿ Û—² ü³v»½ÏkînÚ%ýÊ>å‚â'£+xœuOKAÅ ²› ^zÙÙ̮ӻÑU‘ˆGAÁó:S³Ûfìº{ ‚_aï~‡àÙ“Ÿ)÷ÔŒ‹½4Ýõ{]¯^=®üû4Ýè(tàÉ]s/Ý•ûòùÎ&Ïy8­RΨWãï Ë•'Qßtçozêô­ù@?ÉY*pÅYUŒ•â(“&µå—7ÎìŒ'í4B?Ñý®ü`—±Å1ÙŒœgÛÃ^éø’Òà3Çc©X ÷?<,Ín[Ÿgeëã쮵z±nlZT2ÍÞóؽÉRÆ\ŒE;R¿`r´gìøÄœR¨JØßGWGBk—ƒ}ȸ 1Ö˜K?û²¬§xÙÊüwCÇèÇÄØŒ±ãkŒíC¥^‰Ï Ôˆ‘Ô¬Þü;*}t’4ü=­§‹¨˜ëþ"(céÁ"(ëÍEP¢è­Wpø†nKî¹ig£Ž›³C{8Œš-fTŒn$TÃÕõ™·ñé@wxœ’ÏNÂ@Æ/\Øxñ Fˆ¦%Á£“¢õ¤(ñ ‰)íÕ²%ír0Hú<‰Ïàݧð¼;»Ø"ØDÒšÝùf~óíì~í¼ï6JJÀhX¶Op•7iÈaøÃÀÃÀÀbà{zlŸñÀ÷<ˆ%£6§pøˆBÛ-¿Zî~âÈRtèÀe4ßhiF3_xùq‡±å2PT2#bÿ俄ܵŸ¡†) Ý!C¶PúSÎ}¢°øÈMJî%É®CHùt‚-oâr|ÕC¨¨‹Ï\1ê1«ïQaR&&}XA•½U¹ü‰c+µšŠË™L‰=Ô1ÙrÖºÅ@A“¹Ò`\ˆÁ=öÚª<ü^}átñ\˜%FÒkãH‹z!M$9³Øàq <¿½3Ô4 ~£­‰-ýÂL% !‹ÅÎõå•©‰RÈBìê-ý Mn—ñT`ôÑÔ:fŠEÏbQ[ÞsŒV7­A¦›nlWÀÆÀýUAòâåÿyôŒÌÉ7·€!µˆx­UmoâFþ\~Å(§VpGlH”S’´$—T. Š"U:-öÚÞÆìZ»k:å¿÷cçå¾\UÅ€Ï<óÌ33Kø±EÉ<ŽeDÇü»z¾ŠGI>“4ù‹Æ—_Èèê4U4-s'¼ ‚Îì?±*UZäù– 㼌ɛÊy&\±”Ön a‰±åÊídÞÇa¸ÙlÛø*06 ‹¬8?? ×Jn¼)TÀðGqÚÿ|pô{ÿC±û®_˜U¡r¦© “óÆJRžœYÉM&­ì2M*zd»Iž–Æxòj%ëre´ýÒ{¥SöTšBé£ÐFAn"‘Wø¶Ôúå=ëø¥ˆSkJPøí™[±….™§vÔ¡ƒ^ÿ`‡tml -o¤Ž¥uFtRXóŒ¼û3¶&…EK”÷y˜á‚õIX)|²´Q¥LwänˆCG*Á •ð¹Cû… wQøQ—‰Yi€<±RBüÄo„•Ç´5%EB“•±rÞªeé«ö W¡±´2±J¶Ì4‡~ÒV“ã¥]9fÉx}{GcéÞ]K--š1-—¹Šh¬"©$²Øâ2 ß²AäØ+&4¯ Ñ·Hxet—¤Â{Kktg:l²Õ˜]2¶fÖÆÄ K¦àÐFaK9Và9ºÙ„Ôx):æyb>™)x^ˆz7*Ïi)©t2)ón"Ñýhq3¹[ÐðöÙðvñ0€¿Ï ÞÊ5FšÑÔªÈJ†ÚVh¿E 5È×ËÙÅ ¢†ç£ñhñ€bèj´¸½œÏéj2£!M‡³Åèân<œÑôn6Ì/¢9ÄnñsݱÓh"V.–^¨Ü½Òá­w`›Ç”‰µÄDR­ÁUPd fZUðÓ5‘ì% ðV&ÈÎ^™påéL<ý:}ë–DÚçoM¥ÆžÄom+á3¶¼JЬÜ[GÞ»éfµóe¢4ßÞßøö¦þçVKiO+AlwZß[Ø8œ“¸KŠ->&Ôn'1bÎ1_í½Ðm]å¹0—qõÑ QGšJ»×¥É·Ù—ûY§C'Ôë ž!‰’…z@¡èÐ¥½;-–|IŠ2¡SYýÔ0Çô«û[ úÀãÔ®Äê ‚³Ò—VS¿:>1ÍU¸D@ÐÚhY…íü£Üà6À;>—Kj´š©¸.”Aùÿ²ã(ºžŽ&ÿƒjÝ +qYP{׋.õºÔïõjŠ¼BíÁà•€lPèBhÍÉ);ãç§OŠ©ºfÑîû ¸j”#,e.¶ÔîW©8ò©Š¯ÍG ô¬I¹Ë¤èl—}ÿ}S6Lª>ÖEi­§Ö¿pÀ€Lã‡xœklÜpÕP__!$#UÁß[ß1¹DÁÇÕE!³X!9?//5¹$5E¡$_ÁÉÙ7Þ=ÀÓ_¡ 3OÁÐlòVÓÉØDM¬¹¸€š3óÒSJ€f”e¦§§)äç¹HFMQÊËÏKUšÌʶbò:6½ÍÑìZŒ¤È)éOxœ¥OAJÃ@](BCÝ)n]%­Ñƺ²FðÕ )Ý2i¦™6 “‘XŠôn‚qí1<‡[w‚?ônþüÿÞûïýù9zkκºÈËÅéô’ºV(dÍ MUp¦â’)Ž`2ÂT°4åó÷ßês÷¦úÚ;XGJ&BchY@®dªg°;÷¬È#®ÔD) N¨©-jgÒe‰b‹Ç´ã˜EIK[Ù×Ï9l¾×sˆø‹Ô°½FËt”Åœ€ì“éÓÝ8 Æ!±ÕwëxmòÑÇÍuWðúç4÷z1¶«MEýû‰’Ú86Š2dÌçlÙ„×ó«µyf™‚m³È~ÐÄÝpmÒ]÷ÿikþ¡´wÕ xœ340031QðMÌNMËÌIeåiŠÏ:þÖíìé©¿ýÎNh aËÌ0„¨IÊÌK,ªÔKf°™Q“u( ïmnøYQÎœhõ´µêajr2ó²u3óª|¯¨§D®rï™Ä¿´ï™¿Iô¿¼•Èª€J’¶MY~^sûk5ùUϯOÍ5y“kÛ Tbnj URœÁ û.§8éÊ«sþÎ9aÝê–¨§8fLQfzF Ðe‰fǬ$† sîFܪ®”Éš•ËSSZR’ŸT#ÞøAÿÖ•‡9wŠ64hÌËÍèì͇ª)ËÏ))*y0‘Óøß©‘ë&TH­å{¼âº‚q¶ïÁrxœ»,ûMzÃBÖÉ;YO°e”o^Â&ɸY‚cëd6¾³ÎU Œî6-xœ…’ÏjÛ@ÆuÚî‚ m rlä€ÖVš˜&ŽGÅ®Mœ@KÈa-­-aiWH N.5½õZtë3ôÒ—(ôy =w%ÿ‰)69h5óé·ÚÙoæï.A‡ŽÙÐó™‰KèÒe0 =¶ÊL8xâűN£àÆÜ1Chõ¬.Ä.ãT*”Çä›õnK߯o~ýñä¨Ñì_6¬‹Zå6Žpï¢yf}¬U|aSãR£Y¿j¡è#лU¼L»ûi¯ðz[Õæ»Ëª6ÛZNÃÂùνâ{œþ.¼èÐ{à"Θ‰€ôÙÖ¤˜]†ØÀîÆcOÈ*mˆu¨ïË(ôxœò§;E™še0ÆÙj"UëÖß—1:f¶+àº~y¾mÌDPµvã¬}Òêç¡UïK›sÉŸŠ ”ž¦¦¢*¤wÞýðÉD¶Ï(OoíMnñÞgérÄ ¡£öÈ€Ž1^ ™–~WôéB…&²H</*^[3å¦(%;Ì»‡Ð:£ÏWL8DB$$[6‘•Ü 4•| 88:<Üø×9{Œ/=\ÊqÊã¡LbÔéÉÈ]ì 6 tº-üº†‰6‘î…âÂX­ÚÐOþS„ÎþÎÞá‰î!~ÌE\V±´ÉDþ¦Ì8Ð¥‰™Ï%IQ‹KíïWTÚ/T|ÃlºÆœZ©ô /üS¦‰WDà‘¬ŽÜ‘q'AÈÁ¥uFn3‡0Å}m`¯¹ŒN% g¤I^ ro‰%ÝLfkxÖⳉP°æÙ6‘!<ÈP(+€aZtbcÁa[!’ï˜-KB0Æqæ°”MŸ8`¨´×U´³ Ú”8uæ(:%×Ò?AÂÜ‹wûûj¼$ÍAª=Ö)f#"æ{”I[™Q–4K´‡Ítuÿ´^Á`ö ›Áb1˜­ž{hïbì<Q É}šHÇä Sî„9” £Åð½ï§ÓÕ3&ãéj6Z.aü´€Ì‹Õt¸~,`¾^ÌŸ–£6ÀR9Qbü·îQ^D– Çdb/txÆÒ[d›pˆÙA` „B+ÃIIOÿ»¶%K4Ž) pVùN#PÚ5Á"ï>õ0¶ðñxlïTÖÖfç'†õïÚ?r |Ï{+U˜dÃZÇ¥nÇwGg†¯N÷aÚ½:¿Ñ©÷–‹H*QûØÝ|z?XŽj ð<©ì¶Jý %ox_=œ <“M mÔó<߇‘bÛ$¯hÕÚå+‰ö”ç½tßR¸,…z£tðsV,Ð7¿ÿÜ=kÜ«‡¥{E® Á—nƒ¤ÁEP³¨ö`··às&ènhy>çEŒ•°îõ¦¢ñ¤ZÅÅwªp‰Þä R=j©4a:›¯W•ËXë …%Îg¾4ôŶ9õb]Â-Ð }rêÁÕ•lxÔ@çURpE²â]D{` - ×–$~EÓåÓFû]a‡¦Y’´P ‘W‚_&P]—a:¿\$¹÷:ý †Z9£“™Î×>­çgJZ§Í2QG¯ªó Ge{”¿‰Fµ‰†©ãÉÓët 2Ÿ72Öÿ¨½2Úœg{=Òìk®Ûwdíþ|)laVR—¦ôï\¼ix•4\î¤cÉÆ`¿¼J­šâ'¨w ß§ÛFÙsùbéV/½‚qì–ÜÞÂýtrߨÕP¬MnSfSã"a'»A^#¼Òþ ÁfÚá.z E ¾yÅÇà¨E){ß¼¿Îq0é€ôkxœMŽ1NÃ@E ò¦"¤ý2)(¡CXq¤ ‚”†f×^'£$kk³!„WÀ'àœ‚k1 ÝÌ×Ì{ÿ§óÙIã¾@jEfyš_òìOi]¯4‚]ÀéCYY¸…ÆÝ–òåÅŒ¬§m)s UI[|/ŽöÞO ]’Ñþ8¹ñÏ…à¬%„O‘x"Ž‘©˜ßâ*3˜·Ïf£‰À3Y2óŒ¦Úmk„®Ú´æЕƒ{¹©•¶öað¿Í-kToÇb9®Ûîxàê&ˆšc/9HGÔyÍ—×m>¼îþx2û[{‡¬°,´g,|¿+2ULê€zxœ›Ä}œ—O_‹KAK!)'3/[73"·§¡™nAfž‚§ÿF'1+å̼äœÒ”T›Üä#cCs½ ;..å”Դ̼TNWNNC87Ð(<ÞÉ1Ø•ÓÐÀ`r‹‡‡¾¾‚cJŠм’ŒT˜ ù~¡Q¹BR~bQ —\28µ¤´@Af”Ž‚A…‘Áä•,ÚAÎÝN ×*„¤—Ää)i*Xsq­‚LÍÏÓªtœBb±ByjNˆÎÏK…Y ³kòGq }ó~„[ª ­`0™‘ÕX_<<Ý=@VØ)™é™%‰9áE™%èzŒXõàz|üÉВ̪2?l^뀦Oxœ»ÅùŒsB¢´«‹B~žBIFªB`ifr¶QxfQªBR~bQÊƂ̆ ™Å Nξñîžþ †z\\@-¶†\\é™ù ¹ù)© *@‘É ,Êæ à ¹ŠsRS  ôLl°²ò¢Ìˆ:ù”ü¼T.Ùd(Úä!ª)xœMPËJÃ@]X„„î\(®.u“Ö¾*V‹BÔ"‚¥éËl„2I&é`:©“ÔZDºóþ‡à7¸ó_\¹v&I¥³š¹çžÇœß½Ïüe­$C ,F¼ITµOùCºCl ÑCO3á¶}•¡‡!,H4I0D‘x`#æ|¼ÿlÅ_¹ø-·{l»Í£µ:9—廄b‰KH€ºݱ~¡ÚU«ÇßÛû«'äÏ1´d¹Vƒ6E–«€V¼€ûÀµqÓ•eà!¡žA8šÏ@)fÝq€Ð„2Kcpjò|Ô` ÁΰŒüŸ¥ «ús£™ˆñ%î¹ ú(œY˜ñF è͉ý ™„aÐÓ†8Œîia"•¦üÛ‰¡ÀÁ ”Á0;ãîhhŒ†‚ÁáÅÔd$Â^ ¼žpJ«Uä×Y””–s–ßÇÈôp˜2Å憤PL‰%h¬qûh Šš^…ã±ãi^ú‹1—ç/€¤qxœ}’ÏJÃ@Æ’=xðàE„AA’Ò‰ÁÒ‹XÚ@ÛT›Ò‹—m³iÓMH·)%¾‚ø$>€wßÁ7ð減4!Hë!Kvf¾ß|³»ßÇ/‡f¥€ £ç>+¯ÅFéÓYà‘M 8™spýø”ÀÝ‚Ž! PÆIèâ±(ôqè”_?N÷.ß¿~ö#tî—2¢Ü lÛê*Õ,ÐnÜꊞßÊB3L¨O>u4´B¨RÃ#aC¶õYi"›@³gZ,iHÙ¤Gû„/P5¨Éh ‚Ü}û<8ŠrF;‚[„›d¢ Ás=°³TJYÇw¨‰ç"˜ÝÞÀ–É\NÚ/‚5°·¦Œ\*’L‡N(ÇÞ0¤<·ÌfKäE h±RâKÚñÙ6…`¶­a*0ئÖu%_^ŠZ«iâw%>ê‚š "ïž`'Fƒz=é,)ý%bÌœcq¹±2Ño·œØU`d3m*–Sê‘(5²ÃRâágPõÐú_ôî㉠ÖñƒO2òZžT(žIÈ *"kô xtÕ­ê'’:xœMQËnÛ0¼¤K/9M]lG–•M«&©ƒ¦§y×@  M*&ÊHE ‚À‘/é7ôÔét)ÉFx –ÃÝÙÙ[7]†.¹¶e8{O±w!¹€ÊÀµÆxÆu~["Ï`ççñ¤…0͹¿çÛß‹Yº?z7 燌½2U™ô¾œ|ò¼áêéx?ÆÇãË4gGŒ©ÌâŽS+‘+°8lÁu%û(TöôgãíG¸èk.$|ªÚÇéõÕÙõU€Ä pšíÔB@_Œ0µz'¶Õõ´õâå²/¥­ øk9}D¿öö©£Þ…¡î)üÎ/‹©4æg ;8¯Ôìgé)€ãQxœMQÛjÛ@¥ÄÐh)} )¥Oã)¨ÖcrQ](ã<$Ç"¬±½`¯Äjݸ8Æý†êµ?Qòù‰üG>!³’¢x_v8çÌœ3»OϽ' fš·ã ª­®¿PÁ$R gWÁª‹ÇTºd©äÿ¿ç½ýD‡"j̾§*Ÿ›ÇBŽçËáÛ"X…YQŒ‡8­aÄ[?—×gÌø¦?*þßw>™#²ZBB¬¢© %[!ÖKÙû/[‹Ø¥¨à3!5H¼eCnDÐ1ªÎ+ŸWCƒð\t'”Ó¸A½ŒÁv²‰±è‹»Ývr±yÛ÷-Õkf¸çÁo°›œŠ3»ª0³%Á.wu¡^Ƭg1‡åãHj!—¸;ÃÎòWËìÜ߃MÛT;[Øm_Ct¹`¶ª_ÀÔåÞ¯à›AøꌛüdÅËó০Ÿ/´kfåJâW§½^Ð/ |Õ»^›âŽéQ5Y™$Pk7š†ý¢¬Õnå‘›ö É<û̼tŠi›ôÑ:|òh°û耡,xœ=ÏJÃ@ÆQAp=øç ‡Š”Ò¤‚—¦{(‚(Ä› Ûd¶YIwÃîF-RúyÁ‡ð¼ú¾³iñ¶ßÎ|¿ùf¾âÝqÔfЋFò¢›öIìŒßø¬,J£§†ÏÀi0È3˜ÌZFÓWŽpßx  ëŸødxÆÔÙËŒœZuº!ƒú—]>mÚ­zoûp‰Æ(Ý͇ŒH•U†0x•FªéŠ×”¤r0ãRA²wàµÈ aþ- H\¬Cß•H}­(×ȹùèv·:ÐëŸÅqÂâ\ž Êúû`ù ø„ö£½´7¯8@™bNí£"‚u†²jA™PIÃ0è*£ ×ÈcQ7Z—˜¢s´p•Ñé(²iÎ Oë³ Kêðh7)+çk¬¦_áZŠì’Eesêp™®\¸¸`:ˆšç9€€xœR]‹Ó@}P ‚Š ‡Šl×6ݲ ý‚¢â“ì‚«O‹0M&í`: 3“Ý-ÒÍè/ñOøâòÕ{“´UÖ'_BæÞsÏ9÷Ìüxøó~Ù=ðp+é™´® ¨p÷³4+XµÌS‰Üds#–p!à²@ž×Á»«\FÎò÷¸Èà™Dše¹Œ1ÑW®(gešŽ5ßdùÊ|¿þuë™uFéyg1ñž+¥E,1’ÆèŒK›ëÛË}ýR1öc%ÏmOi‡¥P~à}ó>'1†Ío”ôåS¡­škrÃe-¯Ü™ZJê00ïÓиÙë$—Ä×êÆò¢ëÜjZ~˜†­CôzÇGa! hŒå€$'GŽ¬‹Éõ!ZŸ´˜Qn´pÆDMVD¦"9À {®‰Œ–&tfàW«ë°¢3ÒF£W×µ»Í—;OË›jYáþR³NPòuB§ê?”v©Œ±Tiª,…Š6úaˆaÉ€„YêHÇ bïGǯè´…ÝSLvÌAÕ­1Àv—Ö¹>)îÇãŠuk“T“´°›GÞƒM˜§…‹‚¼$ñ ôn‰ö¸vÞÔÛíý[hö]J*VðûAý€Ë…¢0ýZæ­pbz!TÊBAà½þ§y¼œ°sNºšz/w暬7÷¼'þz›ò[·ê~sìuíýT= Lµ‘x­UkO;ýL~ÅU¥¤Ý¼àÒV¼tSÊ#„( B¨]m²ÞÄÑb¯l/QTñß{¼Ù%µ¢º‚=öÌœ9sÆ4?Tðéâ¡1Ùçjk$¬ƒŽáfVÇnþí"#…i 'DdÑÞÁåé7‹‰VJLœˆ¼¯Ó¹[_6¸óaOtº4r:s¨NjØiµwêüÙŹ6‘V¸*ÆjÕÀajôœì¿‘ÑSZ”pÇ ñw>e4“±Lø7 M^åB©¦}™—>s.µûÍf ¥±†Ò4¡Mǘe=•Í•E™Ê@>xlÄš»},u†I¨`D$­3rœ9bpUÔÔ:’ñÒ#äGsæ9ÉytÂ<زç½\ kyv.”0a‚~6Nä—r"”Y–·Ø™ˆ0.#ú>žy@ò™gš)B'µ $Ï ØXË=vËlEÌÚȪ¡ó•èÔ»Ö‰$$ÆÒ»lú+6ÖEG*/l¦SÁ#²Þ…LŒ2+â, Št$ ·ÝÑÅõÍÞn;ƒA§7º;à}7Ó<bM>¤‰dÉTª •[²†"ÈÕéàä‚^¯ÝËîèŽÅà¬;ê‡8» ƒ~g0êžÜ\vèß ú×ÃÓ0$Yd¥ˆñ6ïqÞDNI$\(»ÁÃ[o‰6‰0 %0œ¢!'õHs>ÞÌQ` ­¦9Ïz#Þn ¥]K܇^Ôðb±hLUÖÐfÚ¤F¼>lóØ#û;5+•wRM’,bZë"©³ã ‡E½2yõ«©¿¶q¯œœ—ÞþééóQÊïF"–J€8?ÝÚj·Z•w+ÓVïæê¾CÃ->H•ŠT‰ˆ®ÂßË“{áZÚvìø'À^€O>ÓèxÒæߥ'¬¢<†I&쯢Ði——÷èø‰ë/ E@«…7ø¡ýyí!¤ð«µÊ 'œe€93“Yh0Îb|ÿÒº÷¹y£ZR2.K鈣#ÔÛ5žú@œ’GÇ‹¤£`[k¾\xoÿSÛ‚3$Ÿª¬æ=¨Õò\ ú\fÚùöÉ'óÒ­J2ÔÂ$Q²ÆíÇr±hljœxTK’å}à©ÍSf)±m¿ß”?90Ö½éY’,ïW¾+HSá,ª$…œ2¶W_rÓlâ«×B>äEScÎûXKQð¼(xŽÃ#ß¼¼Ø¹/¶$ù¿>êïÖÈ×õÎËBÁOÂ%ªíViz»‚oz¡‡Ö½€¼!qœ7¢^ß`>oÑâ—-*Pÿïœý‘%¸WhßÀZpup°Á¨ÅSXhåÔ½lxÎwj/§0·x9–ó¡ð1ÏBÝë™b}f¢ôûÉÞà#Ú~Â|°Òø,vÆð—e1O•Ÿù†‡çã‡xœ›*´U[_‹KAK¡8?­$`"»£ÅDK]…T½t=ŸÄ””Ô"…¤üÄ¢”¡Å,L “O±MæaU–62ÕQ05ÐQ0Ò†PHÀÈtr«™pyfQf^z@fpjIi‚†¦‚‚õ柬eŒŽ99 .ùåy›+Øç2Þc#ÝêÏxœEPÁNÂ@=È…õäÅó S¤bÓ½x21†DM”CÓneÜ%íV£„à?ð~ƒ_ÇÕ©´p˜Ù÷Þì›Ùï£ÍáêüTà™NÌX+Ù.¹¬ef ˜©ÜQxÓq>“ …JI½Ž¨Žfág†Y2©sîS˜³ÈÃ"­”Œ ×_R#¦,‚Ñ%{ç]àw±9h6IE³<–Ê4Uº;½{(3…ÙZÕZO»)Y š±LHÉúèö¾î AÊ”3<÷'¸Âî…kÃø6<Ïáä8 ó}.ý‚è¹=,¬jÇ+B v»=H“Ïaµ·hå|“ÊÐHXlZ2‰NaA›¯ Ž žÀAÂ}>;jÿ³[ 0g“Àj´¼øE5lÜQñà–¬ÜS*Íìj7šìe±ä¿‡Õsœ [Š"–âå„?¼ËxÝVmkã8þÜüŠa—§Mã¾À푾p¹Ò´nâ„R8X[Žu8’‘ää±ÿýÉvÒ½.[ʱwþÐ*Òhæ™gž;ˆÄªÈ9Z-5[‘U´âÌ”š“ÍxeI*õ?ÖL Uº› Çî*‹cn ìãŒIaV¦‹]çÿF[-–™¥ nÓÙÉéÙ1þœÓÒ‰’tÏeµQ²K—ˆû;­ù%ìHn¯áâm‡e– C©@Šø_0m]6¡…\N„g ³¶0½0l t÷PBÍL±àZo V·°¨Ó$Ú9rÎSÍA˜Jí†iÞ£­*)f’4O„±Z,J –˜LB¥i¥‘nB<Ø.'žfËõÊ4œßæô–qvÇ%×,§I¹ÈEL"æÒpbHË혌'´h<ºâ  ¨D…Ì %;ÄÎ5­Qü¦ó&Zí³CJ×Èf]&šT᮶K9ÆævSô¿±±O:!!}b™*œªàùnDžÓ‚SixZæ:H¢Çáì~<ŸQôDýé´?š=]ÀÞf §|Í+oN·)ƒmͤÝ"‡ÚɧÛéÍ=nõ> gOH†ÃÙè6Šh0žRŸ&ýélx3èOi2ŸNÆÑm—(Y`¥öñ:ï©/"ú$á–‰|'~ðð„Ò ÍÊØšC1k`e£5¶_Qca¹’KOÀNoÀ;LI*Û!Ü—NÃðf³é.eÙUzB#N&¼vz›ŽÂVë½q^&ÛôQ7»~¾ml"”ÛÛ[b+‹{BÚênÂS!ùÁ Í>ߌç£ÙÁéIõ´Þ×gÑÃø±>£ú°ÕjÁ­¬•HÚ­?[h'ì ºÀªÄòüì³%cÑú¾L:¨A)qåªC×a ãCÁ¦¼›6]O±£¼ž…–ÛLËß件»†9ÿ^刄>ÓN˜[çUÀcÃSÄmYPЦ«+:>m㔈ÿnN½£gFhUH§¹‰) ý'= >üŒ†BÿùV6m`èО¶ÆŸ*œt½4™Ïê$MWtâÉq Dõ|]b\ÐÑ‘p¸ÏÐM˜1=úˆ'œ7g¦yi2 P^4gƒ*¶áx…&ÇdDµ¹‹è鯣VëËg x~»¢‡(KaYþ¨‘µOÈs墣šß²+#ªUä r–Ǭ‹câ节G_Ù‹˜'Õµ½o¢>Æ'[bÒû0`Åy 鼶¬„…U;=‹œ·÷…‚e³4‹ÚAÁ½Ä»U¡vQë§$4<öIUÚuá¾Ro­÷–þ‡ªy!Õ»B¨ï˵ÑÙéÇÿ†Ðš©òšÌ\>ÿºÎ\Ð]hnÖá]gîS1zŠÜ‡ ï}sÐE[ßú¯ÏºÐlMç˜0áÒ)nÿðÊÇ°ù1GÚçÿ]kÏ2}Ó¡Føp²¥–þuõ¥õ‘+»à5‡Qxœ•’ËnÓ@†%HÔx¸¨ˆŠK(ê‘Q%G18^#ÒJ T]´±äDl*µIfFJf,_J«ªâ!Fâ!XÁž k„à!X±ã 8c§%5°`6ö¹~ÿoÏÇ»?—Þ+½y@Ùˆ føí xäç1!‡’SˆCÆh—Å X\$raƒ~™ö6e*’9!e†:´!N§6„, Ø;¡…ÕTÄ|,ÍÚâ¤akzÖñ©#ÉAyŒÓkË ^ç5l8QŸ+ÍÊ]¡Þ˨IÕ {±IÍ|ïâ>TªJ+8Fù˜'ýÉˈ' ¬ÌE£–‰ #T5Ë|íç°Ú¤ÓÀÌl€3£«/ÆòoäþÕêu‹Êt0aµY}‘Ü»åQ'fÃ=až¹×ëOÕ×Òmu¿¼RÚò·;ªU®>™#®ÿÏQ»åÕ+ç£{B½+·¯9¦Æ>X’†`ÍóýLÉ¿Yd´+¹”ÂÌø*ÔÙ‚)µ9ɸ_Dᣟ ˆÀÅh™˜‡P±3ØÈ¢P€b1×FñEnƒPľT°–1O6% šsJÞêf˜ZkbI_ÞÜÌa̴ƽ7L0¦0É)`Ì#&4ƒP— ÙõŠÅ°ØØØ! JB0”xDh¸m`÷Ü£Üøž—§•@%r¦ÊDÌ(ÔEú û¬£½Ãjl“Ž Ëg%3ª DÄ|xšÂ‚A®Y’§íýáÝhvõv>ƒþÍ-¼ëO§ý›Ùí9ú›•Ä]vÏ 4¾ÎRŽà˜œ …Ù`%Èõ`zy…QýßGãÑì–ÒŽf7ƒ €áÛ)ôaÒŸÎF—óq “ùtò6xc;|_÷Ä^" 3òTïèp‹W¯‘mÃ*¼gXã÷È5„Ëÿ»w»¦R,­µÂ^é2J@HÓä/¨±Ž¼¥È=©–~Z@hÿµ÷#»Êo6›?s¥9¶ý…61—Þêõ¾)å‹}[.°$â/ü¸0Om”ã¾ [PØ#|kL"aÒ§F½Ñ>—Ñ—)ùçýÅìžöwN¨•Ý;·²â,+üc–pÁ³é|Ðpº½^×­mÃþ8@ãO´çn]1ôŽÊ±ÑèÔ¶›ùõÝlt=ngk¾î¿¿ FÝ9}Ñ¢ˆ¤ ¶m„]d`½ÆpŽêßKÛ!ÌLžC{vÖºÍOMœ' 8ŽõíÁN ¥sŨ]†¸pÃ( É0À ^êÞ†£ËPü‚s3+;û"×gðLÿ%ŽÅ(ô£aa¯ ñÎ-û€}î ÞfwÃþh<ŸŠÇæ#f`Ó q48”KÉ»J£ †¯™Flþ‘Ù \h¾v˜ ÁAŽcLÄv¯ãClÃ}ßh*h­7„&´;±Äc|ÂÔ ‡£b&fL%8þg¶pl†ömGÒ×êZÐæ¦2§º:>)žês»øÚro}rŒÉTÔkÐÏ4¥¯>}tßaøVskÃg–Åòzá,Âõ¸øžðùèbjQ«rêmëò¬mÕš¶/=™Biʨš–¨sU•©»’{O›g/cL÷Ù¯1µ«v ¨š @ŇoQ|Ù:Õù%Û<¸ÝÁóŠõÔ3mÇÇÖê6TË;‚jzúnwDu^ÀÊ>Á‘×øÔlìP¦ Z9ýîùFù6vu¥1YØŠ…ÿÐò±Ìúz?·rƒØ–H¢Š+7¿lj(ŸökÑù®CØ'…~.øPÙkuÈH—êujI·íÿôéA PÜz ^¹´À4¼„J„„{ˆauÈWÇÏûú·8d»ñ¤wDÛ­¬WÞó„ªê“V™ö¶”ö»6°‹)JäpÔoÞKU+xÐ ¾pt;ùº6î7Yïöócñ¥PÙWãÿ6?ö@k›% px(Am‰¯Àþš²ëxœµVýoÛ6ý9þ+)†Zmb'-ŠÉÒ!Nâ-M ÛA`X@K”ÅE’Šgýß÷ŽúŠ»¡[ÖH ™âïÞ½{¼á«½¢U¬áž¶î„rkCãÜIcÊ‘“ÖQaôÒˆ [x×|ªO=V)‡G…¨rmò4Jœ+ìÁpˆ˜ÿ”¡³ƒÁ#Œ\º¡¶X€ëÝB ++<Ô áÓÖ”1RÍØ­„‘´Ö%…¨€‘˜b("¹„@k΢P*^×n°\röFÐ/³ )/®oéJZ‹w2—F¤4)© éJ… Ÿ$´xÅ&¨Ü¢ñȶçЬˆÎ5Ž\¸’ <>o.äÛæ´ÚçiSûéƒwÈÄ.Ø4@økJÁ’ÖzðïhtIGÌMöžèB¶L^)vá0.ÓÚöÓÝx~ys;§ãë{º;žN¯ç÷‡¾+4ÞÊ'YySY‘*8GrF䎹];ù8šž^Âêød|5žß#:ϯG³ßLé˜&ÇÓùøôöêxJ“Ûéäf6Í$'kÿ{ì‹`#é„Jí3îQz‹hÓˆñ$APª'Ä*(DüïÚÖîDªÑ±^:¢qŒ>u¾Oégæ0(¼Z­˼h³¦•;üð]jØë½Py˜–Žµ.Rz|Ø\JÕbs­«½áxù(×/i•¨9Iß'©½””¹Ü¥'‘–i&ï3º\&ô*Mç?ÖjÈVE2<ç^Ñ‚ X@2Pð/4F‹;¨N†‡DE,‡Vgõ=vBÑ3ñ(¡ð1šy 뽈d¬r¹uzs{=ømt¿µç“¹c“Vì«€C^1·áû—Îôäv>¿¹~˜Œ¯·öß{ã3¹@[†`žBè“lÖm?à¬ÓÑÃ|üq´µ¿‡óØf™ê…HOa‡„8› ¿¼Œ (ùu… ße–·Í*J.˜²aŠ#zÒèeU™øœmi|ÀAVà…Á}!mþÒ¡F!wÖÁ(ìŒqÌfTt„Šr¸Õ•]߬—¨ª…øæ z¸èù…S¡¯bîój3–ÙG&ÃDäÊfþ*öZ‡àb…º´ù7û«¯gfHid&sÇnD…“4߯E¾l–Éøa~9Ÿah`zŸzäQc$eVµÕŒ˜3!j!ÃOZEA¡.ÕÄ(êïït¸.̤«F…J”åMpËâ VÚ(·fsÖªþá!fâ“qRÜ…Ó‚Õïø¹C»û}À˜Â§\h–loø‰xÂVÔ&jÜe(Á€ðóFA½çSoë‹Ü:‹×´Áuä¼êÜ©ãÐamÿ¹ê6YIª`uP ,› *,ÿ8¢ý 3þꊵ¤ß6mÀ¾_¿Þdëa»û¶ÒžÍýþÜfÖ„pÕ(™JaeÔœMA/ô#µTN¤S.Ç3D::¢«›»€aH1Šõ÷ƒ.Îo@¦Â‚ÿ?· f¥+ ß\gpùš1,¼|›Ê8ÆPƒÛÇψ\åÊ)`g«>O„‰x>øa ÀÌ­¬Y ò3¢·u¨t;/~%>X¿‘/PœâÎfŽãi×K3êo{Ï2ZJ¿cÜ  ìvSЙ¨½zÝôâßð,Ýoöž+÷CL<u⊠l[¨¹oÀS/eÏ[]t…Ê„ÊÒ,|@‡s%)©°nS˜«õlݬR§4u¥jnþC8 *¹C·osC°\bP)ŽÓÒ&ÔÇ€9­åvÝÝYhƒgµª|­]ŸÙÒ75nÓ[¾ÝÞíímûlæBg‘A‡Çýô.ú=ßÞé–ÓM,»È{µ[ #¥É=šŸ{¶´Xª¯xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê`¾¥£öô¢–‡6'Þ¼95%Ž‹=·`.TMjEIj^qf~^±^2ôkªñ•_ŸÇ®ú°øzÕ½è•gcX0Õe0Ī ™ô,µw6%_§Iy§BÛÿŠPué™ùz† Ï…ed˜-.×sFìØ‘ÿÊ2åq ²Šd†ŠÆc!i7Š%.N® ý´õá‘ÔyF-P™`×Hþ9¸~RýÔfWóºb­³2a×O¸U˜›š‚T”¤—04ŸZ*!n!ÌÏxåyiþ”ïS«%¡†¥&¦$æäÍY½â^ä’Îë§Ü¸÷Õ›mÝ}ƒã3Ô!zÅ ËíVJm¹æuÏgƒîÄé.9h‘î±¾xœí[ëSâÊÿ E¯§ÖD^¢(»Zåñ±k•ëR uîÞLJL`î†$Î >êœýßo÷$!!u×­{´J1žž~üº{2ª¥<”€Ý)æJî¹²b¶‘ëBgƒ2øØ9û¾ðÂò@1©Êà3ö ÿzß®rŠ[.v=ÏrÜr5Œ% aÝ‚çjb×~Ÿ q^¡QGž/ø`¨ `¡Q«76ñÏ|ô„…c>1×bBz.ò>ÏY~9älŽÚâ§Z}Ëw®]1TÊ—íj=ð_f*Y±Ðž[q™ªŠÈ†MŸWƒQøŽ"Ñø "á¶` ¤g+rBî½1˜† ‚Y\*Áûc…:(rfÕ0ò,n߇b<&ãµß#9‰ÍÅœ3)ñÞGæ2a8Ð÷nÂ971¤4‹(rÈ,èGiì))Ô ‚S§0b  ŒS4áÝ×°ÍÊ,ƒ'B9C‘%<Ÿ†Qý{p ®d{#6ÚbèùhÝ%¢½·Üq Ï`,™=vÊ¡ä‡?Î.?}¹º„˯ðÇa·{xqùõ½Æš‡wÙ ¤ñ‘ïpŽÆ ÃU÷hC(äóI÷èŽ:üýìüìò+§g—'½œ~éÂ!t»—gGWç‡]è\u;_z'€#åX(c±ßmDt¬Å”Á™ðÃW ½Dm “â†!LÆoPWLÌ¥cŠ3ÏÉyõ=³Áõ0O%êý0Œ¾½½­ ÜqŃªÈÕƒÊs&T5ŸÏÿÆ]Ó[8¯T÷*Ãi’Ãû34îªiš©î}–f#ë¦icdMÓ0!Ýô¬÷²Jå4Ù6]å)A›øpš<2ýÆV­¶;-  Öw2©­ ªÌ” Ó¼RlïmO“|ÓÞÝÞ«g[Í”Hãn«¾»½=CÝÞj4ffG£2‰i¡¦ßÜÍâl¦eJw«QOYi ³Ç7RÎ^K4žáZ>O—ÂÅ‚ &P>fýñÞÓ k  —Ý«“üo€yes—åè2W¨ïï׋ êéáy/ 7ŒƒÛù|µ 瞉i„@›jŒÉ‰ílèa†IšÏ·â†x:vMªl=MÏÿ™ÌQW*0±ŸAÉ5F •R9W(Ù!w±ܦ®y,em’ÏÝß *ŸáMª,âðïd_¾µba˜êÌUºû ™ù Ö±F ¾.–W’ÄX°NR•pªxÚECÁè;]뱞´‹Ï–Üé4— g4C[b­aÆôð:ðAÉŠÚ܆Bɇ7ûð®ýÕ"Ø>Æ]á=LkLä2¬½•mô99ô˜Yÿv×ÊMPÔþ‡ÈCWççšò=66|òm0Û.->Àæ‚óÍp®>#û1å9Ž²¾_†Z0êvHkBZ“„¦¡TºúžF¢0”Æ_¨ó˜þ)¡þ*‚ëë2”D¸Ÿ-|)˜¾h$æãê³^#Nü$* ¥k2¡²¾áY!ä:P’¼…C髆 ×°‰¢6 Q†:ΙÃR÷O&<‰K©|,_»ñ:V( äãG ã,öBðYÞIT?‡]P£ðóQG_àÜ»›}DóYã(Xë£/ Íþá>ñ†í³Ñîcló†yhYâG゘¡ü,çWç TámT9†H!¸‹þK¾X^p» ë8ªX„ý}ùb ºC%$’üP»«m᯿@_àu«µƒÄj ;q­…ÚÝÛ–¸ŒÄ•ï€M²LÜ)TFª„°ŒV:=¼ë£U‘_Â1L¨õNU©_×w’@©ïlþ.…ùâH©ï¼"e ¤Ôwž)­)¤´V@Jë@Jë)Ë ¥õt¤Èdó‘‰æÓëœ=¨"}Þö=¡^)ò‘Ýu¦Í6¡»$^“ð€….p5±)ä÷ RÞZâ„Ty'+FþXÒ2íº‰iúêgf\Ö8­Îâ,³uÝUs!Y5ñ&Usa2DUóE“á‘eó5þ’a¶%<"z´[¦3¡7䶂.pIÏd­æÞ¡zC-€<Î$Û–¡Œ¶‰ÏNßÚŽ¡ÌáOÆ¿ÖøQà'íË@ê#é_m9 ŸúN”h¶Õ1„ƒ–Ų"†vC ÑÕl5ƒˆc%òƤ@Aº“o5&Ò•4¤H»çKrá²Æ.)RÇã™eêà.–©ñN¥yXY>³:Áþ²Î­cÚ±2À®R8c‹½¡¤\¸ý’‹ðPË×5øƒÙêIKðNðBãáÐ5o€p˜ o¼4 öê¯(XŒ‚½úÓÄÂL³0ˆ^=M—GCãù^Ø/‡ƒH»Ç®-ÍU%ªëºÌyúª2 Qƺk¥Ç½›; €ðÆKÆ?Pá5üó–Ýägˆ~s^ô›/ýÇ­þ.ÑŸY¬ýà A2úQí×ô—-ý¤ÂkðçU~òÎSSŸŽd¦¾¾ñ²©O*¼F^ê“wžýž>Ú3•ùcå£R…ó“c8ü† ýPœÒ`øÙ;+zæ•1(<íœÀŸKöÃfcÎj¨Ùxé—Þ¤ÂcŸŠ ÆÈwX×PÈ60¸û7yNZ­L|´l9˜ HT…˜v[ í ØÑ8ä_XbýžÏhÃ’æjÜL ÕW˘¨Ù¦ÕX¸èiÎö½LtÏ«…39,ÌžNxt¶aêÄw 8êò^*6"K˜2±ù,õýŽ'ÇÖO®¤ùÊå ¤/]’;ÑdÀ#JÂê[Íõ©­æz­¶Ì^sÆ‹ (46iôj»ËúxT¦…ú|Û“^ÈH%æobô€ÚÂܦÃa±ŽàÓ'Q»sñ𴧤<{ɨi\L¢¦¯ YÓ? #§Ù—ªlZ£ ÔG1óäLc1™ý>Lþè(08\þÈ÷¥@ž¥Kø×0p:Iÿ„µèðÖZ9—[Ï:û–û^NrÖw²9ë;3œ­9œ­§œ3»œ™]Α)“2õ›4›~6a w¶ÓLáki¶½z&Û^=©ídhFäṲ̂áþC’–ÝlDž’†=*K’c¶pón†/¤'éY/ƒÈ±sõ²wÆ»š:a¢î•f¡&1èι}är:pÉí‰Aº_ž{†þÊhê–U©8ï@òD‘cz9˜l|ºž¤˜‚zÐ< ò7}ê&;)•$”W _ã~dÁIîx®ø?]éû÷`s×¢CßÄgsAßI ãÏz“?©Zò„qÆIj}ä¹äéÌ0VبØN6KÍðΫ×)å\O鯩q×PÑ©s­[f_Ê(ÜAÇÎeG'ë}}b¹7™•ôGNvÇ£~â¸6vpz;iÁ ýsÎþطѼzÍþ—ði4Ny8†d+5Çyú#†Uô_ u€ ƒMxW{I™òsRé°Ó\Ö±ºU“¶rd8N>s—Æ#ú¶ßN3ãe~üˆí[ÄcÂêïÒÅßj“’D*$si?«5¾OÝÍ Î7ûá1|´:qw:h˜ÅæÈŸš!^Ž%ÆKµ„S¢¯M­¥&ËbìòEYõVꜲé;š)G&ÔIìVDŽüžÿóìÅ7íH„Óxœ}SÏkQ&°mv_³É¦’m%b d‰›¤‘”j"$"6Ø‚¨õ°n7îB’»Áú < ^<Ì_ x©xzГ؛ñâÑ"àAÑ·ïí4J÷²ß¼ofÞÌ÷fŽrï ï²\DÌ}ã{–=PÇ &Ü'$Ðo—üáhn9êãÄ|úEû¦mïuÍínGÖ°ou”¦¬ùŽÕw÷„vÑŽ5ÔGÉ6RÊN©FX K.œaÏ­,…Ž]=_•Ûi½Zu½B Ÿá'jÀha ¾/<ˆ¯U*¡ ¼J(P`ÊtŽ³ŽÏR•ƒZQOøƒÊœ+%¼DeÞ“ÒõXœp¦ˆg›ú§‡Ö£¡:05|Õ¼KúÈÀ}¡b >ÄD‚3 K"Å/b"dÅeØ7¤Ù¼ðTLs^ŽÖáx*é„øšØ%âð¼/Lâgy_†Ðp¦‡1QO»íçnó“xž5ïzƒDp Òsø"]3Ù‚ß’0Gg– p˜ÌÁ¯äÊÔ¥R*ÏFß`õ°Ts_‡oƒÂÚ©³»ÿs.…䃓3»…BH©æ ™©3Û«¬(¡Ù™‚î¥Ôi?¿Zô&$eƒ’Øt¡@Úã,›6ˆ-¥RSÒ…4ÙDÂ,ÅuÛTû„q7Ó@yXiâ&ƒoxœÛ®½JVVYÁ71;5-3'ÕŠK™³<³(3/= S!%µ,39u¢”«®‘¡ñÆ$U—Ô2½D.—H?G_OgÛœÌ$˜j Ää¹,“'bræ´åL)6460ÒKVÈM¬HI-IM.² 2ýR‹õ’99c¸89ÓS‹J’ò‹R€2™n‰É© °TNrŠ¡‘E…™ P Èž¼›í¿Èòâ|Ý|4‹Ï°`Ñ='Ù ÖNä2â„[ ⱂm‹Ã­ñØ ƒ%à–‚%€<½ ÎÉŒÜr“_ð,XÀk¦ðZƒéß¼š`Z…o+8h&'pŠNþÁsÆF v¨+&à×€:â ¿:’#€<˜#€L˜#&+ )L~ÀÏÁ òþA~ùÉoxùÁ–ÙÖsq)+¸ø+øù‡(¸¸ú¸†¸rqAÃ;ßJÊÊàB„ò4°KCÝ˵ {û<*tOñweö«^¶ßõ‚8 ¾Ên·û´oR+tb¢4¹ÎT®væO&¨ø[¦ î;p3 ¦¡H7›˜¢ñvÑRÇ8Ôèât²Lô·,Í Z`¿™Ó%v¸§Ãîùåß9j¿Ž¾3æÑ“›<-3ù¤âR?CĬ2±6[H!N÷§ÓàJg¥bâNg÷ EŒæ"WÉæØ8U¡ü"£aÐ3Yôf›U.‚­J?ŸÚû)‡4ëÔÝxq;ŸÌ–“飠e¬m‘‘Jš}}Tùî ¿&ÑZËtÑÀê¬d-Ò4&ÃÓ½,¶”ë\je¢Ög'°2‹#Ó„šJ. .f9êÝñó]o$‚4yÒy¡ójÛ{<®R•‡]9)`¡6Ñ&Ñ¡\§¹4Ñ.‹•6E”lŠ#µIR<2+ó,5Ú´åª,d ¹b|C%ÒluKäQV¶Ñ‰ÎU,£µ0éNï·ª†ÈREºÁŽ#ʺBL,\›´ZFk&Ó* fÑ;Ðd:˜V¬g L†·â«ÎIV°±2Öx@ùÿUF¹qÒ( £æÎÚ2:¦<‡u0@gD"=~YOzæ``íʘ©Æ—õ\`¤Ð;vP¤I%RS® ÕI!³<Ý°åc§8póÀE $¶&"÷Q±MÁìDë$‚­À1/Á"#ó4-ºV §¬ <,gÞ©MË"+-A™ç„t\ˆ âÒĬec®Ÿ"žtbiêW·x#>9äonþY«eRîV¤g¹Â\Žàç>Êqô+ü‚®ÓB_ƒT¹4·™:ˆ˜©¦`„]â¯ñéÏ°©–Ē΀ޟ¨ÀUóNõ¢V£âGuåØO8š]–cÔú8Ú+ÏuwÓ•» ^öo.àÈ"su`7§I›Nb–Зn´Ú¥ +ͬ…J™šÝX¨3°ê:^60ÎÙÔYûœ^!HaX&K-FM bͶ»Å>‚ktB‚ i•KhT½ÉPß;Nmœ¬ºò—´´їƱÑþÓqô•ð£ïPÂ}Òð3p›m-o ýò'ìÿY̵ó—a´‰îm@ó¦¿AtN?¢r…ëèKè瀴 ×% »AäCy±Nxƒ(ë'7´ŒÓ{¬ü‰ùY|æ±ú({ú¹=㛶X÷kúdL<¦ÖÁQ%×QnŠúPõ­ ª”n¾C* Œ,G§ël 8 öù[™¤‹Ö¼”„å¬cÅþX…ÿ ¤†&’Ç€s )îØcáÔ,ôB~Ÿcl0¬€ùì÷‡×Ðë¾#ß…Õ¦ÜÅ„{Òø Rx`ãöÛ”àîVÛ(k0è÷ÅrÄ*'Ž?`Uøʪ«·5«,idSƒá[ǯ}Eš¥ 3ž.ËÁ»Ñ­d‡Yq@2×0$¬/@Bì\•FöD¥â«ïjöêPT |+w ä×ùNeÞ0¨uô²fZÿ©7‘­ÉWnõ7âaCµ¦ÿÜ.8¼…81 —úûÄ@ÉBQ|" Õ‘œIqÌ~?¶yTZEé}†a°"Z{ˤøGŸ‰G£-9²A„ |¶ì'q@ä³m}Aû€8aà°®òæˆ#n¬©L6Õ“çO‘b¸Ð*t\´¥­%½e¢ldF8ÁÔŽRqÂŽ5„®)TA‰.ÒPVŸ Þ?Íwðþt¤ð^“£´56H  Š[¦'éež4ÙOל>MøväÈÈ]‰M÷Œ\#qaÚ•£8¶r¡PÏ.05w-±M“9LqÀ,ã¸Sf½Ž Ò !ŒŒK8t(Î m¢•a]T,§cþ7G;Ø++1Ågž–OlÐsà<+ 3/¸Éõ.}²Éi“§´ÕlFõ÷¢[Sröù¡Š4Axyñ¢k³h5½i$£I^ 7¶öw§®sNøƒÃÏÈE¬Á8£¬f|îòÇç2{„…ÿÒÉ<æ¦ïöLUs‰,3‰l›,*”ÖBÍñ vÑœ¼uµ—ðõ #ªá ­,3ƒ8_C€ q–\Çg¯†Â©aÛê# Œ|×¹ót½¾ðu^#eh´!ħ¤3v™¬SòÚQ¹”餂ªË°¢ofÌ8—Q  ®ˆ5-9\xXgÍÐÔúW[Gy]FYy]x<«½¿[46Д”mrG‹ÔŸZ¥~[äͨݸư%4o%ÊOäÊÌ¡¯ ÁÅDí W*e|£›‰gd‚7¾¸ Pn’,*Φ}•äâÓ$ÐMZ·ð_+­“Š…mÚìSIM”­2T‰,ÙõwxÅï1Ó=ÙœHÈ:b(S.m¹oÚ¿†j!FÆè2LaN1×s‚¹ãpà ŠìÊO='Âå@;­(ìÒ^äß‚bùV=_ÌNUý‚Ëšé› ÖVʬÎø­¦qFŸ Ï(×®0U€ë2ô¹  eò‹¶À¡ÖW€Â¾”¨• °ÅžÇæ/+l›°¶| !WZ'Nâ©š'Tx²7ÈK°aa›2ò8 ID›Jm8PáÝËœ³ÎÃPÔŦ¡ø ×Q(¬©ÐñI¥î'Š}¬ùœ´’‚Ó_³ ì<ƒm÷/g¬i¶e­Áiól*”‚Éa­jÛ¶=6:C®Ó·ÎÓÕ½ª„s‚Vh‰¹G’}î.›¾ò™Hÿ„“ܯ£ãPÂZâeY….h’³‰#Îû+cÛµ´ÒlK'G!rÞÄ…ý^E®?XE Þ  [ª×—TJÒA¦}à-ma(Ò¶·‚aÊöíì“ÜoaÆ6Ó ÅVpŽªç½fqËÈúBdm¼"w©ÇÌ‘‹i»õ”h –÷tå{^fõÛ¨‘aȨYˆ4ÜyÓ•w)ãN¡µLb8•ïpÛÐ\“Æe¡áÜM 7Nã_“t/÷αü@y[zDÖi‡¼IÔ§ÅM«læ•3iõù  äv™¹ <©EyΆ¬×ªŒá@^÷û»Ñ…}dlÄ©Ó1Ït,oþ½™u5:ò²‰M•4QR£b…¸ʘìTþõÚdÔbÉ< VäÊ·h/šçä§À¹Õg¹AP§ÒhYƒ&é]Õ|ãNq4 ä¯+U†8JÿÃK6Ò,0²jalE㮟L’m„0ª v‘±m0—×ÁÊÒ Rˆ{¡~êIH"§Æ¡Ië0ì%ÄOѳjø“kE„™f¾Am+CŠ'Î'Ã[éñ¯Nà åÇUÏè@œƒ@Fþh+×ÒâšNLm_7¹…’S‡–g} á„qtkòëª\¯5]ü'7ž>Þ<ã -ûÿÌ>[Ä×TœruH4tèêãM͉æ‘¥œŠ?ÓlœPéæjÄê æÙ ÌQà!Zõµó¿•»ŒXèC>÷_;YLFÂÅ¡m§XD&“4Q|vWňrÄ{²£&«TüÞS” ÖyÒ¨¥Ãô–º&³+þGðuÆÙgŸL·¾˜Uá“tLtË…¤}Å]á7¶hC'¸ÿÃÖlЙm¦õε§Ä?…ì·oø=h 9h Þò{Ø:‡W¹rØZCL_ yÙé=x%äUkxIïÁk!_µ†Wô¼òukøŠßC!ß´®ðz#äÛV¿5l]¶`±×rq7ê ùck€Wnèö¾/ýÖ[¼ì½–·c Zoð¾öCÌ°Þ?ÚÁ‡éb"—­ñªvl²˜ŠÁÑ„7°äQœòQ ^µhâ '-¿Ý‰Áë¼&ˆsz~Óê´†ox€ÿ? œÒi]öÅ°OÿàôXˆº’8ËglÌgùðÌÕ)¹^“¸.ß+Q’SR|U®EÝ—ÀuC¸•§·QœÍR̤ÀÌ W !Ʊk{%‰ªÀ…Tìà´¸yÓb3<ºiÕ{2”@[ç–ªîúJ{*h<.6`³#!…|ÉG†Í­w“®‹=Žv7rï&÷c{'‡Ýa$º{‘¬¿é äÆ›]7þûèaFK«•œžqÀ¼òæøora[|ªz|¬þ¶º±ë‡—ǪukðÜÐí æçæÍ×ÕE ¸“RŸÌ½Ëëµ´h _ †/-µ®…&;pÑñZ®rä E?]Cpyõà !ØĜ̣/ì¶ð¥ÉɆ¾<'+»¨ ’M×Ç&¾x¶Ë¹ŸÇér¼€ƒùL«U%WÙ“}¥â‹I[¦ø<œF|•Ðö—[Gv(KìuWÛŠÜ•—«R%Ãe¿·—&§fg‹ñXŽîüó˜ûYåÿ`'[(9߀A÷fâ¥+0 bôiùa:â}š‡0”: Ò0Ϧóåäñ½¼ùôž˜2‹µ2dë,ƒU¹aƒÿ 5ËodÌÿ¢x¹'ºøÙ‚¸Î~™OÞX"IM³«€<.è7@ÃýH>;ÛçŸë\ëÊ´þ†nÓ>‹ ¬O’Ð%yvÛ¹Î9ñ~œ lD‚XþÆÙ·¦¬ž¶=Œç·FËÑÍä~²ü…Døn²|/òÝt.Gr6Õ·ŸîGs9û4ŸMcÇòå|t7~Í?.äèñNŽn?>N?ßïÞƈFâè—üKJe5e¸/]®Ëwi™„6þA—µUî×@Zi¾é1Úkj~Âmªˆfÿ ÿ^…¶ðxœí=iSÛȶŸáWt|+H¼“ÉdH`kâ°]¶ /•KQ²Ü¶õ"K~Zp¸™ü÷wÎénm–,ÙîÔ­G`K­Ógë³õ¢ÚËmö’Mæ†]Õ÷áãVa¸nåÈ™ÝWþ´Œ1/³>÷*W­S¦Û³™f*¦aqfXwƚΙg3oÊYOsçCî8÷¤küâ²ÝV§ŠßNìù½cL¦ÛÑwY³ÞhVàÏköÁvF¶Å>rkÄ׶ íãü Iƒ©á²±aª.›kŽÇì1[ŽaMºQ:õ¼¹»_«Íû¸î¹Õ‘cOl«jq¯æ(j*s£&ž‚ð‚†Ιk½…æð}voûL×,æð‘ázŽ1ô=ÀÁcÀºší°™=2Æ÷ \ö‘xâ 0tæ"–øåCûŠ]p×…{¸ÅÍd]h:»0tn¹œi@^q§|Ć ">{Žõ%Bì܆.4Ï°­2ãÜwØ°¾³=Õ›„Yf¶#áìhRâ0{Žîú÷ÌÔ¼ðéj:7B¢G $}jϺ)@z†i²!g¾ËǾY– =»n >v®ì¨ý™]õzGíÁçwÐÞ›Úp—ßq͘ÍM€qŽfy÷@ƒryÖ;ùO·.ZƒÏ@ ;o Úgý>;ïôØëõ­“«‹£ë^õºþY•z#r\ÂÈçû˜„ŒqO3L7Â‡Ï z°5GlªÝqPw€«ƒg~_X¶œfÚÖ„pðm™e{eæÞïQ‡A…‹EubùUÛ™ÔLíVs@Õ¶··ÿaXºé _×ŘÆ/™ÆpéŠø5Ý»Ÿód3¤.~Í·@‘Fñk0 ­D¯cÝòÌ´{·†}¸Ë—]O#l"—ÎÆ/O¸ã mÍI`07ÎÁæÅÛ–ø78Cz,moãWÇB ˆí”ý {·½]«±3º 2û–ŽcËe-4¿x8,†6ŽPPÝá0hAþHì =V ‹*¸ôsg#6²{\i0´pìâ¥]è.Þ¢k@Wâ'hTŒÁÙ wu¶ýJ=ó¾…_·vÝÈÕ󣋾¸Ü„Ë`¶1@7?õú­N{kk«Ô¬6›¥àF·u{Õ?¾ív®Ïz·'ö ×¹ØÚ{Üo5ONÏg'x²æ»NÍVÍhê0ÀÀ.G‰•óK˜ (ëSÍa/}W›pvÀJWøaŸ\«ÜýÓ*m³ØOIþ ¦9 ¾T&U7ðÿ äºüŸ¹7¬Z­æ>?¿aïAv£ÚÂ1<^[  <}B£Ï}Y kóŬ¦›¶þµ®ƒÀ¶R 8Bjw¹—ÕÈ·ø·¹íxØP|r³šŠÛ5>šðšzlUÿ‹±CÄ:dï ׬v#¬"Œ1ÇöçÐöN3ýìÆ@e¨™È‡ øÇÍ`£fM€G+éìýȸ3Àéf73mmÄ\pø „YmP?C%Íd¶;œ³)Ä>5Ó^d5š sÐjËâf&&ÃEØHñ¬ÄÞmIiCæ€/Bsañhç#0#hLªdºÇ0ܶÚÁ-øÂÛvçz»FnkÄuØŠ‰NéØ"+Yþ ‚ [L }JA¦{>(Î=š*ÑÈÒf:|ŽjgyƤ³£Pж*dLñ ÷ñÜRÒA¡y/Šæ" bN0±V<Íîöw²Ã@nl8xK·^!‡jŒ!F„5&h3ËðâŽáŽŒ „/;}©ßìîÒpv¸çƒ…Õ<Û [dSƒËuøö#0”’á(à ï,,„ŽÑ1}'^ÙxÑsÅ<²ö2À†ÁmbÔä´F궢™#b'`£ e .E¥CŒäüt~“‰,'fë³QYò AÆ3æ£[ÿ‚íž›àÃrMÝ™¨;uGJ@Ÿ{ØB*cÛ26ÝeÏXeñä )J`ì¬Ý9kvq„\kŽ¥BP/PŒü¬´Éã9øioŒ"Ãà”Yé¹»O{÷Ù9ŠŸ‘*¾Ïž£ÍâB¢(`Œ›®€ù}%ä+K É ¶Å%-’@¼ç9‚OAà®ê:ý†ŠÙP~lãï@áÀû&¿›ÆG¤q=¡žãóÚXŒ‘m¨O®?±µxÃy“{ŠESi\kƒ}šƒLHè0?î¨D:6c¶ (T¡«ç­‹3P@¼8†D*aʧ×D‡.p¹ä”ê•Ìç—·õ›P÷ðéÖ¾º¸UmY²h§ã²åúWIW(Ò,9Ƥø{³ €vÆ0\¶ƒh•ÙÛ:èƒPû8:aâXúl®ÚJ攑ká@Á0‰[ú\PÈ®aØ'Ñ‚½ùâ2†ÄEdFq'ž|Q·‘2$EÃ*ç$ýš˜”×T\Á¬X¿ƒÔ% .ä«žþ4ÖëV`M±¤R>͙ܱ/7Bù–¥-ãÎçbŒ@~!â…Cö¥ßmAB;s§oü K%ìÏcöƒ8— 5D¡<^Ö\®ßRˆ¾À­Ç#ªð#Ž§@ܨ:<£+ûÃ5;ÀáFY}j†VE)8‹hl‹ÿ#-®Û`_öš7„£Û¤ÏáÀ@Ø{¶'+ÎEÄI*‹=(0ô¹.n×^¾¬)FgL:,HÂŽKÀZ 1K/Éà nƒî”¤â*jÅÛ¡>kþV«îhAJ5x¦&­WëÑûÍåû u? °y­†“«”ƒè„Qü®ñ¯ƒç#”-‚œ=ðKÖ¨7_G=Fõ0šÎLaÞƒ‡2z¸Šapû6cxg5Ç E%‹[xo N5‰SrDdóª^0¯Vk'B|w?’Y»!ûÌÉ%— 8ˆ‚Ÿ»ÏÑ…£T@!ìÞ»ŸÑ3»žÙ_sÝþšrT>By 9锵 ÐÈöa®Éù\\Â8l€8Æ^W¹åAÔíy&DÂâ„!dØ)`àŸ³Z4w^Ì­ÈÍDÌãËê¡ÊØT9[Ô×(À¦µ‰®KE>+È]<ÝU€'qD¼s¬<Þ¤„ü²ªcÌ®zü#fo öØÖ}øÚ|Iî—Fó­0ü`;|è{§?Çþ8tu'(͔٠ÙdÌ}½¸ÚŒ ès‰éûËš”É8c•2ö,W1çC7ü•;FKíÝqwÊ1Àán5Å'/cŽPAõÁ*÷Œ,Y„u(%¡"BjŒŠ§~æóT3deAƆę(÷ˆØÌ€Ì †8M#+=ģ€‚GAdo@[–{ Õc p#:MÁùÂ¥72LÁ¡¼#Xf†ˆ;àÿ{öæ5|xõÊ ñÄñG,ãT‡àM÷Œ;NúDÕç^T9À ¢±§êívÜZEÄ]ªa¹Y75×­aZ@žjÁc 8c7â))Å`"?‘0:·½ÓNûâó. éJ#+x§EЄø*ý|õ*dþ(4K$uª ÑCjÚ¦Û±ÖÏ_ÃU(‡8›€2q°GÆˬñfw7‚G„3t»DΫô‡èI$(-SEƒlº¬Ò¼!Ú kÜì_þiý¢À§7 CË(•=ìœÉ{ñ¤&sO‰™Êl뉘ÙX¼ß“‚jÛìBµ ©?ýc7"©˜:DD÷òyZñ0ö<*Iç±Í<ðÏðûȇõ$‚?ž@þS™_y+üIæøˆW•”'g™- ¢0Vÿñ:MÂû.T8˜âQ °”àç¥ú1¿“ãv‚z‘råYâÜ x#šŒášk`ØŽ³®ÕïAJ¶`;jöÑ4ÝhìR˜¸Ïvñ»…ó_..ºŇ2Õ˜Á$aþI묦è–”g Ñ1Vi@< xš4²U,Ì@u—J‰µ/TIéÁ®±M~Y‡tT›ù¤¨ˆ×pHYiEwë•ŽáÖ$´RÒƒµÚƒÛ³Óg·½V¿Õþ7> ÆbN4°AIPçGEaábD* ­ãÎàcQ]m¨` Ðjaÿ ³–F³ä€ô¨uG8†vm(³€E¡a:2kþGdÂS5ÖóäØèÝ;aðGÜÔîÙÎïð£*wad ¦*Wbôµ7gš{¯¦·Õ*r ‡q,U +Dþÿ;Æ£ˆìß-rû¡C?5¥5p *óÍy%X)$ùÿÈõ?=rÍŒ27æO2Ðùi¬¡¡ò“ãù”ðÙ²-õJqâÝåH=LÒçÆÁˆ»…%=n¼[RÒßÆ!Ioø(Yr©\Ðå®ÊÒ¹8‹by{¢ž`ÙÊ-ÿçg ÉÍ"®äÒз«JÿžZ!¼™“N8à½b8Ê’‡×‚ò§êïg¸Ï‚ø¯ã(ÓôéÈ4—U F^»²*2ÚÀÉ.Ú~!BZˆúwÕ8DV®CÂÌ4\—­k^ UÀù-üôž½Ù£.dævt©Øæ:Q|mcŽ^tÕô”…ŒyÊ‘Td‘º‡KáÕ–‹pQš\)¯n”±hà‰¹Ÿ‘-fþi]Xf®ök]xšZ@qUø¾Bæ*çkc-¤rq]³T„´û—Ú·eåÀ볫‘>¶ÚÝ«âøÜ7Í«ù©ub[žc›²I÷êô¶s~ž)¹ôT•m‚QÈ*¸•mæëSü//ì§dsúH“‹R9h‡Ãï à3ø£}å éöw>Ù&nr‹ŒÃ2ãÖ¨«dŸká9t Ží»Ï‚`&œ†©°S›µmz„X!TE¡•šuOëf U²\ƘHúIÀÁÑ­È–£@ÈKꕵÆA®,iØΠɋČĒ/B~$+>Û™h@º­ÛËÎéÙÅ푨 /ß8–Å`ÉÅÖxSé&Ùû=ˈ¶Ç8{°¾bÍq ¿4Û2ÃÍ{3ÈEår‘èØç9^XA ºpȹNPߧ©>|@œ Áf¾KgöÔÑ5 Ò¡ü0 õÄð‚_-†ˆØ ú;ö €Ö@#8ãH(ÙC4¯sW…%~Ã2<âVW`ª6î^^EQ|\#”¤åxóš½Jèàò°s¢ÃÎQÍñÚ9òÑ@åÊ’§_NññµqÙ_Ñ©ÏÍxé‰Ne©\Š—|¶¤ßIwÅ$q¸C‰;XϦ²áS÷úò)x-±(ê/ÇÿߦœVT}"¬¢)G¶5!Œ2œ¦ì0*lž”Ä ÎŒÄå@“%¢´ùB žD‚®G@Ž0!êúÜ[!ÐÂ8ÿQûEmã©d(öp…™üŽŠÈ9£(1‹IçåŠCøH§äѸBjOuŒÄ^Ž&0IR@6蛸£¦5—ŽÃSäæHÝ·\cbÑ‘ôž$zS—=h¸ ØE‡·FѬŸÁ6T‹ØÉgVW9°Þ"Zª Ë!«UJâ³ä"Éât ã´PªpZgï Fá¢u¸§w¤YÅ©ªuÑ×Cöºþ{~YV4VÌroÁ9ŒC ¼YK’Ï3>Ôgš<¨¹ïá+-Ķ?iÒhÔðå\ƒjëÎsN¸Ç­;l¯[½VûC·u{zv|õ¡”rºi‹3VƒNŒè`}Z¢Æ©Ð7ŠÌöÄOßœnú#¦x^Újñ’ðèÀùÄDR#2£ú‘›sw¹„k3J•`q™°È¡¿á¤zZŸõHŸ}[¼×Dcîœë®p`ì½·¢wµ¬>rÜŠ~?Ɉ¼À3’é-«úýô8ýfwp—Ý•OäKËW,M&}QMÚ `ÚG’|ŒØDptÜï\\ Î.>³v'xµI5 ʹí¨÷ŠÐ^²ƒõª“T#’v0ÑfSøødú’é«öŸm\,GM‡#Æ÷ÄïÿÁ#§žì ¾WS‹…¨¦X’̺&Çm —;€iy{ìL¥è¢j¦^Îó_áËyÒ‹íÁ{VèÝ5âœg}îÖØFÒæ¶K+çcG‘%NžÛÀÑu*D³Ÿ…ï@Š¬ÌzòÐHñí’ÏlçWÍ\—ií…C’•úˆþÏ ŒtLÜ~à²/Ä1Ú6ªÉ ÅiYá ¤žÀÏ71Cû+}é|º¡zK‚Þ챕f¶”þý †YÆâ{ñº'u~r¾+öR¦,عoi*ö’¦,ðÃû‡¿µ) v×8=„Ëk¾ì)“zûSÔ½* èï‡Z‡Áõ©,ø‘WJyYV×y«T=é¦c=ù®‡gr™KH;¶íÉ£OÁu¨w\ c]‰mªLù_ܱ‡Ó¶+ÏpÆm-1- Û§%÷€‚B;4ÝýÌ­k)R%vK{¹õ=rè©–Mkâ ê­ey§{Gzo‡Yî=F¸ë[Š÷€;ÙÙcôì0Môì¸~´4Ó,¥õ@;l#ú‡/vöãûP%èðkuvqŽ·Ä¶¥M´ãt™ ¶Ôa¸$Aöåæô5:ñ®h¹ÉŠ^r -’й8‡LªL°íR(2N*“¥p"{e¦Ü†g÷6åÙ½”»‰Ó{e &€ê”KùõFýJEÖ|“|FP$ s£¶»0bB 7À¦uÑÎàà·ƒê€|šô±ø"|w\^lým‰™ËïÕPIIº¯Bh%×cåªìo߸ÿñzt~1øؽ®á7:ƒa¶½öø~›”×äÃ@W¯Rºp0ù,Þßj/¼ƒäñÞÄ>)½±°ÁÁüÍâHâ|áuŒÃ ¹Ké²ÿ¹¶À—¡8ôò…y}#ä(ùšùï'R€²©—rLĪµZ!Qª²¯éÉ×ÝÍW¬¯0"îðD…+À0X ¸ÃÝØgïÙX:åˆï9ƒ\[^kÇõAkhæ{|ÚëÒéqÊëô¼“{µqü"âunšvìÕ&ÄI‰è©è9âw\{ãþˆ6wôŠˆÓ1û|NN~{ùÚž³×kBøGbR NvGåìå3s¿I{¶úìäï"š%‚½|fî¿Ä£U"ZŒ`æ”Ea=f§ãç<¸ „`æþé=¢ÍŸw™SÊô71šöÁÌ›G/då·rD:"¯f^óæ'üyW+?O ø#˜y³`Þ½`)Yíçõ óÁÌ›'÷V×÷¿³wyÀ|…“±BÁÚëbÉ)çM’¾çS6…½cN­×fCYA¦ÈÔ©Á‰L.-s§šqXY‹ù3%¢Àtx”8¸Ë{˜[Ÿhæ¢SËRM¹L¬<‹Éúp¤„I_*ÿ&mëLlˆxœ›%:Sxƒ0ëf¶6ä{å xœeŽ!Â@EM µ(ÜO1TÐ p‰3t§e“íÎfv**‡@q Å-0Ðâ©Ÿ¼ÿîëçê±)n¯b{e$3:GŠgÊ81G8NÊ;ì‘EunЦ̘>Ø™±ªq(¤>Z] É ”ÉQÿûïÄÁ×Ù ý¢[:¢L–Ñ‹b–IÑúæ+¹”åî‘;º¼þxœåksÚHò³õ+úØJbbHônû½›Á… 0`$“<¾o÷1w"ÖdaÙ~ÌÑõ>Jk›05–”5#f-QVF˜;ûV²3lÓ‹ YåíŒÁqÌ5”ûWŠa áÕj¥Nœ…êz“Š-xø•7êS&TEQ”_,gd/Lœ×LËU§o’ ÛºÏÀ,'HÂFÁzÎÒh¤]¶p0Ì$ ÒIÍ:9â¶ö+4‡ŸûÁ¥‰#˘}Áw0n1NçW.>M¸cÌÑ1 û·Ê/€~[qç‹vv¦3ßµºƒ ùXÇÇXꬱ¢TxĘn_”Õ >­aó²Ô°ÁDø±×0òHÈ•±†ÀåE˜ÐÜÂŒù‹U†IRœv‰ŽçõöcÓu^ð‡ã®DÎ8óEPÁ4ÂU F¡H\J<óVŒW¬€Ù6Ñ[cLÔ>±7µ;!TÊ&³{b8›ë0U}ºøJGù ÓaéZfÖJpHð¢òUî)Ý0GOc8,•ù%oñÑÑ?œB±cÈ=äðo¥nÐZ?d‘¿Ï±©B’TgQÞ^£ÍýòžXC^s¡Í{~e|ÁÇGG8,*B1AŸÕM”Žß ”%âW ½CöâKÒHqoS}S2ñÊã”󤞀—´^熔Œ?ÃÆV`…å™âK="áÚarq†©`¶i5;¹Žƒë2–OÛ¼½ÀPu‚•‰Í†;Âl™XyÂJ)Â]ð!.ÑÚäPØc¥YŒ‚…Ǩñ±ðÚ¸¸»X¢g3\¤y*¸&ß‚WâŒõtš®eÖ …Z±h¡£Áõ¥eÓ0—¨½1ùw¤ÉhjxðíxmÌP±ß?ÁOŽ÷J£CŒ´h¤G£Z4ªG£F4jF£ãB‰8Þ¶0ô:hwùˆ í‹ª„¶/49ººtä¨3¸‰h~ i†_ÞJ̾EŸD³ž†#-ÒBC-”oÅ í ;ˆkÞ¹&|ì&èÖêò^—÷ª¼kò®Ë{­à-kèö¦kd߬‡hZ 4?5ü4ðÓÄÏI t„Áqé R¨¢ë)…¥¼|‚àSëuD'²S¼#;½Vju"D†Z5$Ôn"¸üHÜÀyÍèXUõªñ«ZÊû#l§¨iÊVœ$vMWÕúñ®Øu”¤YfÄŸ´{py×93棟'05Eeꦵ%Ì>G‹Ý»¹%ÍÜîe4ÔæBöU Ü< c 5¥ýN£ÓhtÌ&©ÐmB-ô(é9­â§Ð¢§ävà´Zû(ä—BoƒñI ù×4nœªoÐÑÛbíÅ^ŽŠ‡I¡…ü)ŒtΣ"„Q¼ó1> çÔOKI·o½B;å}"©1:;;ë@\«A6ÖŽEàó(®¦1‘Š·×Ègœœ@R‡A”¬r²ÌÅÂâú¶Û-ѺV Ï©µ%¥scÉu…ûü·-•§{ãCÞî x5ŽO¥F¥ªVªŸâe¹©[ ü¨J©Tl7p} ÿÚ¿ñåðF§ŠšáCp¬¯üf§j+jr5W~Q«ö©Ê*]MÊ©o±­#ªÞŒÃk[ðëüã8¼±ŸdäðÓBæÜÛÒçO siÇÑ´ÚILLít#NUˆÃ wýJ„3ïmå± _]êףÎ/ÓÜV^¾¬væ‡rcrvw½Îç«›·ŸI$j¿r­Iòºï©³ ‰ª¬¥òQH½$*)z]fSã“AyV3©ÑÌç,h¿)‚:.èßb‚ö.?²‚Š2O×ï’ݧ'4‡s(¨’¢ñ%‰,.qt%-j®˜)!yƒŠ*jïâIÎï ¶yrcm¼BcgxåX/zœVkŸ2Ul%® Zv ¶ŸB¡2v=ÌlLHÐîÍ]þ…®[€WP¸´ ‘op 9Åìžyþ«Œ³ôX$ "Ü0Å”‹!#v9Nü5ï£Ó,\}ÈÇÂÑÿ“>Þßm)åÇ£$›€åÆã)ø_PË™ XÞ¿ƶû´ðŒfr³Ÿ>n¡ã#›gN flÆymV*}ÚÌø[~qÖ`»†gv0†žKâçœú9’Ó7¡ ™È…l&MÖýܾfðîÜy¦–wŒ‘:Ì8†É–w$θÏàƒa/ئ–ç=Ûv>ôr(‰c£jxB„}~ü4èk2ÏøRâô'“„"aÇRM)Ï·ã¹9ÙyI9iM¦<ë»î ²y/•÷`#(¡RûH+öYΰ‡Ü‘#¿=MT)Q°òóáø!Ú}Ï^ø[ÏÑÂÃ0‹D8?úiÇG”µqqþ\¦‡¿¬ÞO”øç½îí`[îï¶ÄriΠpÞ¾*Ä—éÍ“UÏ*¤ªIÒ¹)7ã×9Õ6¿ós _WyE¡å VgkDçÏø!´|&PAÒò³^‡·.ôžà;rã×Qò÷crÇꑶ9±®‡µéè ôÐ7±]LTŠ~ŠT¹‰•|M°õõ•øy;ÅmÌŠtâ½]ÚDÕ6çýCX@¤(Qá bëf±˜Ä’É”ËAÚ½ÓÙf㤅ûlùÌL™<{$ß"ðŒE,§­Ã4¢æA¹GøJÂ(´v•üÑØHÇ불՛™ˆÝ³?E®¼–0¯‡ÏwéžÎÜÍû;ð×ígœŸë®”%t‚°Düç’ W¤K2NøÿšdÙ•àÆ6ÿú‹AúMm<ÚÒ‹å®Å ÖBG¯GÄ;\c›¾c×-OÎü‰õØ–§Y¶<ä‹6ý „xWÂÆc6¢ÿŒHl Ws+¾ÏìòG®X΂eÎ9°¥jŠ7é´;‰Ý|y€ÞDߥð—ìÙéJñw„ø$PÃc €r³ #ðÞû­¼-ÊXÿ›ò/Èz怓sxœµUMOQMÁ ”"”ò‘ÒrS¨Ò2m)Jü@‰!±v‚ÊÂó°#Ó™f: 7.ta4÷G¸S“®ŒÊŽ¿àÆ[MüúÞ¼Ú¥.d’™y÷ÜwæÜóÞ|Ï?÷Á‹ï¥{•ç¾´g.™‘ÝÀ¿¶2—dÈ\vZWd˜œ‘ø#ø³ótå…ÛÓ–š¨xÏÞólHé„ °(Q‰®+…íòUÖ÷Þж¨Jl@[#:”4ÌM»´iƒ]  ›€i€f1TgÈ lÆñ»ËÁ.3ˆOB=ÞY0-Ȧ„û|6-Iœ¬.ŠºÀ[Š¦JuxÓ¢[qi‡Ñá^Îp­@,HØÛ%ʺ|Ž‘t003ÊÂJ.}þæÊlÜù 'l¢0u^NÀXþ*hi~ñöBþÖʤ€ÕÙIt)ãšÌðI Á†ƒ¾ñdÎ!+'Çq"ÚOòk|Ù`¥à!±[Ù&b-ž…½–Ø­ü±¦èVgD`ƒËØ2 àA¸³JŒóON çÃ]è‹ôá•ÑNEzSRkA †,lQ«¬±­0É"wŒ†Zçýþ© L;»6Sqz4Þ¾wD¨c¸Pþ?koÃCM«2Ò¤*uË–4Eß,×m;Î}Ëv>¾ -/8~Ç=ÛhÕÖÞTângçs)xŠ[Í‘uGlÔèÇÅ"'è'—†M t·e5Ípö *ÕÅ7‘vud(’ jÉ`2ã/™ºMUü)àؾ çê£U^éD"íkzÁîn3ÚÙ¸8m\`õðã_í¼jÈ»_Ç+­23ADê¯ ŸÍ|=—àµb èú9äüòf© IØ4ȪNÁ6A¥6µŠšAaÕ$–êì°T*%¶ÈUˆ©Î¾«Ù“~q‚:ã‚“BxœuÌ1nÂ@…á‚Š¹/ZZS!A…U")m ŒÜ±ÊáUÓsꛣ\2ЛS'÷ä>ö@G DoôÇô¿3€î?53Ëw£Þ2°”{d¹‹<×+}J_¼q’`«kdrJʼ,Ì~XñD£ø¾dY)ª¶ÅožÈKT-SLlo0wEÞD>6É]ËPƒ·'Ä%r;k \/7DïM¯oúƶàZ–ÑW~a/Úe%x©ã#›ïä5£øÝkâïÛšª£j«Ž>Yqv;9Ô =b°\FC§ÜHŒsêâ•Â½:™Þ]&}ÞNÊQp~€s¨áÕ3µOÂÕÔ <Ÿ_ˆäÌáLW´'e ­aê"BÓçFÚxÀjÀ˜4^lqµ–2ÚÙy7éVä·`¶§Ë.«j(k­’ÙK†·š;{ä@´¼÷‘7÷„ã:YJˆíÎò½Òã÷{©LkÄò!ʳ:ÚUb— òL_ü¢Tú­]ÜÙ Tîµ\WÇ×ÂÅdðAÆç`Óý¢žqõŠ&é¦@ÞÔÛ ´ý ;EÒrΩ0y›ª[LÛ½dÞš¼{'ÜHP(`©àWŸ¬å«°Ìí¸’goûJšé’™ÕÑ$ñg©¯#Î>M>pêÍš=âÜ×VµQƒúw8¼óg·WÜc©ØtXò>ß½_#³Õñ‚ x^L(<ø²ŽóÁn!bâø`„S‹ïCµÁl¿G’ä;;¶v";$Y5ò¦qå¢J;ñ |o8ô.õÚÑÑ8îfäžw'5˜EF¿–ÜÖ+2Œ1ë±ìéùzµ‰¨ÄO=]øù¢zŽ-ÉPèsÚÝ.= M1¬KZ5 )¶±i†^ψnúº1é³t>äy‹Üò»%7^œÆ½Œp1fã÷*Åž›ktá# r™‹¡X~ƒÎÛЫEÐWwæ³ÇBwïlÆ„¥æéòæ0ëÉ'¾õäÕ‘‡Ôí<̘zÃl ÆeÆîk‰ OWHŒÔ-y<™Á“|yaXåþÛ‹ò ·K*ãNða^½+Ðë ÖNC:ÎyØŸ5AÉÊZí;òª·ÑªÖÉ` ~æ5Gb“Ý‘xü¹šÆ‰S/—‘»x|áÞ»õ¢›âÕx“õrQ_¤ÒÀçkú}Äv¶ë`s@¨„Õhçcý™ 8Ô¶÷™„/ÄNœL½—¾-:y¾fpxqYåM˜žµ¿[ÎóÝü5ˆ`zì#ý«uS)ž: \ OáR;ïK¸¼>°ÖÐWûe¬ÜW¨ >XlŽELæövF;ØÞ]ü†_ø…d¶©z¦& wúÚì¿€”•¨:ô4ûmXà\ì*|ŽûÚ›ØÛÇê8®¿Ù€D=úÐjwÊíJ¯¸~ðcyAUde½Ì*¶ÃœÇ”pÉ8.ó'¯fAfìc”^[ð®Qäž…êwë­\”˜ J5Ì¢kN÷*­G,r™ÒsfŽ«;—Ýâ+)å—% ÒxƒgL²­Êuâ8ÑËÀ.ز۹7#')¥Ð?qø²êA‹òº<ë#Û²+â3zŒ:„ž”—aƒæaù,ç2Öêžù)Ëë¾øl=¤ÀñÂ9(Ô¢øË­žzò$¿#uÊ1¦&¾q ~­êvê0w‹ øî¬Pßó®å)ûCö•Ho“`âÍí2ýµÁN@I°£‡?H¤Ÿ>2“n¯:íˆV8†±ï:Ý7™ù8/¥.ËI€áH|AeM›½Ôeî§;#ë§Bçö]h”2cËçY ovaꚧõ;êaõïâ×´yû`DÙíV_YÂ؃,õœ8åW{z¥–²z:‡œ·qøƒ[§ÇG=£½Ó-‘nµ©z¼;HIA²|Ç/Úâ+óL9¤`giÐ>öáÑIM]Ó‰±‡‚úŸœ5gøæj8ÞÔÛ½^d’m¨ìn%ŽÉŒ¾¸Iªg90nÿœÓ~µÓM!8ÅþSÅ áù {c,ßê|³yS°(Ï4Æ .ˆÔòpU®~[.”ÂÕê\T‚JÙy…mßTr@ÆN)åÜÀL†Ë̺B£ÉÛ”zJÝSxÙv:Í£fÂ>gÇGªJȃw£Ò5ö»w/iÏ4I;?ð,KQ¶&Z:ãDÔ*î+óQ¯wY÷kP ÎÎM“d]ßo¥±AÌVn§T™]|¢gu5´NNøv`[Ћbcǡʸöן“?,¾?]ÄQÜQ%Í£ý´5âaÓf‘RóüEíícÜÉ…‘¬G=\U*…*¤CV'ìw[‰©ÅJ îÖU«³ ßµÈ4”oÁ¸ãYBÄÖðÔ`C‡×“’å>nÚœ½­ŸhɃ9@„Ìö±çWKÜ'ǽKàÆ¥žj\‘õ…Ñ0øÁ‡ÏvBYÃxºª…ã•|Ót¾ÚÁVlñÄÈAŸáVDlãŲØ…÷Ì<âm1Néþ¶ª ð£ì7ùQ×]ÒÈ"lk˜µ»½­ÍÝm¢ë$¾Û¿¡Œ¼s‘ªÉÛCèQ4‰vœ5–×ÌIwËýf­òâR]Ítö[½ Û<"QépÉ›\bãx‘û:åw®µ¾ÎÐL9¨DºdGÌûÜÒ×5(únñË»Œì1œée³P»ìÀ±cpÁɽs7Å1ããxŠ]KÁãÈf%þôÔ4OÓÓõÈ¢<8¹+o!0°ªå>ùNgHa©¹(}¯®e[M-cRBhnÈñ2/ïëF‡ü^Ÿ{3ÿ2cO‡XÛn‘s1Ùƪs’Ñ¢Cž7Þ<¤lö&‘$`TFøØî!n§!<Ûmý ø:@¼‘éð±nÝ#%Z`Ûz³zkbkÑÙàݶ×ÃÅ þ1®ñè¿O¡Ñí¯ÂŽy}1Ú€‡v/a¼næ¼%@>@™â–^ÁÝR/ç©/û,.·\çÎ4’uv'½ï{pKªÐ½†ó´­è‡[]×=ü‚æù Í`3†3¦‹w.÷ô^¬?‘jÕÐÊ>+´qƒ`µ+¥ìnæåŒåƒºõ•a“–øvÛ«—°º™QÞm˜i5÷*àèðƒÝf²Þ iöβÙñªG¾*Vî0Ë]ÝÛ”ÄËY0ìé>ÓËòÕº=ä?=ÛÑ5\ª|3^u‚Oî`ÕUûÜTÄ°3;êë³çl…™|ˆ¥˜wîlÕÑaÍÚó¨e¬ë ¿ldXüÄ»±˜™ •¡–#3e»c¢y·ãoqÂ&$|sÛýÞA˜_¼±a|«Þq¼úÐNR8/qÄ¥^ã*ü‹ó·Qk½«ª8êínrÌcÕûynÍŽœÑo–Þk„⚸Ï]A4ò S+‹5Ï621e¿?8£­“çŠ^0]l;:•¸çÖ0âø¡ËÆ] ¨æ{ã.£¿ýÁü½øÆJ¹¡µk$¹8ï’•JNfºBµœ¬"•=¥g´/uÆìW'<$Zzɪ×é­êÇ_|Rfâ;n>PÌå°E›@?d!>©ðեɛ¹wóؾu&5ÊÞàòu³ ~ÝI‰¼yÖIΙîÉ`Áˆ5>Üå¦È;6oY%>»ö‡4×¼|í7_4®ëÊ Éƨ³X«Õ»}ŠíþP¬ÒÃÕñTÂ]®ç®;ë^_ùRu†béË¡\‡!䯳Ý_C¹$íýt‰’qÉîYs¥5¶òÀ¹Úœ»ûŸ•N§¹Ž[B"•Ðþ3-LJg¥µvmÂ+õW®s%ò“²yõÕ¶ÅÓÒ¹S+¼ï 9â |k£ÛA\ƒAQõõÌS½“ù•õöE-P"E¢°ã 'b¬Ü-Â.2Ùéát"=ü¯{m„ ¥Úct¾-‚ãréìy/Ž»{‘ÂcÐËs*vB\i·w%µêm‹ò>V$äíع+·m¶=׌tôÏïÇ#}}=¢nå½}#­Ä—»ÿù5e^˜nÃùñù¦”—Q±"7MÇ9 ñjoŠÓ­ØÀ^9‘ 7ÆlkW|I<ÛŠÆR #o~6 (L´ëÝ©Â>2Gv`•Nf·)ƒ„›z:–8úøÄM|ô8lµŸ`ÆèÒ«¸Ây×öýs,çÝž’è¸÷øÈË»B2ŽcƼ3îŽdùb¬4]'¶Ã¼—ÂR#ӹɃ‡xkHIk 6cÖÀҳŌŠՅáÕ­Š£@Lf{ËlÛ¨q?ëÉ9ÐÔŒƒciÁõÏÇ*øU&%h¼y85o¢Ãý™KJ&¯3r売.êŒp}¹{œ¥BÐ×8 0T®3t ¹Bè¤åùh],‘™¥ºæî3xÙ4S' ÓßÞI-G+è˜(òlÈ=ž%.ˆŽ¨½"g[¡øªó(ïñ ƒ>?{ïVõ¾W|;ý@ó–2¶ø͹Ù,¡)#â™ûMÜDŽ/+åÕýAU,þÓIÜ:JÜ«&ZîwŒZeÂH9M%ÊÆ{Ê•ÕrjT—„1'bü2Y1[E®¥c¤<ù›žÛ¼Œu¾D¡€þǶ¬âb²;î›äÊ®«a–Ö ÅçVŽ£&íöÞÙÑب1ñx-ZëÈðcå%}n ð`iÓÅ‘98±ÙC»6_˜Ö^Æ‘°ß/Ýè¥Í‹:Ô÷ ;$Zþƒ†üûÏÜϘ`œq€KÀh}ÁÖ0z³¹ŸøÀ[Á[©`à(K[oá7Ù‚é¼6Uþ" ÿÏ®ÑY04 ‘ìüCÅwôF8KoÃQ¿ÙVøÍ7?»Ž™᪪?,!þæ4UØ’3ý‡Ü/­p8ߺ&5EƒÐAŠ¿Iü]CÅmz Ðýq4‚æ/0›4ºgINd,ä †o90ór¤m¶n²ÀQ(ÿ{W¾ËZ<G&=zÖ €'Øþ-…þG­t ,Íi™›Ã[ ´pT' ÁƒF¦€á°-¿àÓ!P¨4M ŒD†˜ïe8 X°4ª5XŽÜü‚6EÿÙlûYûGØÿwûß:¿[þg è/꯿·þÚþíszHê$*ágýp¾â &TƒLÄþê±ÿ)‚°ß"øŸ®ßªcÜqÿ z&[Cá`(ËÃÀ(4ÒvóvÞ™žr @ê´™Ìt*=1z8‚³Ë÷ê¦Í¶MQ OO‚“:É™HŸèHi8÷“`]ƒ·óV8·a|­¨Tºs~¡X~·€DÒoŽú|!8Nd"™8.pHð`ûUÓîÄösVûXxS»$”e-<†Ò4O×$5]2Œ›¹ú!>7øbÓT®Áhz}Ò4zº¹aɆIoƒ:÷\gÍÐ ‡®êèå‡ìžÞÁËñ5gÝÛ?ŸØqí©ÚxAvfŽâ9þÒ,Æ›~ [âùØšÇÞÀ~Bæb¤²} 85{Výù8¢MG;õÆ;×®}g^œ<ˆ  öe°û{5?’ÎÃs2GÞƽS„ôqý\“…¥WÅÉ;m“è"—Û%÷çYf¢\v;}ª®·+ íªvSÔN%\8/ÇÄ.)Wo-‡(VzÞò™¡#”Óa¿Óͧ'óysg –lø³°=Ì_…XMŸ†6_Bk¡g©ÁjLéa´œ/—d4JÔñ{w²]ºp'˜Ä^³MÔ`Q¿Fªíèóúte>dyûYMìJyÊÛNÖ‰®f3«5Û÷O¼wЭ—MhÎHó{÷Mno˜RåÕg-ÃÂÚ«q 1ݳܧ³ìɇ_f¼-z¡ËïÀ-’90¾T¬Z¹Ä`äüUiTáw&kæýÙ³UËŸókö䊣¡Â{m‡cSÌ_¿¤ÞÆÞ!¥í5=v~:M@Êwö¹£9áœ6q/­²§IôvÕ›¦]ž@`ÃÄ‚í.G¾°ÚÚû6ó‹h ?Ð%â¼ÛýZhOs—UaÕ:¹k_çË s\‹8ùç‘Êý4{´oê€#îð õ““9(y(5mB¡4r§2’…úÏïî„3¨?òÌO€&ÀI¦A4nú¼¹ùdûàp´påÛ¾¢žÑ÷{í‚qqã·"õäE=‹í9Z?Ïas-ÃCÏÜQû2rI—3­/ßï­k^¿ö¸]ê‡ WOgúÑsnÕXáìÜ{”Âéµ1/ŸþU‘cgã½ïO~85~/«aÚÃ\í^Ó ²7–lqZl“‡_€*en7Éqì+6w‹Ä–I–3ò©¹§5X]#æ“BgIDíZ“¼9»|SÉ–â?,>~­-ùÕõ€€*Å3:éæA¹Ý¯½ûëi.†ÇòrVµ|8ÞTbÎSûÙÍ°7Û±E£kV^«í QÜ4Òï“ÄßÆNX~©×žÝ|ìQ¯vAÔ¢e¯°s1%éý§ÙÒÞ}¬yOŽg–ŠÆîªR¿µ«‚›vS¸}yí6¥ïJVŒ®xèÝC‹9ùÈ93QÚËÊØ=4öÞÒfH1y›{4"¼¸…é°UÐ\¨œ£ X7ŠA]á …4/ {¹>’+µLVx0°z$Às«e6Kd„g”¿¾_'ù Q4¥ÔÑÞÝ÷¬?§ÅbºQÿ°"Ore[<’sžôñª¢®8I èÖƒÜû¹çŠÍÍìzû’>VT#XÏl8‡TÖØ1Å ùJo$q^ÈIL Q‚/‚OÙé:Zß·I˜¼Ymßmx66ì©š}¿Ã‹û ôÇVŽúm¹ú±Ëú{¶42üeVü9+ñõÀ8¹áh`Gœ3¤™)°* y#˜‘‡&Î… çOÁ™ù›;ù»9¡±#ªt) Ý0ê‹ñ€â·¦~*˜¾x©ˆkšêˆo2ø*ùº{¸Óa€}݉$ª’¯ dKD‰^Þ$ð ÍMbid¦‘ÉD7 ŒEË¡p90žB_`}È70\¡«¤`ñJ¦ô}î_ é5ˆ æ¡>>>²>r²dŠ3G£Ñ  P:”êG¢a|¡$ê~Èw9‚åO1Uv “¬Ù XpYðÃÐÅž@&7ëG²Mâè„…ÃpòŠPG, …ÃqX(Œþ@1Ž(¬‚Bcq?,yü‚ð?LÑè¶äè. —”è{x¬—Ž¢Ñ51뺩´¿LƒeààßDw÷?¢‡ñ{ç•éåª@|6'Á?¦á_Î¥?’ZêŸrZš¾ßµtlf‚”–ÒfÂÀä`H8 £ç ¡èlô$û_8¾©­Ü±‘r³‘ÿ_ó‡.m¾©ñ“þyÄö¥àðô\ûù€Qòòrò`<ø;M¦Ÿs·ZH?hh¸œâï4y„êLá ÿCŸÛ¿‚§´²Ž([±ã[›-ÚE7‰‘èa½JYÄêU‘²c(þïÒV¬e§=´ ’IÎÌ7C~3C-ýÔ+bH¤1!¾P;“—l’± ò¯%Ë%÷"Ø —ËÅ7ž /zÀuˆñp)C.2¶!·”gr«5ª™,b<9Ì$Eìj¯Ð6s¹‡ÓdÉJ†åR¦YÌòJ—V&›k!0?¾ eÏ¢€Ì°‚&•ã¦x‘•A{bÅqs9HS¹×tॹ”ú¾à>ôº kHN (è ÷e¸+éõ¹@÷™÷ ·è‹¿æ™øZ®r–…Ü—^¥yC¤ !Zƒ2šC/c–øè3‹y´õ!`E„Q-EPý.]@_Êê´ß&D°W ”å h´2—î7B´]™¯Ü!¥5².Iõ0H'l½­„›ÒŽAz•$mÛNŸm ,êØvúl㶧ie¼¬ÌöÙΊ*:QéŠoçØsj ëX7 ‹ZýX,G=®@–OÏ„fuH¢YB ,©iQ ¨¸AxöáäìêèìéIh»­ùB |é?¾1ŽlûLã’& 5¥¦5QZ¶˜œ=½þœÓT¡ªÔ4ÁG'Tí'µLhûV}÷ðô©§ÙbØÒ¿…T…xsçÓÓCÇÖ,±O³äZ‡¥hYc%UaRÚ‡iýGN3Ã60c¯sû«æ±&¤õïSÍÖ´° ´¨`4ñ§:‚ÿ±ü«NXµºV_¼O%¼rŸàÍÕA\<òk.xšJð*{Ú䑉 {q¾.øb¤›^m™ ’£›x…%\}“ð€«ŽMÜ­ÆÊr ‰¤ÛÃ8-P ;{˜bc ‡Ê`nÀÃÈHÈúC˜ïs‰Ë,jµÚK²ÀÞ;¼Py’àÉ™j¤X5æÕ Ã7…ùv?pæä ïF‰Ï0”¦×äGÜÀÆŠ¦I´ýé{¹1œéÆïº14êÝàbPËo•öìtAž½û¦PSºÑåäfßyj€jfl¤>×{U¨kétS…k Zuåýe¥÷¶ÐªÉƒï³¤ì‡µoX5<~ãþ wë¶[¤ƒxœmÕy8”yÀñ—õ'BJv:0‰fŒÉ¸¶‘k¬ÕD®½ã¬1¹+·Q³92’Êõ¤UrçZäZS®"•c¥˜2&Ù—¥xóÿçùþÞßû»Ð(Ô5µ_ôÍÌÏ™žT19ŽÇ·H -´ì Tõó¡Ýšd/1çÄEÿ/O;º‘\Èî$À£7¤aÕ€þzô‹Èph HP]1DŠ3žD!;º«8ĸûtÍ ›"ÅF¦n#ì]£3zb €£½æ=PxÇy >Êë&£+ÌÃуÆa±P W$ô-lm˜UZ!Q{ ®@gkÌr¼K8€”½7øú¤—üÑj¢ß…ŨªB©ÒVׄäg#ü ÇyÿV•DK¾<'C pOªö©2)2>÷FÛA_ðŒAö*r¾ ŠA¡pPªSvŸŸk}Zbi…¬YYíØÝѹ§pcHgv^£:-w%ÓLî7gBZ£LgʼnþžÊ4c“=Jn³–} /Ãp‹™V·»øË£fÍ2œ½e™ñŠt˜¢ÎC1ÿR:;B¾µpr°,)·å#2¢b=T‡µ î´*~«Þ'F¹ØåÆ')”M€+ð/ê.”Û%Åü¢(ÈéFtô¢ž­UÞË?£ý¯â)û,]*Ñ>UŒù­”˜ƒú ®@`‚«³3¤ñÖõÐz`à¡~Oб ³N-W]Gµf’gmi+šSêËbiyÑpZƒi8¶ùÕs¥ÃôÀ ÒžQÔZå·m3Ù¿O;sû ¾¥jrʪaD»f4¢¶èãBze´LýÄê0èuH *…6étâ%íPît•WÛèâÌÊâ£0w‚D¦eSDmÙ¨M‚wFñbã«5HmyC‡ÉLŽ ­kšÅ CŒ§©ƒýþ]`*NÄ÷è2Ýö"$3¨þ³ó]÷zü~ 5Üòìlm¥sÕk7¹X÷ÍØ:þÆÙô!óü'¶§çPÄ´ƒlz­m„cžSCWÐgV}ivµ”ŽgÙÚüÆŒqɦ”+öÍá@åö¥‚èψدÑW”÷S£Ö" 4T$. §oW!ö¥»hßê0™“…!p3`r‡ sWð5áiFÉÕUD6$›SÈK§u¦hŒ`SÂ"¥ˆ|iö½ŸýY’#RùF©o¿äÆ÷ÕµÍ_°Ç7ú"ÄW”·'F½´Õƒ&v¸9tJ¥œ¡DŸ•W¦Ià×h;mµO*fû‰¿ŸÖœyñ… R1¶j¼\¨æ¾PHÛ¿|¦x<Ä›-=Q~_ƒÍ⢗Ûv§Çà>´ï(²Ü‚çHrGž%“Ë"j%ÙE zèHÚ­ƒßŸÐ–d×/žPs‚÷Àðw-|VxÍFô·6¡¥3Ü1ÛÊë¢Å˳.OÝ×KìB…’:\ÓkC(©Oo¹ú,4>¶åº–²6€  Ë`ëÊ»¾eL.Ób0ÿ=ro®Þ¥ÿË’;ð熽Axœ'ØÿÕ4Î4°­“®i“ :³S ¯³J“Nȳ§³¿–0/D¹Íxœ½X[SÛ:~&¿bK§Å¡Áöœ™3”´Ç™ !“Ë0<1Š-Ç:8’G–“fZþûYIvìP.…Òæ¡ØëÕ^¾½h·ÍílC ý!•ŒÄ®¿ïÇ_å,˜d|Úgø "P…£Á!XNH¤PÂ18Ôº x2Èu-áP$Kɦ‘ǯÃûݽp"d 8œ¢d*SÁ‘íe~ÚƒQÄRYLÿ&D*áÊ~ãS¤T’î7›h÷ÔW©H1ÜåT5%I“ •r¹“°¦=…xJ‹Æß ­DR ©Õ‚HºK‘O8H°TI6ÉÚ €ð )$ÌDÀÂe.É™vÞ@©¨œ¥ÚJýrÒC—¦)~;¡œJÄ·ŸMbæC—ù”§Hš I4=h“¥9ÛÖ sƒ -PQLðP Jœ#Üørm¹ \rÐL‡(퉑è£u4 1Qåi÷n4J§`Ü؉½‹P"ú»`q  YJÃ,nä.:£Óóñ¼Þ%\xƒ×]~4™&ð+S+Í’˜¡ptN®–èC.äìxpxŠ§¼/ngt©ÝhwF½ãáÚçð ï FÃq×@<èŸ]Àì¥ Ç=4AD`ª‹Ó —ú­ˆÈœb ø”ÍÑV>¦ÿ£±]Xð©-µa7gé„À…j@ŠÆèDÆ<^,î”g®ÓflE¤ÍOîKVU³V{͸gªMUÀ„}ª›ÑuŠN>]§a]qs°¤m®Œ6 æ¿T>•ÊÒC¬£pc4×^Æ&dœš× g¯ÕÚ«W¨m¯;´ä÷HÆîÃÂZ­Ö4Qœ-ûŒŸ‰€šq>5é &3Ö.aÓPÒ™P¶ÿtŽp¿ηOV¯sÁ‚Ò5_æ$ÎòNr¯ë†G#º Ÿ5V°_Fë—Js1û£8ú~F[ógò(îoa÷+fñ-ì<ŽãÄt@IðÛÑ3m¥¢ðç᳘OúÓ¶KÜ"y6Š¨Zù¹zë\΂údAIU&98ZÜÁüS‡ï¹ÝwTù„¿¢ñ©ø߶4W/ÞC½ J-Û³®6Ï Aݽc 1­ö3v’}Ø[Õ €*Kì †¶`àtÎ o2¼—qÓ#ÚI¿s®¤2$>uíBªçô‰>4'¨‚«"Ï8n}úÚ™îJ-_P˜™ÍGn¸æBk̵- ï¦p@]vP°3ûÞ_FŠY§R1£*bÅ8ãôùñê·åƒjR¾£;¾@pŠpëH4 $ñlÖ7[’‰Æ¶n«l’e¥†‰¥~× ÀyŸ¦†¢—+¥‡enKôá$´å¤ïcEewžài§°Áh®ÃìÚá2O Bd÷± Cæ\ô;W^÷ì|8jÀ昛Øâ@#´°rbçMZ߇7éf h$®'z6[J=¯ò€Æd ÎÞ.¾o`þŸá§¸Ùé 3¦’c.ì²+éD• ƒV´â,ÌJèõÓb5º."ýyIE¼9zˆIÝúìèË©~«dVíH\#tfÁ1˜ëeÕ±!iéú)^àï:¼} Î+q­KúÝ;C¿wô1Õÿ¯®þ í>fÉÔ°™à¶L¨Áé»Ý:¼ƒ÷ùh”»Rýx`NXGl°ïw´0esÍeÝЪ[y GB/€¹5ö7ÁFq]¡ÜÔÊ¿7EjPn!q œâfx8õÚÞÈë®ežî’g¾nR¦è,´’óÔÛ,†CüÇ”C«¬ºè™•oU²y¡æ1/ú%¬ýZEe®¯ÙËÏå.YẵL´îX0JnR^ñ+™•k¿d *—QÁX½ ~à´c×:§¥Ul-¦³ªG­z7ïš{ãŽÖà…×[xœUŽ;Â0D…¨âž~%š$B¡ ƒŠ_}0¶¯ìÈŸ@“ŠpîÁ5¸‰B+í¾Í<ƒÃ4&7l/ Ò2‘óö¶W'‡ TEŠíâ$8)`³[C¯„Êh§™.!I‘€Ó°4Ü£ÒÑý8ÌõkØ r}¶óÕÇ2­¬ƒîS¡ZQ+&ðCÊŸSTö‹˜¤b.jd²õ<‚!c̹È!ËXUzÛ iȸíŽ9y!CL;º£xœÍWmo9þ~Ũ'E^’JÚ‰IVJ`Å‹Ptª"³kÀ×½²½ÔÞýö{ÍîBÓ6Ñ%Õñ…õØž—ç™±Çõ£Á}ŸœªÆY-xÃރ¦<„5“Œ/|†z zIá¦ãƒ]#߃Kß}ˆ ©„`Éb³¹#âd‹¥†rP“Fó.… ‡+j*ÁqÙËüŒïã%S0gü‰Ô æ™ë6œ¥Ö±z_¯ÇRüE­j¡ Ákœêº$*žQ)7Ç1«§»ðwÕøË00F$¥ Ä\¯‰¤ïa#IC¦´d³D£Žºp/B6ß85(N,JEMå½2^šÁe×T)œ»¤œJŸÌ"À5 (WˆrJb#WKÂlc÷^‡FÎ!¸h‚h&x(2†W7ŽáÔYsŠœæ* ›e¢M$Dl¶VÐý DDç»k£‘ãÖŸ¥ˆ1º%jÄx×,Š`F!QtžDU§×ÃÔ_ &ch÷oaÚÛýñí›dg銦ÚØ}1TŽÁIÂõcpJnzÃÎîjò®½ñ­ ãÂ÷{£\ †Ð¿={Éu{þdèF½ÀˆÒ¿Æ}nID`Cª ‹T‡[¤^¡·QK²¢˜e+ô•@€éÿKnwy ¾H«l‹pÍ-ñæÀ…®‚Bç?šDÆ<^¯×µOjB.êQªBÕÏk/YUõRéƃ( ѬÒ!µåùžˆk#Ë…o2ß—o‘≱;a‡ÆYó‘ïO˜ÓÈŠC:gœàÑs7ò{½îÁÛ†ý•ðW·„¬%ÓôÓFS[íS3B"f(-ðKÒæ*’ øöK176gÙ,Q/à>”JcY°,Ì…r‚žÝiP1ó…D’·‚®¼0¢ÿ…9¢I¥ôµPØÞE!üùö3|(áD&h|†tnºwÓ¡7îÁ7(—­j8„wøøšÜQØÐ4ÐÜ®ôÄHÝT}P3?œB9‹Àí©Â©Ñü÷–!II˜4ÄÁ–Ÿ¹÷ÿ#†rÄSŸÅѳYöÚÝç‘ò,ôq±¤:‘|‡IËŠ£å~ã3~#BËË«kS?3‡.k™: ¦ÂQ*:âø]ÅECÌxúW)Mѵ#¢¾àÕ!ú*æQ²yƒGÊ7èzC £Y3Mƒl5Â1 Ççøý‰(š‚ÚÀ¢¼å=]c’¾Q…|д6ºleã´Z€÷™?WJæÌ6Ê[PþÇØNõÓHÑlî[ œ_)£ù‰ðS«6æÊ>IMâ.ﮥˆ~‘»f_ŸÐKߟ<™Ï— ÔŸtï&~åQÒöøÜáú¿Úe ¦Ido±ßÅfÑæs©\‘()p9cÚ†•"#ÈÈzœ-{êe”µ X¤ 'Ö†!åz0Ý+1´ð£ 3ÆŸÎG!Ó¼AÆ ìøÓr‘=—¹Ô^.[,E‹O'k¿ÚRH-<6©ŸÆ¸}O+¬H %æø<„´f×Fʪ»®åŒR(N\y—W»ð»Nq„ó±m.:è˜mÿ8]c¸¨éÇñ¡–uÙãñ rNZƒ)…/\àmŸŒDÁ™ÁMá­Š=$>eÖub‹-¥]ˆï+ûäÜö'$ %öúæùçžøô‘Çiÿe0C0_¯‰±ìÁ¸@¶9`¨¬B.Êú†\d;‘ !Å´¼\ù(U‰KÒ¬“¦èC‚$•*UUhÄC Æ^Û+™u°7 Uù (¿„+'‘8óo˜µã$ˆŠËíÎì73ß7»_×Þ½QÙ4°‰DÖªÖçÕ¥î)-8®6qÒvÑŠÅ€Çt¢ÐŒz±ð…¢c¢Ê¬jùËù÷k㡈…ô;b+84 é„}—c?÷R˜GÖÒJ­`Í0²Ò.žJ;ŒüW±Pü‰.•®`§^ ì°ÏI¨€Ã§n$zBÒ±ì›ü*¼½ž%˜¬¬´6<Àdäòò!mö @H'°%ùÙˆYxŒÉ›÷Æ:DÿB«iá3î7PôÜRŠ)MØ èÑ‘‰½B¥‚—ÚõO(Y;Ú2¦!ó¢çÚŠ—9íäM*D—«~/eÝŒ¹­iCòá,3\>OùÀ‹bR%›U#—¤#%Þík¢<ölgòñÖ»J2ÏO#‹d¢R!H¼gvÂMãÓT™©H“o«÷Ç´Ò^EbAr-œ&b£ú¶ib̤“@LîXfI ¢™Ó9è¡L%„v(¢† ÆOÚ­*Bäy²Pcü·Š»ds ÏxÂÕÙ+Áʧ‘B7è+7Êe㪑jùˆÛÒ~ò¬W°2êËðÛÚ^ ß)[Ö2x]ÛçWâé¥Y»ÿqÛæ—¦úãöúk«afƒ½ŠÙw? Ùó—H¡?^f–a:nF»Kã7A9cèFƒ)xœmSËnÓ@]”F…XÐ ¤C€6‰œÄiQµMmUU•"uÃfOìÎ8²'iKU…_¨ò%|ßÀ‚[þ‚wÆ K‰fîœ{ι÷ÎüxükóQ«n¡Ž)»ê´w{½»‡ØÎÖ8?{‡7’¡âXxB±ãP.x¤Âo¯ÿ¬- Òô–õ\Èq0w9*YvÓ¯XVJ~° 9s÷(Pr5$”ÏÁþ æáÄÄ<±à3!5ö4T|)<öÅ gApPÒŸÏ–1­¸º¨Œ}&%*6Fs…K¾qLØg!=¥©|N‘8¤#Œ™L²´¢0¢­'bÅ£¸‰£„ .E`Ä ÌeŠišTÇ&ïž‹6Düj“Ë›…øtÆ#Fuk»º|îšLŠCHQŸº¶v犅p5(ž £kt-¬XéýÝ×õ§Äײ¬X1%Æ”¥þiíêÁz}Y³n,`.cáÂÄ3qLÖ±Ozo$³.}Ýl4 Ésc@ëCs‚æRDÔÀ3AƒÖ$à TÔĵQÍuˆ&B½¶µLÅltk ˜ šˆôáÔÊår«…¡é|V9´gäFƒ>Ú»Æ"X??Û‚sÕ999Á¾a: • §hw0*¶°D¢X-âwÇ©á™Ñ§œSîQÿÜÐç¼-Htߨ[úñ æåræßœ'O„Ó¬—.J¿¢ü[+éÛX­•:ùæ ts¿ù^z²igcKï!Ítõ»d_fqNZ3Tï16zŽùj8Hëì}xû…†:‹ÂºôNÌ-=Å mò·ú¹ñâÓN:®l¸È¾~ÁˆiF‚`ùµ#Dñ&4)¿cÊÿ øPj〠Jxœ›%:—ÓO_‹KAK!7±ÂØÐÂÔT/Ù Èåt­(IÍKQ(Ï,ÊÌKÈ2J2J2R|#Àê‚<B2R‹ró“óK rRRŠ2ËR‹6ZÆ0 ƒ ‚‚Ò¤œÌâŒÔ…¤ÊÉ+Í„ â>™É©yÅ©: ùE›?0–1j Š+$æäç¥C¬„9@¬dr'sMrfZJjšB||rANi1s¥][”§ ä¬¤PÍ¥ txfL03¯î¹àÔ’Ò PAfžS"È NqA¦sFb^^jŽ¦‚5jaÆå¹a2à…rxœU½NAÇcÔƒÛce÷—ÂphÂâ¡!Q…ñBC(Xï6ÊÙÛ‹*€laKml|ßÀ‡ð\>sn±™Íoæ7³ó³÷±›Êe ²ô†6¥…ÉוÛyxvs¥‰Ùôÿ1„óÒ /MÎÒ|Ôï+xÂ`À Ø }Ö\—û.<ö4< PwÉÚ×÷û¦±h¡øVmòVL‰Ú6ZG=ÏÑõC~éHm»ƒ"?ä®Ïú˜S}ù\†*4¬ñêsÐnž.FÈÌÊe,­ÐŽµ“vtn%ÓÌåÐŽèrÏÈÏ2ÖâRÌ]Ÿ¹àjjì·–ôö²—`2>2™¸RÏR´ôd1—…CлZÕe¯„»W¿‰ÂjGVr´ ?“QjùO ePKÕÍÓ¢›í?퉀SãHxœ[%xR`BóäÏ,n›ùg°0M^Á,bh 5 ɉy 66 Æ“ùÙDÅA<§Ì’bk.…â‚L—Ä’D…hÃɱl†@­ýl’²± Õæš ½± vv †š›÷±½a¢V! ê!nxœmPAKA%pvuCò®XÎlb­`mb t(ˆcn:°íF»‰‰Ò­{̵?tèØÕ?Ó‚vw6Mè;½yï}ÃûÞ$õ‘Nó äá†JÛšöœ\]©N[Ç`°.ó¨ž5›ZN÷õd)VÖ­Þš¢DËB=»cžYñ™Dˆ€†,ô©uo‚có—˜î;¬3¿À3(¿Xf{ÂÉ T‘ СåC´ùÈ®!wÕ£6è:`U‚çó\ð™6&8Øó5ÓrÍ-$²(¤‘¹œHW­ÑTØ<Àu5ü*àÛ2.ÀÌŽðÕë|‚p<²¹ü ‘ÔxZ‰(‰¥)‚oÒèîÊ-Þ@Yþ$¯gÊ"½ ûþu‰bn6†Ð¤þ.—4þ)/sÏRÑ©>_^p‘¿sdÓ¶eBÛñz`ÔÝàL÷–~6¸À—a „YOS‘„bÈñoT–8V~¶”Š¾ŒxœÅXûoÛÈþÙú+¦9 ±½ýHÇÜ\b õC°äºA”¸²Ö¢¸,wiE ò¿÷›YR¢,Õrhp8Š³3³óüfèæË ½$kÆ®¯ÒÓ½ÅûN/5:TtI£IÇ*²dÆÂ5REaªTL½Û ²™vÁ0R46)]`aËŠhfœImƒ L²HõÝÄÑî¨JV»C§& MLg*UjM ¶_ó½L´¥±†Qx&AêØø¹Nu|×ÓâßĹľm6“ÔÜ«‘³05w&nÄÊ5ÓÀ&C•¦‹z¢›^ ? Ūñ¯PÄÊÇ©RË°¼¥…ÉhÄ”ªP[—êaæ`ƒ£ ›ÏÌ„z¼ÈÕ€œ±óä&ŠœJgb~9½¼¡seF:U±JƒˆzÙ0Ò#:×#[EÍ•$L·Òp!²ŸØ ~‘§OWN›¸FJã<¥„ï´—ß–+Ê5×fîŽ=IÉ$,Z…ù Š·’nlÆÊét,öLLï&Ðç:Šh¨(³jœEµ\øé¶;8»ºÐÉågº=¹¾>¹|>¿›œ*.6Ö¦gI¤¡Î¥Aìð!WrññúäNþÞ=ï>³ŸºƒËý>}ºº¦ê\ºnÎO®©wsÝ»êlõ•*Åàã>–$r(èÈ–âð©·°6 i<(”ÀH¡IB h„òÿÃÜ®ç‚ÈÄw€e„9KwL±q5²0þ2êx>Ÿ7îâ¬aÒ»fäUØæûƯìªf¥Òlþ¦ãQ”ÞYjÓ˜¼¯”Ilè:Íé™zĵ°ÍMjâ&© B&®¨Ï–®Ož•¨+°Fv¨_ÂâÒh¨¥ïÑŽ& 5Š¥Ž´Y}¯ª3 –æTÔì¤\B¶b—š5fI}OT [c‡<¡‰)Q&¬Ìnpé‚ÕàÖ`ªXÞM`,n·d¹P¹M)1Öê¡ÿÍ€G€&@-D{lQ$FòìIßà7 ŒGX¶}Ý·š@L¬à.¶@O,Ü€d6…Ý„Éu>enË=,ö²ÌŒÚ@(èàQ÷UÆ”™ b°ˆ/|áƒt1ž£^Ѳp@Q{‹ÎJ‚ v\'lNF|8Ãá]Zö]ÆÜJ섨ÀM±úî€i‘Uˆ¢Œé<Ç°ŽÿNX£øç³ÈiÄû;ô£U0Ë»ÍJZDŸ¥,‘+|’óøè† U´b'ç=š Nê+¥ÖçVÍVì^ÜŠU*€€†˜tÊôƒÛ‹DŽî2“ü{³œªèbS ŽCxëÀðÌFÆÙgìHgÖ÷1C–‡¨KŽÓ`¦Ž‘±2 ö!äX gX¼š3:åÎÄlGªXWõ×)Iƒ‘„ È=’È.׿èšëÅÂm5ddî´pI˜«¥d´øž,ÁðAèÑD8AcIÕJÀ|”V·JnG&ĽX ^¸e™ÃRg ËÚE~/{Ï5„vò!UïDåE¡¾ƒT“£™Æ”´.ã݆¾¨“TÊCä­}Ⱥ¤]æ\qÝÆP!t²ï@¦æ¶ŽQ­ì×e÷òô­/ÝÜ.X”$BMÔõh0OµsЩyk°‰aðçÖ6H©GVØ©ô.ê-ð±ó@˜˜yQ¹‘4àܤS–”´ b7ËFÖsÏ—¥rA6aù¦ÎцìŒÁÉë¯S×種B?¾‘z´›¥F@FøA|« }¨ Ð0è¶"ò™xŹ 9ûNbmCÅ¢€sj—ÇÆ7Èó>WZ ´ÇE=-ÞƼW¬îFÈ,.šª&­cÂ,â\ýª1²¶sqò¯oý×ÿ¼êIT¬Ã¦4âö¡DǨ.þ÷eÅô•Žvæ((A—L¹xO»]çn½•NÙ—ðùn°ÔÍúþ=1(;ªÿ)uæ#‡¾d€ñã€wotB’¹_6äûÜ£^÷ÛàìúãÉï´ûÈÌjåG…P¶wÚú”¢Ëjt_£ifÈÉ,¡#00“ñ»Š‚E£UË3yTÉg 9´âµ<í!ÂÉ`aà}6BÅ ­r—fŽ›û[?ž=4œAUºÓ ÁÿdGër6Q#ÈY¯Ðó4ÜÃ7äˆè˜k %"«“ŒŽéM«ÕòB‰>Ó½TÓîA«ê)\›»GGUüäÝ)Ç—™1vÚ}^Xxys~ž‹¦él„Uq·ˆF­TI™þÄW§Õª˜Uã0Õø³@ê·&¼ãSò›Fê5ôß}.e\­ñ›µy˜¤ÖyËÄ|^%€šÔ¡#šÑ{ŽžÍcªÂž ÜC`†³{zW<¢W¯î«•áÑà¹Ø0Ÿ¦÷Ç¢LS’`ùQÙ!š‚EÓ+fáW]Š}™~e¡Õ»þZe&|V B§^ƒVû<~ÿá9¸>×EÙòkùtº~:åS_ákÊŠJÍ••^˧ÓõÓue?+;?%G'c|KH— DÇy=æAöäãæo[È>3?òüpw‘ð•U_„ëk•Ž©ÞFfu àΫ“ð}w‡ýè#KÑ®ôñY÷ô¬¨C*…Ç+[ `Nª—\)äV”W[$<— Ú¤áfÎÒbšÉNmÆcÞRõï [QXùÿ„ˆM¿(A|¹V ñ£ÿÏó«ÛêšÃ·ü¡Àé(_ùÂü£æ 6/F”:ïe•­#XX Œ)NS› —‡KzžCå6NÁ½ ÿœ.9/m -ù¤x];=fç¡/±xµŠbŽƒØ؈g+gˆÿ¬È˜áŒ ÄŸ›£SÂ(“Ó4È'%æÂjû¸“?\!ÔÙÔ|0:|dP®X^zœd~«ü]æ#-ç£çÇt¸çiÍ—/›RÞ™wTï`ÔHÜ<åX(-A»ï{joð¶=oåOõ«Î¤e›/­.@yZ‚¿ÿUžv†ä¬¿-•}ä:‘TÊ/¿ÔÔòÚvŽÙ_–EÉÉš9>‰I˧/içÏNþÜËŸûùó æÏ×[s-±lÑßOè‡ nþhØå{®n½›Zà1P´ œ@gä:ÚÛt´ŸÐÑÞÔÑÙ¦£ó„ŽÎ¦Ž½m:öžÐ±·©c›Žý'tìoê8ئãà ›:·é8|BÇᦎ×Ût¼~BÇë’ŽJ±ÉÑ—·Oâ¼ µ…Ö^£u„ÖY£í mo¶/´ý5ÚÐÖh‡B;\£½Úë? [¡¡}À°Ã_HÐßòø²¡ð'Út|Hùo›ß"2þ 1ñlöä’8xœ;g¸ˆ3D_‹KAK!7¹ÀØÀÀD/Ù Èãt­(IÍKQ(Ï,ÊÌKÈ2J2J2R|@Ê‚<ósòÓJò\2Ó3Ks’óóÊR‹Jò‹&&ˆ±êo,ÛÆ\«œ™–’š¦Ÿ\SZ Â\©@ Šò”œ•ª¹”ve¦qÁ3óJ`Î N-)-PЉdæ9%§ê€¥‹ 23óòRs4¬¹¸°XP 3¬JPã€@xœ[Ĺˆ“__‹KAK!7±ÂÔØÈH/c"¿¼Œcˆ­à©à’™žY’˜£P’¯à˜—˜“Ÿ¾Ñ‹Ÿ… ¢xr<‹3Užlé± xœÛ¥Ò)Ë£¯Å¥ ¥›\`dl0‘GƒÝÀÀBÁÓÈy£õfö‚’Œ¢ÔĔɶ,ºÌ@±É¹,:l@y½ ¥Í_Ø¥eË3‹2óÒ2rA@uA©é yù)©ºvi)“¹%&{pÚÈ"…e–¤¢ªÚ¼ŒÓ’°A! )çÎc$ „×=Q|™Œ“ðéÂaò>?°Ç=ù{€2×øÕ¤3’SRŠR‹‹5¹ª¹2óJÒR¬ÌÉxåã€,hš‚†PØVÉÆàÔ’Ò $4l 4ꊀ’Ey£€åX=“6yµ@°0P °UH›l!x\ «çÒ&‹ ©IŒ“Úç †‡`xœ{ǵ„3N_‹KAK!¥(Y/à Èât­(IÍKQ(Ï,ÊÌKÈ2J2J2R\‚œ’óóJŠòs ŠòKò“srJò‹RJ3óòAzó *‹2Ó3J4’5Œ 7K1ÞcöÊÌ+ÙœZRZ”ÊÏ+.Q‰dæ9%§ê( „òJs2óŠaBɉE Z)©e™É©š Ö\“X厤<„à€,xœ[¹ž“[_‹KAKÁȸØÀb"§‚‚¯s„£à©ààé¯ZQ˜—’Z¤œ‘Y°Ñã ³pjEIjQžBf^‰BnrXùdgéâ‚Ì€ü¢…äü¼â°|Jj™gŠ¦‚õä69)Y"…ârxœ[Ϲ“S_‹KAKÁÈØ`"§»…‚§‘óF qFƒÉ,j\™FÉŽ))E©ÅÅ“ûXÖ cí-µtxœuRÏkA¦T¬ÙfSs)„*>’@wKóÃÒ¢˜F,¡K°ô°Ý™Í>Xg–ÙÙ„ ¥G½Ê\ü< Ò›§ž¯ž¼ùoxðàÛljWŹÌ÷ÞûÞ÷Þ¼7ŸšjvgÍ‚5ˆýàöÖ­Í·Xì>È ìmì~ìýœ_ˆu¨¸ÇLÿRë„|í°nY ~”2õYâÔkåZ/&%ãwÈ*=9œKbžÉø!ÆÐMÁ¹Ü×8âÑŽ°ÅPe¦^´ž …r|ÂG\]$%¡L#G˜q!C‡„Ò„3ð¦ÕPÄ©Îøív;“9ë0æ«ÕóeWû/åtÙ®ÏÕ hY¬.Ì–d>Wše(ì×ü¨ìÏg÷ÞÒëߤoKÍÜðwS ‚ ¯¾ûø"øGøà£÷GÓ¥kÊŸ.7ß9ß9÷|_>%ß^<]’` övZ¹¼¦_ Äûe Øåóòê´zÙõv]ÁB€¹úlA’Æ?û¨Ž_O'ñÙ;y§¿g·wUh6H V%  åz1Àk:(s“\JvñŠ[ƒ4­aEÅlJ¶· k¤Œ_LhÛ¬Ü6«á F‘ã`W €:rí”Ú ­À¾ô¨,5I(:‹ @ Ä2m³ïú®W·\3W®"Û©¢ú ¤¹ó“BàøAl‘uQÂ~x“—pl ‰ùˆ,Jìá?±ýèth©xÍ}Ð2ú5jû©Û \³ÔRPP¢r ò`h,ÐpìŽã<ÂÄs¹y 9¥_eÝàYø–¸ád¶|·ƒŽ¾l8¨»–6|"aÿŠ% 4wÞO Ù+M´—çöðáüñÞªÿäMyƒIƒ ±%Áï„ï}ê-·ù?+Ìøá&ÑŒ/pŠnï£`}'ìïÑ~n7ºèø ¦jø£øPþ`<#-JÞPç¥+Säx,}9„$âð¦0kóf#‰š•re œÛ溹Á³É8U¡â¯q¦þ3~ÿŽ_³rêàeY™"³~"+ø<§F´ªÜ[Ûиpx¤„Ô“““úàïñQ§ë{@GÓ“þ cYPæ©hxœ›Ë¹€“__‹KAK¡ 9ÍÂÔÜD/c¢€œA€³ˆ£àiä¬ààé¯ZQ˜—’Z¤œ‘YTÎéœ_PY”™žQ¢ ‘¬©°1õ-³)Ô„àÔ’Ò h~^q‰Bf^‰BAfžSbqªŽB(Ó(Ù1%¥(µ¸xr ‹">)ôá€xœ[À¹„“O_‹KAK!7¹ÀÈØÀÐl"¯§¯s€˜³ÑDŒ…&39Å6 «å&†™pxœu’½nƒ0€‡LX•ºu>)[¤Úôg#$"H) ÊÚ¦ ±D "ecèÔ±ê“ôEú}“»UÉ‹ýÝw'ßÝz?;×'&°Kª©‰ÙÃÇëÅóå&8e– V„¥¤nJÆÃøÑV$æwÈhA +kHÊ”À¾¡,‡vKàÑD"p×r¨â^ïÅdK«+Ÿ?£å×÷˨ÓõcpHrÚ´¼ Bã”d”íŸmœk>`¬B†@Æùk+’ÞT ;©šCêþZª×j(Íôn(ÕÙ *Ý[4îØ‹l‹ÿ•ã;…,¨ÑÓ{UjÛ÷daë•…çñ¾ÏiÛä@™˜˜ PÿMà8ñ¾q­pù${Ü› ’Åû¢å.mi\Ð&n)_’_‚鹑†Ñ/ÿ¨ŠëE xœÛ¥²C‹O_‹KAK!7¹ÀȸØÐ|"Ÿ:“¡ùFód 5yKˆšÇV0Ù€‹us!«6#¿y›&S}Afž‚®­B^~Jª®ã”Xœª`ÍÅ¥ ™¦ ’µQ°ÐääÔ×WpJÌËVpÊ((¥¦+(Ø*ø:WšÇ{ú»x9õ)(¤æ§©jÜêœÀê@†+©Ù*T˜ƒ…jAÖæ&gµ*ØØ€UXO¾Êå²Ùƒ3€‘Jnu%© eÈ.:”K7_åêÄåJ£€2yùå º†¦ ’2K`úÁ®WS0×ÄæA\›Ÿ“¢³#%±$Ñ¢¨sò"QYˆ “5ꀖhB½õïäsµLâ¯BÙš¿å8Óh¤¹  ¯ª^Õ«*;ÖÇ>|„CRM¦oã¯øЛóê"Ø>Wp—ÜÃd4ž|¯)šÈFžs–ä ¤w2GGEEF:Ð Ö‰þE÷¨ëîÕ]'ü5Ý´ºòZ6þVD(àœ™@å«;™+UÉG˪ÿ&JSÁ÷¼–TY‚ÈjG…¸|ª˜e¢ðé)àç;‘&Ï¥ y¦ÎDÐG¸ð#$¨MДI%Ø…rS pà)Ë. ÂǺáºE؆ƒÔUê‡'o k*%ÚžhI) 8î –Àš%´”ˆlH*Ëœ¦°»Ô±K]PÔKŽ)ˆb¼ehp Ág˜6Ù¢†yXæQZ‰^éÐ{,ÿQ×èá»qê•Ñõä¼Bu92¢Þ3+ Øé¤Ù±4 èÏn¼ò·1ØÞ <Ûah{ñËïè¯rŽVz¢†ª‚!9Š¤TÔÐlœp¾Â({æ®ÝøEËXº±çD,ýlì0vçÛµB° ?r†¥7=øyß³zˆØØ”* yÓ‡½Äj‹üDqÊNX+Á3T]~:Ûö€©nÀ{‡‡‹›AÉÕ$ÿ‡^dÜãóù<Ü—Ç!{«0Òúó—ž*«ßï[ÖõÖéÇûÐïHiÆJÚsý…Ú½Þèm4º‚¿6ØäÃÇ‹ÏÖèÃ;ºp–ÿØï—k¼Ï}Ï ßnR!Xcö k°5~óÛè¥Áœ£Ôèxt[“o°kXyl°‡ŽÊYÍ9n©4Ø´«r¦ÑÏ•Æ÷kG¥Ak«4à¬%Ó`‹–Lƒ-;2ktDVûn_÷ùó}Xºü?ã™#ú”æ¼,×5ýdNé’j%œúaÏišÉL€Q8 ×!÷A­-¦½¾wOTqhŒÝ0´Ý©„WPn4‘ìlëIVØp&‰$î‚ã„’ÝÔY8 cɈ®ïÄòWÜ‹­ÔàÂVb hÛÒ¬‚UynÕHÇJ-ˆÎBm¡Š«s ¼sK àh¢nå‚=ûp*‰D(Ó6+ø=;j»/áSvš¹­8\»­8\«½8Zñ&ÊœÄÕ)Í©âê”âT²›S°›s´‘ ÞêD,æ{)c`Þ¯çãâàX§7¶êºwxœ;)ðQ€W_‹KAK!7¹ÀØÀÀh"¯£ÑFCF£Íi,ŽŒÞ™i ɉy ¶¶ š\ @â:e–+E’ €@Á(—šSœŠM‰!XÉäS¬ë&W±YÉ-l@ÒŒ};|Ç ˆô$¬ã‚è6xœ;,²€Ó__‹KAK¡ -ÙÂÔÜD/à Èãt­(IÍKQ(Ï,ÊÌKÈ2J2J2RÜœAÊ<œÜ<ýR+ óRR‹’32 @Z'÷2*oÞÈhÀ( 2 J“r2‹3RS’*'a2‚Šûd&§æ§ê(äm¶a.cäCŸ|€E”,4ù*K]}ZJjšB||rANi1s¥X”§ ä¬¤PÍ¥ tmfL03¯æ¡àÔ’Òäü¼âˆxfžS"ÈZ„P¦Q²cJJQjq±¦‚5—r&†eµ0+)^¢è€pxœ[À¹ˆ“__‹KAK!7¹ÀÄÂÀH/y"¿œ¯sˆ£à©à’™žY’˜£P’¯à˜—˜“Ÿ®œŸW–ZT’_ÔÇéœ_PY”™žQ¢ ‘¬©`d`h¤»1ö-³&Ô¼àÔ’Ò̼…‚Ì<§ÄâT§¸ Ó9#1//5gr=‹"²…*…é€ xœ[Ĺˆ“[_‹KAK!7¹ÀØ`"·ª”±‘Bp€§‚c^bN~ºBI¾‚KfzfIbÎF/A&cƒÉ±,®«´é`¡(xœ•”ÝjA€/,Õ]-*J!^豂ìÖ6Ùݤ?ôbŠ""†ôÊ«2Ùl†ngÃΦIÑ’GY¯|Á[ß@ð¡<3»›lÒ m`Âœ3çç;gçÌÏÒŸÒReU‡U8u{Õšã|Y‚æ»FSnáÓ€úaÜ.롉VDƒ0:Ð #ˆ»RÓ*ãÔÀ¨¡áœ¦r¿Þþ½‘,/<‰Øc<.wôgŒ»Aߣ°×qyL«Ä¹¨°ÐUŒ÷‡ÑcryôLžŽ,bÜo²i§\‹µ”›S+YÅåëYÎ뜡ߢÄÛ‘%Ë ¼èDᩪÓ3—&÷n~¸ƒý’‡Ú‹‘46õ:@Ÿ æsêIÿÜw˜¿m —ËÁU…]4”1ÎHЧ°jôJÞsº.º!=ºqÄ|ŸFÐ úB!„ø—e£¤û»2ÆpÛ‚O`˜8yºø ²·¦Ôp ¶~à‘˜X€JgFi›Š'ù½ød”†“ Ôˆ‹Ý©!å9í"S´’E#ùÍpŽZÇÕã­M“æö6´Y,”`r†³e¥iå¯m!¿üjÉ7­t+ÓÙÉg rÁ) U)ŒR!ï a`çP5e…ö¦*±mKa[îÛÎ$YDÉIZàel[A+êÍ9Ô0¡^ØEªË¼³ˆmkÂc_gÓóÔæñØ[sº˜ÝýVòC»uº´Ö°úʼ6¦S³òíÌÔq3ùª=º>õ:€ IѸñÌ{W¿˜ {:ÿGxÞSÃÞ@ǘâ¸s:7¹KrÖAÞüñ»—ùÊàµz ±Àšã/±3kj¶™ãÖ=/¢B¤²PSÓÂl©ìÆ“ÃÛ߇µlÜŠcª~ûU[afs ¥pFÆOž_¶4EÖKõäJù ¥æ„>xœ;)¹M|C: [i^fqIÊæH–nFYk.…Ò¼âÌô¼Ô…äŒÄ"…¤Ò´´Ô"…h“ØÍ_XÍ%‹RS4òòSRuíÒRt ò: &“²‹šAÄ*¨)k*ØØ(ši*Ô(hÀŒ1Œ Z€Ä’àŠ'ïåT›,Å¡ƒÓpc á² fBÌøEÀ QdT»ib7*ˆ$c °c»y—2Enè¯ xœ[Äyœ‹W_‹KAK!7¹ÀØÄÈh"¯ŠRð4rVptqVHÎÈ,ØØ°Œ¹>%5-3/•Ó×9¤,>8(Þ8ÞܔӀKSÆДÓ›¸™§6q#Nc. wGO¿xCˆ˜2FX,K˜`±,a´e²2‹%3Pdr<‹„J¦Q²cJJQjq±ŽBf^‰BqbnANjPbI*„Ÿž˜™7¹‘Eû£Qè7à8xœURËnÔ0] UjÔòX²âªEtReŠ't:ÁLU‰ÝH]°@U±’;‰¥àDŽgJh~”/aËŠþ€ÏáÚŽ“Ö‹ÇçÜs}Ïñ¯çߟì¿<à>%Õékÿxx86ÿp¹|ç"š Kx+yQf”rƒJ—ŠJveu«D–k$!Äl~üó`{#”ÙRœä³àPȤX§JÂ葃¶õI~íen]¿÷Jh<3½ì¸»Å†k„R‚Î2±A •D³«ù·{½ã꛽½7Ûµ¬E&1…$ç êJœsÍáC|ãà>J?r.tAJ$³³$!µ…`jÁd™âpFû9¯‘(†³",g ,¤pj[#BGŸ_1«…E=êÁ9s*Ýá×) nÐÙ NCxA,vZîrг&Ϻ`¡³³FfXvEÌN{ì1 ä›áÎÓ­n•FžAl¿uñ¸À.Q¯+›ÎB!7ñ€ÄðACŠ‘ õ V¥¢ô|¥Ïn)ŽjSoyŒjÅlÔ#wúdj)km#hýŽìÝmAI,Âà Ôü޶裸óÜZ¾ ‚³+„‰ÏJIQ´£æïã£ë¸uÐ[ÝšÞiltÞ¿W¢Ü{¿N©ÕgÖÇÿ998á%­8xœe‘ßJAű’fRéE%`Q<µ´šÍn\!±´4ÄZÄ ¥ ½/&ÙIv Î.»³ÝüóRæ= â;ôz׋>Eo;;»6Bçf¾=ßÙ9óýæûüïç³­AÁpÔÙìÚßf_ïwmì¶ûøt°»ž  –T¸,ÄÐã¶WŽ| Iµõèc­k¯{Ë„<öô,OP¤|Z*ÊËò‡«XD|,˜«ChˆŽÛ'xKUÖ ÞÁJëN°3á+Ä otcgÇ4’K†Uá»líýÈmbÐD»®[ÿ…fÔÝÒÂt©ÅòáS.äô~s•ÎLªž,—Lô¹Z(½ õì@–ªëÊÒËJ«…#/ôЄžAjF#F¡(\¯B&ãPhD÷¯RàWeÒx · ²²ç à"jbÕÑPÍ+pÄ22ˆí;Í¥‘x|è!a+“ "º~’½’ùV]Qr›[«þ˜qÔ¯ê¼úS}vHÿ  ð> 0'—›¾˜SSþmF/ƱÌ8´*«…í·Xxœ[Ĺœ“__‹KAK¡ 9ÍÂÔÒP/c"¿œy€³ˆ£àiä¬ààé¯à˜—˜“Ÿ®ZQ˜—’Z¤œ‘YÔÅéœ_PY”™žQ¢ ‘¬©°1û-³)Ô àÔ’Ò h~^q‰Bf^‰BAfžSbqªŽB(Ó(Ù1%¥(µ¸xr#‹"yš,€ï!÷GxœuÁJÃ@†‘¡‹'O‡ ’-¥Ö-Jê­´BºMF²I˜L¨Q¤¯ ôIÄ'ð ôèÛ¸›¤Ro»3ÿ|óÏÿ%ߎ6çHqŠ3ÂKón-P§‘‚µW'(†"É RJò4PÇà1„„¦Ž !vt)/bÔ 2?TË<ŠŒºgºV0I҂̃ãKô/¯wï¦UnÇÍ-N1ö£|© ½F2“3ì…m!Ä_Ÿcf¥S¶&3cÒûmg;¬Õ÷ú–ígãöåYl?Z‡ŒyG§üJñ(2¦ÜçŠç¦žÍ |ÃP˜®VÚnwÎÊZú]ÈðA%+§,HYÉpŽ!ÂUÍ1±º;«®öî7à,&Ó›kw>—ÒèÁî‡Ñ?ê=q…/e½Úâ.QÉš6)Î)®aÆn"pŒ_Ë:¶°.TWXè“ø ±†ïYxœÛÌs™gƒ+[r~^q‰ÂdÖæÉXÅ'÷°*ò(Xs)(¤æ§©É÷Xå'ÿa5oÍô¶–xœÕY{sÚHÿÛ|Š¾\UR˜‡ìæâ8WØ€M œÀËå®R”k6B£ÒŒŒÙìÞg¿îIH2~$ëÔÖQ»Ó/u÷üú¡¡ùª¯`Í#\yßvØ;$ìu"7æG¬B[Ù ŸA•K¯3- >_Dv´¥ˆ@y ,[† !eÌIÿT„›ˆ_{ ªN Zí8‘+8gË")#É©Ç%,9>@ àbÑ@”§-§ d=Ù>¸ì†“„Ç,x¶;€ËÓñÁá¤ýœ£TÈAÀÅ\¸á¶¶7`ˆyüó|(…Û8ðßÐŽˆe–WSO©P¾k6ÃHü‚>Ɇ‰k4¦šQš¿ý7þa|ü¤†Èø2b ¤Xªµ±w°18Ä\.UıB¦Ämâ鬄˗›Ä ’cJ¿Î¦z%ÉKúr6¼‚ &%òÎX ó<Ž>wàóH¶LŒ„D—æt±Ñº}rh’8}°Až"Z¼ÁÇïp˜<-1”X®ºYµEIµ†îoÀ·ÕV»±;Û ]„öÇ!Fç¡EŒwÍ} bÉ–±_O, <ÌÓóÑÕ:Ã0ëXVg8ýx¤'Ën˜±ÆW¡ÏÑ8ÙÚ` ‰‘ËžuzŽZ“ÁÅ`ú‘Âè¦ÃÞdý‘w¬éàôê¢cÁøÊ&½À„±\ÏûR"&ÖeÊæ¾Ìåá#½Do}<û†!ÆoÐWn=Ûâ9€í ,m]yi†‰È` Puèü{2âx½^7®ƒ¸!¢ë¦oLÈæ‡ÆsVU³R©ü•Ž»ø\©\.Þ‡)PEÚÒ ”_ÛÈ&Î.²Ú„LÉ>âÛ¦ÄÄÿ±‘wË~‘åÆ{î5›XúY[¡Ê·W a+‘³÷³qjžØ $ņǃÚx$.qB¡ŸL½±"–ŽgG`>¯Ð™®éjÇð¢‰~%îµ­p”j`ÛVoçJ« ÿR Ë€­{ENÆ3Ð"o‹"‡FE&!¹"oZúSlÿ˜ v™ooôãŽtj.„cû° èþþ™±Td;Ÿ ›XbÑFy˜Ì,^´Ffú.e©Í»+˜ ~Pë ®ö%Ã.‹“Aw‰èÄ ¢~ЙwÊPßæ,Œ¯ í4/Ù7´^A»3ÖÔv+ÿü‘¡m}B/§†öºщ¶Ù.Ddh‡åˆNˆú¦‘‘ý©‘¡þ­‘¡u Z¿‘¦¶Û…ˆ í°‘¡½Ñçy•L'‹>?Ä9ØÒ¹ÎO:ÃÌ/GÝ*¿m•˜—ËYÈy]æLzÿ‘qPft“ÉŬx†sÞé ‹'k裮U‡!cð˜ü"˜ çjx5éuÍAQ°]¶´cgÀ·qÌëÒ¢%‚•£ Ó½j.„š¶p*V+\=°Ü\–Cþéew>³Ó^!@d«×!^·©›šu”Šñd£Ì.:Ó¥i㶡t±³ÀN©%+¹ä{nÇ3û%þKÚ[‰+7ãE"Ø®mÇÁÁ+†6àrõ|Ó«<Ç’w#¸»ªi?Áêo=µÊ— djÓñrz ÿ9ü„}¦Ì°¶ ܆bGÓç8ñæØl¹ÄT!äLµ>aÛÊÆhgÌ61Ñ«ù€Èä_f¬¡nç‹x™L)äVã@òëíµL71Ôˆž"omå}\ĶŸcÜ"SŽKÓfŽ›#5'@©€¤¹5÷~MU³Q– à‘sœó5¾‡:6½0@U£:ajŽ`Ÿ_âz×9ëUÛµ:¼D^ …OK%í…_RØ.#±úFà>²{3Úví0d6nX#ýuä }hSqD©FŽ­HS›Ç•ò’æ©YT ˆW òs©ý—²Šé±©éE¤[?p|Í¡mvόЃD¡Ê× zÔÝu‚môÆ8&P“ï8§éµ}‰ó‡‘«í6ß½B·iβP£ÅªTX¯‹õmIV¢Ê× uA­¦ÊŧҲk=¹æÔ“«-úª36Ñi>ødJ/©=—_seûzZän2Æ,Â7¨•AYN–qàèá–Ô^rÑ°vä~7Œéö×S¨Òâr|e¦?nl?fE¨­lùóÖ†÷ïI.ÉܪZŽµ %¿¼¶¾Ä#ÿ/i×ôa0_²r¿#Q?E›Î(½öÕË Iß»éäƒÊÅrצa&ÇxOnH®"ß’¢-Oø®‰‹þ8ÎÕ¶v¤v:Iþ¾ïÑ´¡PmNi:< S=?þ”R‚︙ÀY-&ù¤/Á$ñ/Yv“j>œS›0.F³BîÂØ÷¯Ânp* ÿžü•¤þÄJßéo ÉøùÄŒ¢$!s|Õ_Mó¯ y(æR™) ¹ W|‘ªç¥µLV˜;CÙ]›OˆèI•‰ÕŒ¾\€¥Ú|<Ú¤8u” ĺñjµÉ “ìOt¯E—ˆÉ-#îOú¥èû‡t“À&û³MnÔ¾üžè¬WùÁ²['黨Cß`msÕÑ€.¡¢8T;qºšÔÈЗ´6qme¦—bd†FŸÊRÍVÛíõ>í„Ù;&+îÂŽÇÃï½äQ@ó>ãÀ$ôê&f.£Žéš)Ð;Š¹‚«ÃhnugV­ïKÍl¿\¡YuñJpæm4œÖØç½’Úó`/©@5DÿNrdÓe×ç@¬a~‰¥‚…Ï×ç}—¥u`·ö*ô™Fþš®·pE†ý³óý´nv¯W3KßT˜ÝêRChw ±ºÏ`=9L'óqÏšÏFV×XÃíð=z>c”£Î¿æ“q¯×ŸÿÛØÒ{í·&ëë¬ %õ“–G©‘éû—:l¯dîö:s¿Xº_Dîš‹HAö?nta¬äÒè÷ó'¤1´Âvo%#šjê±’B‘[¬¦Ý¥—kö·w—„Ûû6¬\\Tr6¾8 ŒJÅôãÖrgßÏ©t¹Ô?oÒïM4ãöãPÒ¢ê€+•Ü+QÒŽá Ÿb—¦)tgI4v¯GÉ3 o'Ûgìx[ òÎhܳŠåâH'D)ŽÒàÈ4òÛhNãî~HåI’hÜ3`Žv èÞq‚úg!ãH\¿ûƒ£e/Ý[Ò&ÓŸ±¯ñâ°c·t_¡ä|æšy ÁOñƒKà8¾ÿ­î(ÿ!4= ¿Ó_ëÿñ©ªIé*“xœ}QËJÃ@E\5Äý¥BmCM7]U¬U•‚-e˜Ü4C“™0™´‘þ ýÿÉïðæU¬ˆ³˜9“9÷äÜs¿zo;½¶m ‘¸ó52×á]ºVZÍ„‹À aO  BÔãFAd2~Lì÷[{µW½ú¼ÜzÚ^Ƀ„JO †ãŸZëµ¹ÐBNÂñk–f/¥ÆabðylÈËuŠ0†ÇÎŽ-Z›&Ïi3˜Í!0é©iS!˹Üj·ú°$Ë¿ª 1S»a{²YàfÓz±`íÃ@¸ÈKÒŸh4‰–ëg^èÔKV n†ý~ <™£&•½fž—™é¾âÓ.C¤(µ}Ƙ‘JûYÉx€“¾ßã¡F˜"F”5D{œÁG7¬d°£Ÿ¦¤N^N©Í}ÁýTEtc±Ï$ TÉÄOiP‰¡«Ñ‹£g”­A¤ÕD³0$½ýñ2s4Ä).6Cʇd„ú‰qT…[¶ý¯L"ÿª¬•¾–óáÖâ‚Öaxœ{*ÐÊ飯ť ¥Pœgldh¡—läpºV”¤æ¥(”geæ¥d% %© Á~ U žFÎ >®. )E™e©E Iù‰E)z  4&±øLüýDd&”&ådg¤¦($UNþÄh&÷ÉLNÍ+NÕQÈ/ÚlÅTƨ*®˜“Ÿ—±æ =°’É—™ë²ÒRRÓâã“ rJ‹A˜+èà¢<%g%…j.e Û3Ó¸`‚™y%Pߧ–”(h€ 2óœ‹S5¬¹¸”31Ì«…2-ZùÒxœ½VmoÛ6þÿŠk tràJNºöCSðR'6f'‚_Ea0ÒÙf'“IÅu‹þ÷)Êo][ È&$6}¼;Þ=÷܉ÑI N@Ë™Kaòš~]JfÁ °Â,Pž€B£$é" ÃÐ*u-  7&CÀO9*¾$m0r%Ó"AZ Ô r b…æbníi:è¬Wqïr.40‘’ZÎñ3J8Ö9²?Qfh=»sƒE* >__æ˜2AçxÍÜÓQ©¿¬á>cKúã3XË‚~ËÕó"·.(©í™OêVt!óµ"Ÿ‚¤gÍÓ3¸’ŠOPh¦½“ÜÊõS¸_;ÛKÐÈ—–RÌp)€œö<Üô^øÓ¼#ï¹f@ä¤LÈÜšÖ)ü5dÌl­ÃFc›t \¸x2Ç’î”ïŠgÜ#ÑgEÖð,«n{ãîÍd íë;¸m‡íëñÝ9é›…¥7>`é8™qrNÉ)&ÌšrðNáE—¬Ú¿õú½ñMã²7¾îŒFpy3¤NŠÛÃqïbÒo!ž ã›Q'!î`ðsÜg®ˆlŠ†ñLïàpG¥×m–‚= Q Aþ€¶ã¢ÿOk»_`™sÀáЫôf ¤i€¦àßX"W«U8E(Õ<ÊJ:z>fWEµÚS.’¬HéXmR.ÃÅÛQn Yj…[éñ&øÅñŽt3IZ{šâŒ <´ÿ˜Æ½ëÑÑ«_·ÂxÒu¦ãÞ stÚlÖjÚ0;19MB꽿4TÏûÊüœWZ>¤)MM·ÐûZ»Î®b¢l žŸÚZ´7ºÇÎÜMŽriÇp*]EYb [ÅÛÅya ôCø}¸qo:î;íwìÇW¯}©Ë†FoÃáÓ 2f³˜^2¥¼¨A‹Ä€NhfLi4²%”Ÿ”4”ËÐo’âÔc-¯=G³N—죋nçÝt8¬;×Ú3(ý[q6ƒ Þ€ÊªÏœJÝŸMðÓÓªJa]TÅ*uy¬8/›Þ̶dp~Nï°ÙƒK›,Jv¼'¯œ+°¯ª ÜlA³^+i“bÆֽ֜fÝâ‹WØÁ¯/›ö¨<Äïœð97,»%dèµëÀïö®º•OÊ€'JjL¤ "[¿õ:êßÜþ ?VékÍþÓ]+ %àzÒïÓÖ×oXíŽq¤.d.­E²†–ö†á(>çvS8ÿµ$O÷ã‚`CäªÙK~[žu£C¬ßœ={©cZ*«ôb¬°ð ùDÒŸŸ¡E.QsOV.”óÒ’p$èb<¼a[ùœ C%*ë²dd¼„µðÁEdbüE& Ï‚tþø3'¸ëØ*Ê­:Q"”–1y³°¶Ô¡<Ã}¤¹±¤Í’O_Ê·V’ó†ãec>Èä>Ë=í­ÃÜ#¥q”ƒJ*)×N-سҞ£d«S“­¬Z$žšQ‹Þï|  cc£éRrJÎh¨½ÎÃÏåh® þ3a=°="ñ>s‡½^fÍ?2ò®[³0º«¥ïYá2€fWLõ +,ŠTOU=>ÄJàcæ~)¬<¤•ÉC ¬ŒU9*¤<¡p= úhb5_•n ÎC=SÀøè8J~¹ÝÒ•t{RK+Rç©ŠèJER;‰Ò”N2–»p?¬‚í94-¢sƒ#„WF·IªPç'ÀwúPžV:*=· a6ÑQÈm“±i á¯(¾¶îþ:i.ˆ'áf =Š|—*Mé=âä®þV åEzg•—‡¯÷nÎc"z2*Þ9“šèÝ<òÜ#ðé´½ÓX·™Ñ(SºX<‰4—­Æ×mQ= ÷…Ž åÂð‰1›D©‰¾„)J°ª•ª‰×^sëQ{8ŠËM>ñù> ôÆÑ<½Œ}T ªow.nØ]‹g0ü¶›?è€]Á‘’Ý›"„ fIÑC*…Ú öCô뤶¶ÂV•åæÖû°Uæ¸íðC‘s@¯ÀŽCRA¨æÔ pS¿OW7w­gWºù½OÍÿجœKD½¹ýoŸh]È7ìo  ”âÒëœP‚›ªˆŸÕO¿â†£-ƒ-Š$¶•Þo)m‘âæn*í—tuSt÷ºžµÅfg‹Š/}¨1Ñoò‡°tpqÛ˜¿›¾äªe›§°;/7zIñ×÷Ú?¾‚Æ·³ÂCµ]{ÿáví»ÞƾEßYÍ°axþîNºdáãTxœ[ÏyŽ“[_‹KAK¡¸ÈÔÒt"·‚¸¹I¥Pœ‘™V¢P”šžY\’ZT¬·Ñû?3+XÑä ç¼Ò܀̼b.Îäü¼â…̼…”Ä’D  ŽB(9'?9M,'±$9(6¹ELý*̹úxœí}ùwâƲðÏö_Ññ=™Œ/ãY<÷aŒgxñBÀÎL^nŽ, £7BÒ•„17É÷·µtK-!0ö˜lç9ž¤^ª««ª«ª««·^¬‹bâ„ŽwÓuÞÀ—µfhϦ? ŒØ¸vmQr¢aY|¢RÂu®C#œŠŠxh‹ž×vOºÖoùÁ4tn†±(™eѨÕâƒZ¾'>Úže‡‘ïQ7–åÄŽï.ôdÙÔ\0õí¸åúæq=­aèDâ£áºâ‰Ÿÿë‹9„oÕÀGU€ï=4„m] ïK$bŸ›ŠŒQàÚ‘„þH|°ÃXü·á‰[øwâûÂð,„ë¶NûÛ»¢Ù;];t‚¡n$F†76ÜŠúûÖ…?‡‡NÁø±Û$(#ÛÄAˆ­›0ÜãØ· ÄÓüàÔ\ &þŒÅdçkÇAôfk+ýÿh¢ªú7¾Wõìx+Ts³8[\ >0Öü¨†°ñAhêüA<1Bû˜úcaÊBÛr¢8t®Ç1À#ú¶`ªF¾å ¦²x<Æ©%zŒ"„¿|8»'vÁ»¶‡ØÝñµë˜âÄ1m/²…ÉF| m §ë#@} 8ö¡ ‘]¶ïCS!ò·eo²!ÙrE˜%#Æ‘„°jÀŸ ׈ÓÚÕbl¤ƒ¶„ã5{½æÙÅo¡|<ôá-зæ:Ð8 .4¼x cœ¶{­P«yØ9é\üˆÃ8î\œµû}q|ÞMÑmö.:­Ë“fOt/{Ýó~»*D߶5Ü÷M" Ö²cÃq# ?ÂÔG­k‰¡qk ˜¶s °À_ÁôÞ¹Í΃0\Ä" ÁpUé „çÇ`#[¼CB:žL&Õo\õÛ-—›ˆ¶ÞWŸ’«¶Ö×·¶DϾu¢7ðm­þZü÷Ø%yEß×N}2Èëɇî =±…ˆð„q b0÷»Æ‰Ÿ‹Ž  —æÚñl’IâÐð}JM\;ÄÄáØÛŒ‘Mid|¡éC±bai׉c¿Ú $ð yH¸Fxc‡e ¦‰áÄÇ~Øñ€¸Ãq“,ÔÞÎG§:ê1¾ù1sI€?ÂÀ 'ȶ¢i´eºFmñ¡t40L»JM5rM;wD1{Âtv=¾!tX>ÓPý½imó .+“!0ôü¡Û9GéÂÍÖëЬ7ÓläÞâiàGU nóåËpµ:U‡$=õ¹€4{u|“aHŸoàêÚŒªÃÜà ߳ñ©ö8•üxëë`í¢wÙ^ÿ|ÙB_ÖJõƒƒz9yvÜ<éóÃ<}ˬk{·Nè{#Û‹ÅFè Z­'ÕÚg?\µ/?¬m|êô:g@àü}#S¤u~ÔîkEè;€‡=œÑ—„ë®ý8Ýko‡¨xÛ1‡°ZÒB ÅdFmò½€g>.ë‘ÀåÞ¸…E‰”OÕ&½V¹…5AÀ@v¼:mö¿[+ÕîŽé§U+¯¯±ŒÍ8YtÎ@¨ôùÑ ýY$ÄÙåɉxK¥sËXÒ<ºê6ûýOç½£µµÚÝn³F?q¼ñq`ÙKí¿­#LT|ª€_PHƒ²„_Ð?Õ‚ÊfÖ'-¿Cö@a‰ò曃Äë¯jûWÝv¯suØy+Š~jwšª& ªn󨿶Všif´vx§*‰D­“óÖwÜÍ¢JõL%êèž:\GTç¢ÖÇ‚JµÚál¥î§Ó…ý´¨J*±›ÚWýÎÿ p;/êµÆNº~Òhs/‰²?âÄ|òC fo@b ´fx™p¾§õöéÖ©³‹Þù‰¨ežö/š—}!êúÓÚlÚØ7óô¨yÑ„IÝÕŸÖUÙýìSYö5¾ÆÞ €*rPìJØ3ðµN¾»j]œ¬íÔò:?¬íÔ׳°œö¯Naåe"«ÕökB 93&ýù´OÚs¶Æe¿}Ü9>W5\ã×#b|™ÃBû‡î9Z˜B÷î°@%"žfëœ#NÛ²NmŸêœAì‹óÁ@ údç»é¶›ÇǪʎì&°ÁÖˆyé`þÐìQïµôÖ<jl 3kØãÔ»t#í³æáI;­U§Z¨B{¶ êªëÙiÍ }WÁÅh¯gÑÞP5棽žE{=écÚë9´ïË: Ð^Ï¡}'éfi´×shod±1íõÚë²Ví¨TZæ9>’SW'çÍ#Ôùpïß‹F9÷þ‡æ ªÈX`§°€ \d¿°H§÷ýUë¤ÇEZs‹ôšŸ¨H½,¢4Ôz10½v2žz1,Ý^›$)†¥u~yvÑfp Dè‰o¢k$æÐw- %²ß#¥ŽA E?jÍ`éšâh-F¿ã n7®@i&³ÿí‚Ád´ð½é~Y\ß°"ÔÂÁÜAk؇¤UÐ| 6J%:á¿{ÆÊ)›h=aD2ûm6ÉÙvTt¬T»®&æIh‘`E…¨q¤¯“×9 í(Ë=mì”'WŸ±::àÉí^¿s~võYð¤á–:ņXòÜëçÆCS_?„zÓG³Ô½N<›O„Nôå›õuXuM˜KÀ¥s Üçž#è姽ŸÅÁú/ëBl\z_<¨²QÁ/TD4õ/‡™//ù[Ëèÿ…§c×ÎÔÅ¿á¤e;WÎ5Ùÿnqÿuù§š|hð‡Fq«§ ×…‹›lßø€$þÜ÷½)ú~Y†„ûÐŽbÕ¼5„hÛˆ¦è“1Ç.9š£„šöv€šìÀ7‡§Žë:õÙ }i9ž:‘™TÉÌ"ªÀ ø$iâêò¬sÖ¹ñÙé· ˆë¢GÜñºF„æéf=-%=W#˜; JâG Ä‘}=¾¹Amøôxz¤øÂXtˆ¨”TTy  ¾^‚붤}¬J`Ñ4:¶ØizjèâC˜¡œ:A x¤µ­ÀeHÿû¼EKKOÜ"P鎚ÓÍzåkþýMZøMb¼Óï‘°Ò„³c‰Ò ' b¯\Â7eEÙG>Ò³/÷õ&Æ”¥”ëû_Æ -¾¨Z%1÷£Ux»+ýkx3eÏ¡ëó`à˜:À:ò¹.Q\:ñf9_ô4„t´¯Þ¬Mt'x%^­£Uö+kðƒtÒhщþQzê·Nêøœ*ìc…×Xà¯T…~·ƒZm(ßj×Tñ:¶F84í¿ð¡@¶Îéy¿S§þ9uõªÚÀª;XFXßU=‘«zS\ÜUDï.ég ï±gXÌ/ ”¥ÒWð öô,¶ë_σª­WO×ÖÞvÂÙ 95æQR£’^==%Asb{–’j4½µ¿%Á0=ÐÏ6ô·MœÁh ‹3{Bxˆ`¸ x¨×U ¯ …F È{Ð% ·-5öd+‡/×ÖT‡³¼Œ€Âƒ:ÔlÔˆÙ jíɹ# gøW/ÊðÏ°ÆŸ˜œIr§Ñ¬èƧ(V,¼ë 6ö*½÷Jo(Ýt#_Δ_¯»‹Þ!Ï6A9©ˆÈWioÝíÛ•ÊneÞínWváÛnew/·$CÃÁ꼚¼ÈŠ}D⨖¢¿"áÈ™g-A$ú‚@BßQš|ÊòHÙI9Ix²\ƒjÔÓö^“@ÀgðVì«rȬÐ?ÊŠÆž³Ëþü…ÅlñT50UµÛKNÕ«'* 멸BJ¶¢ªAm$СØA„ý³8RýÃ[l-ÏÂgN!9ÉŒéâ柤ü…OR/]W­‰h%À$uÑõ¯YºL@9AZªREŸö:Ðó ”/wNª¢ÄM‰Úæ.ÅK|áЦ­NÚÎWÒ<­¥±™Œ)¸f—¥øIR­2ûÎGeö?ÄUeö?D\eö¿u¤¸ÙÿÖ‘fÿK2ƒÙ:ÒÊØmsá3€ò1hˆ@Ã/í8Ê!.@µ®ã`déë %ð0P>ðÄò2‡ŠÝ~û‚Ȫ„®Å²ô-ª•‡(¬ß“Wé LÈi-@Ë)€‡Wú+U°Uþΰdë¤wêZh×= yÐvŠ<‘+ýe‰»ÒßYÂ;iÿpö:¸‡öð­í> ‡Ðƒ†ÃíÊJY3_é¯Ä!ûƒq«öG;îÙ†5MÑÚ>êÏÅiûõÄ#;Æmð> lÍA´¢!n¯²Ò_VVú›ãÜ^ûl.’z½ÙÖ ìŒBnéÍA´¦! „î*q™¬UVú›CÖñd®+±e-‹®c] ®ô»Ø®¬ô—Ð¥ï£|èv/H²%.ÁØuA·Ø²hw"ÁÚ«¢kÛ¯4¬Ã°ýç"¾‹ ^âÌî©ÏA;7˜b~{¿²Ò_ìâue¥¿ù%¥;5O.8`E ÔBœá:b¤¡\*a´%;aÔš¦À¨@–Ê“~DÃÝNï¥ßé$‘H™Åe©›}즾;·›$º(óñ! ‘™¸‡Ý4¶W‹³ÆöBÆö {ÙnP/è›z¶µ÷•Å^vhþw:ÿËMÿîüé’^viöu'XÂNŽ§6)Šï+Ù“ÂûþÄü™DJÑǺüX\v)þ|Hƒó»ù›òç#‘s_Ù¿-æ­Ù å~9EŠË½k燮Ô:’£)çҹ숉-OÊr8>p`€†rX]í“;ùÚ 0e4êè ăïëcHЉÖß4=|Øyš:Àaß.©º T‘mˆ'5]0r< ŠÝ#czm¶°Œ)îëjjtÏ¥ýóË^«½V/@HíÍ<ûRxœ *^O —‹¯Aù¸” Z<˜e4‡?D/ÃYÈçö¢É ÅÈYb¦ç÷ò·”AYìÄ¡ Y<ç2®Yš<|¸%}Ù("Žœ['òÃû NhjÍ0)m,,ù½øòg;ÍvC/[̤ée©ÅLúõƒ)èf–IŸz4ÅŠ‚`1Øèe–I‚œeú.fÒU`l–IWÑK–Içqðà×qÖëßéÓíí¿&gæÏÄY¯ï{•œUˆœeúþ{sÖú%H"ŸìdþŒ¿ìHE´Ž;ÆCtâÅ~®Šó÷ž.µ@=žVö.Jøp`Ę_DnònÜØ ](“p¹5®HÅ7›ð&¸àõã_ÄOx4êgD§ÀS¥o¨IñìYQo™¦7äh`Š%ææAÆ…±(a!(SWð:òh(†¶¹ËŠ€.·“r‚‹KCSèYROàÑ@UŽbË¡òÆ·ÑFEBϵì;:oî\\7;'—½¶¬+­Á·ß’Y œC KèÙ·42´ÙGðñt=˜O¶£w^?Щ´Ý ³]¬¥áœÊ|Ùž˜‡‚¶Âwÿœd¤åxví³i<¤ ,¾M a2ý[:WaLqø’4·Ö©ê±oÛ#z+úR*Ž¸à°\XXPëâ_ÔIŠœ8(;Ód ¤ë“h_P0¥šæK­`E”ÿID#Ž!÷fßÅôMñÔ…ÀE·¾Kü¼É”L9w8®[X«Ëãµ* 9cLyTeDGUè˜;ùfR! ‡ÓØè»!‡ å!Qy¡èœåÜ8qykT¯0Û( >F·ŒeŒ±K›TxŽ¸!(À}2†”X+ò%èA€ÁÏJ•Ó;Q†'/Ít0ò¡{ÌõDñôØÐÄÆÞ‚Ðl”IïhcÙìÉ™Ú%ŽaýïÓÛèN¥ZÍR§LHEõ¹D¢¤/s“á”W·ÙB“ðâ’NrnL(…èÉÆ{ò)Ìzen™¨éÿ_Þ¯,³m£þñm*!XPŠ²ðŒ„áÑÄe¼¹§m¡%/J’n%1 †ÁááöÖ­cOb?pÌ*<øgpPßßÙ©×þðߤýâUñ7V&R >éA¨<Š@±•ê .¢ì§z£ösúì…IŸµ€HF*¶w(¨N$¿ÁçeTâÎ|>4(’”=ñÄ1m]µHj%픪 íø¨´‘™0˜p£\œƒõ”<ùl¤Ä@d›:Ãdˆ‡Jƒt ”pð -PÆq¤=84}¡gŽUvC­ìÓ>T+K¥ø4ƒ/R«1]Öù’l4æâƾI› õ_IémЬñèX,0·ˆCÐÝ­ÞÖÙ A‰ÍL@ê3ždèÝEäâ·2ÆÁÔ‹L6Œâù¿¼çeñë¯é÷¾¿››&ƒ„IÕB&sFLÂ-ixô:áÑDâ¤ê0q'T"53À["Lñò¥™N,RXÁ.L©¼³eŠð ¢¹‡Yp,ã™BI¦G‚RÔ؆§k“Kè5ËâØ™ÓÑ¡3ŽfçR”bßç•®,œt (¿eWS mÉý„dÍ‘ †Ôãð¥: 9 )s¥…¢˜ØoTFT)·¢Çy çÐæµ´„‘Ÿá¦ñCÓ¾¾ö‘RÌqˆñõ`|Œœø Á X–áMl~ü~·ŒÆ¾½BèÁ"x_[ŸOA9DKì¨i-$.Za9‡QnÁ§§ƒQ Zš…\Ú‚O¼ïŒ´öN±ÏHŸ¦x)4°7¡ÔÛ£, ¶¾ÓœÙè  0ʱŠ©É $*àRûæ^n«—ܱ&Æ뼌€=’ÓXöCÇQ°#Å(Ò6·vÕpÖhÓ–€Û­c‘ýq$³‘óÒ9Õ$Gng>%uéær7Ø <Í¡Ê_ˆåx#®ÊÚ +VcÏòÍ1æ½¢´}Vf—næ˜5íùÉcÖÔÌeáAëU)QºöÔ±ØUð7Ý ŸAÜÈO#{¤>á™hùIý’%Ñ à kºšÓ‹«‹uuRUCyZ3œðôãóïªâÈ÷žƒ†@¼®1ß%K­”äêÿék¸ûT V½§‹Æ€š¦d·00(È83¢Ä [Š×èƒI×uì_cM£É{ZRX-hßQJѯGxî Ì”áwJ40C3À@[/^l)T/5¿H}%,ÎGHkˆ–Ä¢.è9H"\[v÷è #Y·ù]»wÕþp~Ú<ƒW¿ÉE©¨ûíGu)„`ZH Å|ÊZ‘Óð–“/0ÄBÏ.-~żûð§ÄáÈÏÄ+µ#ÿ¢Dùñ^2&ào½2Lø\[MÅ*%6›>Ç‚Ä£_§Â˜Å¢ômmÿs™¬7‰yzWáþLZ“x.S@U¨FµŠÀUÕP4þ¦‘XèM7Ö6ö£$õt’Ù7^žÁ‡ú)Mžòå 6ÇmÜeÒåa–4ôZ¨´y¥:0¼/啲"Eò â?Šù裇NÝW04OÊgÀƒü51Г¯4]=˜~MÒÁÇŸçß=­ …ë­è’aq3ßä¹@ߪIŸŒŸäÒ$$Msò´§H @ ÄÐØú%šË—ÔdóYRÕ22FÆñÈÕ¤;Ý%„K!æª-S)Â7® ×ðLÛÚ ˜~ºä!ŠPÐ 92Â/o¢À0m>’³Z_*“ ö(éæ‘d#Y³$S™Ó¾aÀÕ“L‡–V…žS÷W¡§zýUdrË—ê+‹ƒÄYýˆößæD #³‡WadW¯O§|åH=]ŸlÚ¹öÕu$Ú¡{é“ŽŒI~UµqC{Ãi&"`¡ÄCl-ÑÎ$t@•PoV§hDD㥱97]óÈþ0zÒ&TæÖÆùdl¿½ùD”0¡ýÛ|ÕúƒªÎÒÝQô°%oJIR‡ãËj’1 ƒÀ¦rqËÁ¤ÒV.%\ØxÕ×7åì5e•÷”­ ÍŒCºÇ"ŠÇVr“'žç›ÉìˆB^ä 1Ï#Ó~ñç›HþX|Ì §`A±+•X‘,KáêµS{½û‡ª^*¦™Àè8,ÐGͦ*Z¼yøT­D[‘£Aµ³ÑÉìå²Ò®t‹ª·”GŠbÃ[[GnZ8žÍ{µQìD~§ª'š¥–Yœï?™8x°ì²ÿ#%bi$†ÎÍ°ºžg]xÖ*θ'ûdG¼€»ºæÀ&¢vBb¤J»Éò#"aÚ¢ôžr(œQ ^;7¢ôzwܾiÝîÜ4Àý9 ­Á›óïÊ2èáR “©\|2)Ç6pu=ÃÄ)Þ$‰¬¨Å›Ïã‰Oòzµ8•î“‚ÙƒF°=‡’{ìòî>dcrèHDÀmæoëÂN¹þ ‹èn(ɵÐ^Ún*""FŠEþ¥‘áÊà˜20 BrÌ«;'ø¡œ¯ ­áå"ƒ VçM¸dƈY%™ÉA„kŠo Pô ¥„…AÁÏDÚ!¼MV*„æ店ûUØÞ'ѧ©=à5è„4móáI8¨€»ÄìˆKJ¶¼{'êy•ç¢«ž  Û _Ä"áFxŽ‘2¼´¼¡JÞœÁσäMÎ>˜æšÎh5ƒÐÛž‰ûÙêÈ*ÏK@1’+\5tk‡Ísêߩ݃#¥ñ†ôÿÁßÒî‘[¥8V ÁxÍ—«ˆ-Â…Z.CýÕ·™W´u[åRÉòÇ×®]¦ò/piÝ«bCªbµ¦í1Sïiýep$邬È+{2‡ZÀ:3çƒ%/ܑ齘‘ò2£¨ù¬è`i„yQLâip1tÈjfœid!õ€«ÆÈùá4‰fðl<<'JtCmYi²â%̤ͣ^Ö>QP&™Z ÙËÕÀÑej¤k†V0+â±`‘ÐO+h²Z¶<#½g “ÌÈÖ¤ˆ‹™Ð!š–L…ž*™ƒù²ió‚,-LÊ‚ö3«ÏˆÜ“´¤'yåä·9Ie¨³×>ªÕß$Ÿë5Ò?øj³ˆÒlnÊó[ìÖAÃo[¥M^Ò´ÓVÇÏ5Ú]Æ t¢ËÅ­)šÝŽ¼u•[b—að—I¡§{Õ.h/ 1ªTVÕ,2Û´Ýç4¡äŠ©‰šó«?užÐ²§ÚÕTáè†'ÆÞ¦’ŽŸðª<˜fצ@sÚ’0¼©ÊsŽ‡=¨Þœ1¯mFe715‡/Ϥ~³ ®!³ìÜÛäÈ~òIH¯íC þE&ÿÃŒþ…fÿà ÿün>oyÎÝðT[žó7<Ñ`ÍìuÎî~>ÿ¯ô M_ÞEó·Ä›uhk¿*§¯f·Ax~•ó(’M-›ïŽ–´F2JEÞÖŒ"ýgòîæ߃’ŸÄsný1f,·ç‡ÎMWÑÖÿt† åeõäû%‰)µ5§.­§·úK–à†EJÕ~tç¬{y‘îD?”[Þ vETôŽÚ#Ôä«Ë3S]â…Ø_Óç¯xßM–- zéŸ_à5ÊWÙîäHß…Bsó‹ÕkµÅ­]œŸµ šÃI˵7·h¦™_RºcvM Òà×Î ¦‘íÙ6+ÖIšSÙŽü Çh‘Bs@+‚Š¸—CG²I¥ÛOíb`² #ÍbA2õZÊ Ò¯(dš£õ+áË“ÄÂ}‚Á¦@&ÚÊÁÛé¦í§®³>‹L ›‡Í9# ”©”3S CèÊmÙé‘,Ë[îtaJc'SIîo7T•úëjCPŽ¤±W«}÷ñ? ØÒ…L”l&R›î‹&7uÂÞ3¹ZBÊÂùMZ<«Z9‚=Ô‘ÜaáíôÕóF ¯Ó¸~Oï3{.ôS¢…RÞŸ ®K¨Z€bn-ÌúfœY˳ĞêýŒoó }ƒ­N°_%'aUº‘ ã9%ÅØm£l+àÍÝ4PI¶’½y@m5‘ ѽMþ«E-Gt|H÷5 äßGÈGmŽvrb',yúÖ m0,”/š“J† ÛÁaÓdÔp¼0é&arŽýcçÃG4kNÎ?­4X÷«e!tàÚ|¤Ý²R楶úÀv¤qL£TIЗ`u[3±àå‡I–VÚ¡Q+#ÐýEd+€òzRývû»«~û"]ÚBöýåÊ>3Ùá›åÝŸZ®=/‹RoxV 5Æ¿¼¤ÒPJ3Ÿãlyé“Úr/å„MY?jž´©¡KÛfÍtøHâ Ëê¹&3®Ô¬ï9eÿYç…îdNÂ_ O9)®»&2nïRÁæןq%~3s²'ùö—õ5,Àò†9>2ª9Ǩ5Ú¡X­5"š¹%ëiIîè·üÊüwäbƒ³åR3LM·áÍU òœ;Sn"\Týé „,sh‹¸Ü.ÈžÇÈh]ÿGË’}©¿ +ÿň\ÅXæî­QäÈôÿ´D˜Néý˜n-f5G~^¨@V…´AyÞlPéî:ª¢ò&U°,Ý2ípˆ4¹o|ÞÖÃø#„qµBµ Õ'øzð¯ÓäTfí×!Ì,ýù‰J…ÏðÌTÉ®¿ædå#qV!“1sZ@C¸"îʈvô/§3øîãçÀ1«Ipä9 ûtÎR皯îÔy%¾ØU/ Ä £˜å©#…SŠÝMB¥â‡ª£+Nè?(úƒ¼´ã6ÉOš ÎùdùWú& ~àî¨Ú–R©XÔh·ÓÙYIÙ VáýÍkL8žâMû‰'ÃR✠–O #:vkð9ŽÀ"çÚ%vYû(ï/‚RQŒÙ‰˜»˜°+4hž½H?+nÉPª\ÜïV§çÉ㦜ôý€çAB›¸aNk:v!OhñIäzʶ{m§o¤÷OõÅêFvHžÙ3<:g£*j•êÏW30ceà\1=u‡™@ÅIåèÒŸ·Ü0yNû§FôE¨¤€’¾— ¹O,ˆ„bµè´Z—¶ŸBSÖEV/LE¨GTªÿˆïÞ) •îŸqüä8ç!pÌöÌŒ»&Ñõë´šsJU !4ë‹ŠÏQ‘SNjù5ÒŠ$0…Þ;©Ï'Œ¼VƒõÇ~ØAÇz8â"ù»–ÞIŠe=í™Ô‰œAÓMã]b·ŽAl°æÜ–éQ´E0’'€¥CûXÕÅKÈüqœWm˜&¾!_»ãáýª8¥›ÊÔ9,”#çfHgè(>cI鯩L€Š’GÚxÂÊÁEcÅÙFrh͇'ôµØ«"î†ÄKc2N¾ÀwÝE¢?Ý¡¥* (;f°—•‡OcÉÍFº…6hDrãvFiŒÕ (pòI~*O£ˆîùÉI·×áÉËðR[Fl|Ã%¥ÂºÃNn¸¯Ò3jª‚¹ÕG}e{„ ›EñäLÄÔÝt}²ß„óG—ýÑåxIv=.nÁǾ¯m™7®ù;†®`%£Ý$CG3ÆÜ”A—“Zr”)µRB"м–쥧µ¬Ûs=Aç]F‡J ýˆì0>ƒah=KPZKÚU奅²Ì€1=aHG؇~À§`…iÄæ°*:2¥¾É¹=m¼þ!ÜÈ9Þ$Ë"×zƾ:žÓÔ_äqÁ˜/Œð&e»Ñ´«–4•½ô£Ó QÚÝ•ÛÞ”,$_®ˆ”>q5öPc}ŸòOr32²¶ âiV~N³£ÓÒóö­q=#!¨© rxŸº^(L‚ÅOTægJ¯ºÌQ–N¿W(Ð/0ç%z•Yp0LyÖÅÓ¨`(1˜^¤`!¿àÔobC×æTd@y‹\³I Ÿkr` `&ˆÒ L™§ZF–2S\Å’;:2Ù­~»ZKü¿ÎŒ*Ð?ííhIpii?íÿ,§Þ"•ÊJT'lrìÅ–VÇÔ^_›#”ª =&¡$'~Á›ÊºT€:’ pÒƒAHÕ6÷¶Eé[«œ‹¸¿Y¹<ëœu.:Í“N¿}ôHH´S|J›’žÒÃu"Ûªj‘ôx´ÖñÆv5½æàž] ­_¿f›wü³°_¹Ðàq^ûŽâ[ð…0’ ƒqÞ¸||Bé+O]"Æ|#iM¡‚ 2«0™,\_3è¾W@,HF×%» Sj¤(Åñ,=iFÏMwì}™>ç¼-v´j •r>ž§géNkJBq‹þ4Rùp Ù¿ç{›(%I.TÉ|Ö>[~Y‘ùHº;gWí£m\æ.»©åPË' 7ON:g”˜dN=.@µ1/:-i ×éÕ(W=_ó¾l$áŽêø6 ¼®ÊÂç $Ú½äiÎ_ x,•ËÄ޸Π×d=¢Ëó5†™l뾃&ê“•Æ;µ†Ž :†}g›ã'A»T¿K[ã(ÜÂs-îÖµã‘=}¾:WŽjYó—õ5lÍ[eCýERgÔçÐ øSb±[&Çî =ÜùapÕ&RB&Ù?h¨‰A>¢·–Mdz2ò'‘Éú®mWt Ì“RIOk V2KjÄdÙJ‘„ö&åbÏZ‰|jfSJ$ºYG;ÁBœ š oR›•Rï×·)S†ü95L~É20-î0öœ¥JÿûÖÚ"WÀ o'¬]ØéZ>¿ê}êI¾,¿³ ì¿’ù—½“ã»E† zÊä‚+<>×)H]1ç›±[ˆ¼Š8õÚÍ#4WP«‘·aŽt«80@zGŽG) hæ6™Ø=ëym—CEU’‹(µm4Ží»+$}%Oñ{âíLðÀQ{ê¢ÔsKÏ”ÚW!º2cCñsÕ¤<¾®ZÎlzs´Þ²Ž½×3›º§¡và›CRÞ;É3Ê @¦Û¦?Ø$çÇ­:Š"®YI—œ©8wäO!' (€°ˆ;*b U‘Âõû˜f¹áé·QIw{‹›ämP7˜„idû ü,¾Õ'ÅÆFNqX?‹î“½«¸ßVãÛ+ 4}ŠÑ®8W/µg%.:Ʋ[›iؤ0ÿeƶç4œÝë Jy“qªÑUŽ2U,¨hú4­ØsÌT›Éú6ô''¾w33'xàLD®mÈ–\ꇊ:FÆÁ2e~%’Ǩ Œ= ï*{ÖÍ؈0ÉWE~%ÄyŸ±Ç¨ŠbM¡ ’6í,ÁÐo1³ å…!ø˜h¥¼ù†Ê½ë0‡oRÒ 3)d¢±Ñ ­ I„ggil‹w•F~šË­I .+ËÊ$ƒÉ3é+µ *0«g|G>âÌ/'H8Ÿaž³ß߶gËj*•Jk*¯É‰¬x`N×JYߪ(A‹˜–,Ü—G¯ï?ËêÍûo‡SïÞäæ‚É=mG»§2wý`fUL‹¾—¸YÁkÎåUÛõj=YÓ´­‚íKOehÎ}'@¾Ono‘ Ònº-½uzoO{zjh.så:¡¢Š-˾ݒÌÈ9³›ôêîDYlC¹¥Ä¯ƒvÎZô¡urÞþÜn•…æ¬Zäªjžœž÷/fi"Ý¢ìu±§F…%”×ꆟÈIñ¢<Sª29ÝbçÚÑí_\¡[êWúô©×¹€§§ÍîUÿc³×>ªP”&6ûmç„%¹£™˜…!% p^Ê%®RLªLÁyO;Jh·`ÔÍSŒ‘š_ÆÿÌ^Gô™Éy=ÛV·Ý`38|L¸ùTÃç,œsf™:z ð1ó¥Q@¹°éN¼Ü„f/9yÚ)oõ‹æœ:z’I§–!lNsµvÙo_]tNÛ=…©RA¶®¬¸§ÅõW€ÙÕSàAv±$‡«”Ë ^`Úö¦Ôl`å9ýø ªÝ¿FGMcçuE«À‰iñå#ä´[œÍÖ²_Â` näëo±‘Ý´‹Á½»5 ã¤NÖ1@[})h™lïw¨´6öÙôÌìöÚœu[¬´‰!Þ ÿÝ3&ð.[©Óûþª×Ä#|*K—˜õk¤(}¦Túøô°º Ci£Ar“&TÇ]*yµÏ÷8àù–ä~vAò3© =# í©hϤŽöL» 9!#yÕZ梻¬‚Å¡Ù ØlXÀ¼’°°`G C‚É•c_¯ý€K¨þTîkÔþßIKç+ÌRM=«ÀJEþë”Oê"¯€ÞCKMkt»'šVlj™iíê÷Ôýɧ–Æ´Ú©¥.–ZŒ ZvjûO6³Élr0Oɸ1¯œºµé(íõÉ-ñq¤ör[Úì_Wñ×2zåQ׈\tv»|§…r½ËˆqDZ=âÈúT8IõÌ&HDð¨ý{‚²-þ„V¦TUDý,àû»[íôj¡z?ÕûZœòok?‚4û”¹Øê5xŸØ¸}z –Hnx*§‚»Qt‡ ß)éI5ªðö‰ŒA-«>§0ç"CÞQ@Π.ÄPcx]g¸NiS O…ìíèÇB*h‰ï2É/ ãBJæéH‹—KÌ?eàl-LÌÄèš–®ž;É$YVgªîWá®"ÕøË‘òq"%X3v ‘ÈcXš¡!‘¡².Q£Ô¡ „ë&Ø„j¼ÌÔàpJ΃›Jp2‰-YI/Ÿon¡âÜg©e""覣HÐVÔV‚°™’Û)B?ZòÚ+2¨ŸW·N]©p>9Âïð1Û-S”i®š¹+y’€™ÑÒ=4 ‘pëÕµb4ÖN‡ 4Û353ônŠÑß…Š"IH­§Q%Ó€òp×|éÜ yó îš½^ófðíåÝÓä\zmœi¨K„vKô!Sr}Ù;ÿ‚«šg­vkðܸj n.û}¸êô  ÝfoÐ:¿m7{нíu;ýË@_Ê ^Ç}ÌAD`Cé„Šìß0ô­B˜Š¹Ä¤š£­LÿWc»‘Ñ`…p-iAW‹ÆÿL‰Œy¼X,jÖL2©G^…­ÿR{˪ª—ËuvöÆ8i¹ŠèP[éô ?0!œ\*¢È磱ĄŠbc&’åÁþõYjY¾Æ¯¸²¿´NÆp-´˜ÈXj4Q¥ò¡|"Ø´S¬›6dt¬‰)~%†Š²§:ð S'dXa”¥q`´KL„çóJFH8'"Reg2@> ¸p,VŽ j˜È LÄ7´°0É=,$f4Ûá«<˦òŠ3íÀb†VŽŒ›f Sj}ˆ±Z0Gú¢t¥!ÆxœÜ X´Tðìh†6×™ajDpÏË“:D*Ä~Ö{-"küêÍ9 ~øÜmÏIM"˜°P= mœñe»Yß â$,æ´'®*ÌiÓXŒÐ‰‘ Ö5)3ÈõJs˜´©ø> ¤Îuï 3„€%nUÈ•÷2Ñ2‚*“t9=£É^NÍ€1ì3ifÈóÚ,À‰{Âp+î€Û‘¢Pα&ìŠO&†çJllY«å±áÓ#KH#§b¤=Ô…„žÞÂq$ÔHqnqQ+ŸÊ&2b9£?8tŽ]IH†ÄBid §É½”3zRŒš¦böÔÚôõa&r•,y'ælôÙ0AMˆÛ81ñqf~ýÂ)• ‹ÕÕaPG¯«Š ‹À—ˆõùŠÿ ‡Ûè¡sÙz;¾xÌð9Ž„e]¨LmúËöP¤FOÆÐöí1 ¼~²”²s{lh=[Úº2^ﬨuºS0J-N”ëu_õr¬4sŒEü&ibØo7ÿzYj<4~j|Üž¸>»íóÄa£Tß÷¥]0©£¼Mbp/ö.›¥ƒ‚‰»^k€[±MYáAhs¸åL>¶—ýå¶uþµT¢Ó£Q0}ö •òlÑž4;¼hš,qEfuzk‘†Ý^ç|xÞl·YâOEÛ´;ç_×Jþ\ BO^ì¬×ùzypô¬¢Õ†¨ë§Ò }8¬5ô—”“ d§ ˜c J…èúU×Í¿•>ÒFM$k„ø>Èk° Ÿè`¿^zqûµ"ÿ=É·Eæ pS"-^KgµºK£cì%¼ ‹Êã}+«M+/ì¸Çn¼à&Íx MÀOµ gOq[vˆ'rwñwºå;ϲóþwºF‚§x—|*CTLíóvÉÑUx+ð-Ü#´Êy#¸Á“=4q}¤þ˜N\ÓÿíL!¬™‡ÈC\‚Ì[J1Š?‰ñ–ÛLÄhTÑ!ÂÁ‘Ü+„nÕFQFÔ­‡I°Æ%õ4®®^‚°''ŸŽ Ž\v;´Ot½98ªŽ°ƒ˜‹(•Ü àM#‘«Ÿì\ú> ïò`](ômz%ß Tø8LÙÿ{PŠý98z_‡V‡éw;Ä4íz>ÏîˆH j• æ½R…؆uM9½÷B^÷´>onÛígÙŠwRkùhVlÞÄÂjÆžªk¢è»F¯c2yWè ËÌ?°‰ÿ®‹à4sìä»Ñ­ kôÛøÀyÿf><©¿çÒ¨»ÌZù ‹“æV‡Ù=Œ¾üøM1[¬t¾Ë…éF©@Ñ=µ 1ͮä†"’ïªرjÿauµØ_Uß%Ù¶]„Ý/?Î÷?ûž7²â•óVvêú€®XÄccfX*»ù’ΰwq×ÛÛƒŸ¡±ÅnùÖWBEÔÙîÞu[ÃfûºÓT`çV‹QÄåÇêü¥Œ4Ãí?ôN…º*¼%Ò7L¾,îímõÚº´U2Ãÿk;,9úK2ý ÐóIŹԙe_=×ÚýÕ)Ï_Ž±/“îOz62φ‚ø'rÎuø4]ræ˜3ufðBÔ×Ý@ñä)ø€dËNa‡>hЇjcgû,9ØÙ‚û…ŒÎÍ¢òokgÜà‡µxœ›+ýˆÓL_‹KAK¡<³(3/= 38ÀS/à (Âœ™[“™–™š¢THLNN-.V(Ê/-ÉÌK-ÞèÎ( Ò¥I9™Å@…I•“w2š AÅ}2“SóŠSuò‹632•1j Š+$æäç¥m.É€[¯V2ysÍäF^áÉúì¢õ™y%È®sO-qKQPÐ 'g$æå¥æh*Xs¡©rI,I GQ¥£PšWœ™žt&P¤HA+¨FG¤"'5‹Á©%¥ âh†€8Å©©“«y•ÎÞfÑè€cxœ{Äyˆ[M_‹KAK¡<³(3/= ÓÓÈY/à (Âœ™[“™–™š¢œ¨¦Êh¼Ñçs}jEIjQžBf^ ²¦ ÔÄÐI¥¥h*XsáV”šnP«VR”šNP“a½v]8´…e–¤¢¸ ¢+%±$·e`]'¢ÛUOŠ~C3 ý¨Ú¹Ð4§–”( °þ”Ô2Op€r)O>Î" G˜‹=ï€,xœ;Ľšgƒ7ËdwF…É%,L “W±XL¾ÇbbŠ±:B(…ÉXÄu‚SKJ <óJR‹Ò“S4’óóŠK’3‹´RRË2“Su2óJ€lÏÉ,Ò“[YùÙ¡ª&Ï`Õ38"¸áxœ½VoÛ6ý»þ· ëìÀ•ãŠ´iá&Nb ‰ Ù™×m…@K”ÍM!‘Šã ýî{GÉΦ 2$"ïNïŽïÞ±³Ý mZªBéùHGƒ ÞÃʳ±ºÌ3•*™Iı´– S:¥¥e‹“¯ 5_8jÆ-ÚÝéîÒ±)£éDêDÖh˜}›‡1NÊRª2Iø›‹Â‘I7À=æ…s¹ÝëtòÂü%cgƒ¤0s£-]§6ŸÉ¢X½ÈU§òÂ?ðâÐxÖ8xZHIÖ¤n) ¹G+SR,42QÖjV:`p$tÒ1]šD¥«: –KNžÜB’“Å¥e”ür|~A§¨!öŽ¥–…ÈhTÎ2Ó©Š¥¶’„­ƒä¼n(ýlå}иDGŸNÝ&©°_ÐÊwzY­TGn`6…ãL 29»¶E™p7ÞÁÃÕ¸I:!¥=ž…É‘Ý‘ïReÍ$•V¦eÖ®#Àž¦ƒÉÉðbB½ó4í…aï|òá5ìÝ4"y%«hžiŽä ¡Ý 9ÔAÎúáÁ ¼z遼ÉNãh09ïÇt4 ©G£^8\œöB]„£á¸¥¼UƒÇëžúCDaé„Êì­:|ÀÑ[ ÍZˆ+ ÄR]« ôôlÌè¹/À¦ÂAm2HI×& ðo˜Èàñr¹ æº L1ïdUÛy|Ë®ê4•Ž³2Áw­K”vÁâí­µ4Ö.»»„6ÒæîSDÏï­­lG™ø¾w¦tyݱè>ü&òŠwo¶·6…Yl=´Ì Å;NŠ ½8ÍJ/âR‚Í;Ï~…³LZ4ŸÐŠ´Ä©9ÃDÍN*áÜ ]¸Ô}ÁjÄF[GÖ¡¿bŠ¢ êÙØCyµC´O[À®Ñï;[ôú1·îçnÝÏÜJ€y9ï«3ƒ¼á¶óˆÝûÑ”ØîÕCvÝ_*C#«:^ã–ÉËÝÉ8G•,ý±û6µ ,hýÀäh³#¸?;Ž¥;J¼‡Ò•EÕÞ,Ù/iãBå­ÆíÆësÅ€Zi-³oÆéûìfø÷R“Wë/·ÿ6íñ®¬÷è9u9ÕO%{(œ§>Ûi¡00(”‚Åa–™øoVè´ sU„š¬ÜÁÏÎó2U™(øHDÁ2 ¦ú A´—ÙY™¦²€<¯·€£.ý‡•ûü€ÄÈ`%bœ½HÊ<“×Ð|ˆ’«5þ»ºªÎJ·1­škôžïmÎ¼í –I]t¤ŒŸCéˆ|þHœ˜rD›“Ù§nµ‚­À]G¨Ðš¦ûÔÜ|‰·åKüº¶-ž` \tóì3ÎÍ^ÂýaêÅÖïmZlm`¹›¢Å?kç[ Vgñqc;SÎF8¤h‰+TeË}í¬¹é¥”š÷(ú±Í¬ŠÃè s±wÜov[mz³Ö—˜;FÀÜw˜×3˜™ YÂi{[ég{™ãŠáâïÆìiøÅ—²b¿¦É—È Rj6S® áÔšk‹}Ö½w´ñ½ú¿n›†Qx8 [-zC;­ŸT]ï5¬#Ü JÜšSÔ¹wz6OÚ´u¡y¾ðDñº©ßýdÿÔ[m¦2%ß¼ü¼lµ6týŒûU‚k6ðùâ¹½_eŒ™‡ ùÝÌ»€Þt±"¾.¥WV¾¡¦®Òˆêý ~Æ%FÂBçñÕX›%v.¡ZJ'ÙŠãñí†äµÀíLⶃaä½qAј”0•A¬k^“3Mnè8 £³áa¿â"³Ö¦‘žVjN×ÃÔcŽRY}µÐD_ö~0G£~M‡áa…íöT00îÒ'àúz¹z¿EãQ¿üîA1éÿW¹<Þˆ«î™ö©ñrª1¯¿ÄxœÅXms7þl~Å&i3Á¼Øqâ83€ÁfJÀçf’4ãw:Psœ¨¤Ãfšö·wW: àöCšðÝêÑÞ³»ÚÕêÊÏrð n…ñxÈ•`Qɯ¡èà’ÅAĶR˜IePþm~ôNo"4„ßÿ3¦ È0%r%,…‰13]+—gJþÎ}£K’c—bnÊŠéÙˆ+µ8œ‰²[…\Eªñ·TDÊCÅ9hš[¦x 2ŸÅ x ´Qb”ä` .KSˆp‘ªAq\™p0\M5±¤‡‹Þ5t¹FïÀ¹B]%£HøÐ>5ºÍ"‰žðFK´¶M„†)!hK|3BÆEàç̹Òø ÇË·¥:‹ Uª'Ï Y¢@Îhié/ bfµº´Û+£±Õ>‘3´n‚ÑÞ[E0âh&Q1Õ€xxßñ.û×Ô{à}}0¨÷¼¯o&gùœ;mb:‹*Gã‹ÍmH•¼k š—¸ªÞèt;Þ4گסÝ@®ê¯Ó¼îÖpu=¸ê[%€!'r<Õñï~mѱ7LDzÍ0ôÙFLØœãð¹˜#W¾œ-þslSu,’ñØ:àÞÃÈ·B,M‡ÃÚø…oooKã8)I5.GN‡.¿-}Ë„*çrOh¯†ç­Æõ>‰Ø’IhYš¼ÝEb´%±Ù’15ÎÊÈÖMå†zS˜Ä¸×‚MYèÇ&Êè[è²þ.±Y̸ÞkÃ,Ï•øñF ›<ÎåÊ6è®zõg<¶%…”è¸ó…Á ¡íÞZ/r8cP†7²“JŒ'TûhšJ›r´WÃ!í`Ló)åþS6+þG"°´à$¥¦P´xôÍâœ8ÆkÍDÈû¦àYÀç¸ÇŠ@³#–…ÜŸ9 [âH#•Ö ¯ijÆypc`ºh ÜŠh-ýÈÕ‰.BHbôw¸Úa3ô¹ !ÿ-ï¯ÐG5xó³~k_]ƒŸ‚ßâÇEXr²|PÕcÍÑË1ü äSâ X¡14ô;©ÔR^gVÐ8©Àk)ξX¦kØ—'YìË“=Øj5£·’}ØãçYìñó}Ø,ßFu/ߣJ‹’=Øã-ìñ^ì‹-ì‹}Øj–C£º—Cõt {º{ô<‹%Énì«,ßÆ«}|«¯2|V²{|šáа’Ø“— +Ù…­VO694œdö踲ɡá$kX ÆœbIdjö°†˜DÅpxduýEY–I…´‰¾L§þÍàüý¾â ×ozx¨Úáy«[O‡ý^£ÛoþR(ÀÙV ¹õ7T[”õ¡}3lyíîR3¥j®\ÆsÐ6Hiw~¢Ç ‘‘)1þ\c”Sô4+,ôÃ)û‚‡é-u/ë³n«®°uh5YL ÒH>²¨T^òoü0bcøzù&º ÞE‡4­úùR_ùô þƤÕk<h½þÕÀÎÇÖžyäÒžnMF÷‹ófC†L[ÍË~ú×Âÿΰs±Í[Þ/ìc·äípŸ~}×é}›Y•m^ð:ïZŸP¥­y€áöpiîË8Ð'iÀ}‘ .Øz=Ø^sˆ´ß#Oµ»×ÃË­`øÞé7ß]´<ĸó¥`nLN²€›soàŽ§Œ|à w«n©LtÄùÌÚP©œqÕÊtHsiØ“ “l£chG‰žØ–ÁŽÖ›„Q†túçG?sOAÝþ·#~.E°N òt4‡é¡np_Y¡‹B§o}_ØaQ3’š[‹<âl»ñùX›øN»H_%†ZK{ˆÝG±5ÃK#‰™O×#„%)³¥-E¼'j1Ž±2Y±ïŒ»UÂð´úE¨î±QohÛëg–^ÙäÚI½e ]dÑA¤ ©M&Ù¾Ðå† ñR ®Cü.f¤é¦!S¼Ó±1žš¥RÉÙ4g7xÀ£Mg¶ÔX ËpøT­=ÿì* ±¬`ûŸ'(ž9NÕ²"Ïu¼ì…ÝbŒuåèøW´ophTEÎ/%TàÖ|OtŽ]›åœVŸãµ6Íd[ÁhŸÄÉt„œñ;Zn?Sˆ6gaÂà~Ñõ„Ý_û¿ÇÖZ]Pî™o¦?×Øý¤%¢¶*ëíN¿GG6æC=ÔƤ÷ê²ÎÃ&澚؆f»˜„JN×ãú,º¨ô¤á5øÈ•¤Ï( ã‰`m)µGÆ~ÔJbŸ>÷)ň)?¤$,D)Â{Fz”~»ûýž½éõNñÂw·rºÝ®RÝÙJõû‡Üœ'…»ž•»vÛúûó—µáŒmxœ;¯ñ^}Ã9æÍw˜ƒ™67²ãK‹é xœ{¯þXcÃ!V‰ü¼â…äŒÄ"­”Ô²ÌäT…dØæs¬aL"&Vœ¹•N‰¥) ¶ N&“ Ø%6«p°²*Lá=cŠñ†03óJÒR †M~Éw«ø^þCØÄ7· ô3BÍÜ,*TcOîNü¡?ÎáˆyxœuÁJÃ@†-”n¡Ï0Ћ†Üõ¢(êÍBžÇì$X7ew½H|K.}Œú}>“Ij%J2Ç™ïcæŸÃìs†ž^Ù°NVdU^Ô­éj©lÛ…ufœ€j?ºÚ|L¾vO£ª‡%kðƒ<®IC[gQŠ™I wl·i<1ÙþëîÒMåsy.É­ØP²¢ µ"1è’bñøØòǦ¾–;r·ýϺå3×Vø@”¤dæ3¼µâyûYáè‘„˜Ù>Í_ßo …Hdæ3\Ó)/V¸shÙ¬ƒö,¾}ä²l÷¯ééò̢̼ô€Lµê·¯7êýTêûtô‚¹›½Ê•®¯‡ÏŽ\打[xœF¹ÿ··$100644 Makefile£ÀÔ"ŒQ·‡í$¬çÊâ Énˆ±$9ÕÂÄâ‹“6—ÂdC¶€É³exX“rJ‹'7‰hN¶’RÜ!k8YF>qrœdåä)r/´Hlsº‚ãäk2BbNš\ @Ö”š˜’˜“£ 1ù»bF ¬xœ340031QðMÌNMËÌIeˆSàÑøyÙ`NòXçûÊ2îö±k/BÔdæ뤤1ì¦yMÁE|V¨Ñ².¾ ·¯o^£{YMIjÃáR»y “E'³Ç—?ëÍŠ+þ|of @º*ïájxœ_ ÿ´´:xÓa!ɨû5W_Ù–Ì¥ð9ıNb:ç®8cÇÊæõ¶n¨3)9eÙ2[100644 wiringPi.h+Æ; l7âÐç‘e] ¾¼ùáÔ³êJøl*d쀬PxœL³ÿ©¯ïª°è“h“ÿ9“Fu4“¼4³ûR1³vJ]“2Õ“iR? overvolted!³òRu ³eaºG“B©³z©/.Â\€ìˆ`xœ[fÔo´á!ûäD‘É<'qJM>Íϻـó?œ| 9ìˆaxœL³ÿÛÛ¢á|ñ‡7«µØéöçȱô%ˆC‘¶O_åÌ,ƈ :XœËöv³X|1Ü“.qh²ŽK6y¹'ACA½N°ÔyÃM#åã ‰ DxœEŽ1Â0C7†.½‚Õ90°²VbBêBòÛ|©Mªä§´·àˆ‰“Ð"!$o¶Ÿý.åóµ»;NXuãȾkÓQA{ n±„ Od!9Äzcnµ!Ud\@œ)Ê5è¸z=×$4‹‰9 †,ì)mmÿE9 ŒÓ¾#,§ãŸcÂ0rOH&ò(iÖÖbßÿîÕ4ýÒUñü?B£ìƒÎxœ{Ïôžišˆb·´ÉoUÿ}ÍFpNSZäDcC3…ô‚Ì|½d†}Jq­ß˜v£¼Í~bk”ò5#>¨Š‚̼b  ×J¥›'æû®»ÔÀ³>cY#Çí°‹“YMDVêE]Àýÿ¶—GÖË’{-Kù7Ù‡QŸ4‚탭xœ»î5Ësƒã䇌"“CÅ&2îßìÏÄ,¾ù¡d7©k …ç ‡"xœ›÷“qÆÆ ¯YE‚RSsrüsR4Êò3S4¬¹&ßa-—P2Ò3´PâRNIMËÌKåô4rvq quÙÜËv‰is çB«Í/=ø$€ê’3‹´r³S‹6s%u2³€Y“¦;yw÷ägiúì1yJ: \œ“ÓXÁê&k§(M~U&¼yOz³àäþJiV°&+HO>PȽùjåI&‹,9Gïè?xœ_ ÿ´´:aš=Ï¡¯N›ìš°ÜSé g‘?±Nb:þOÉW]™fx÷G¡8Qæâä100644 wiringPi.hxÿ‡ÖFÔÅüÕæk„ªñ›âº³êJµ,áO€³%xœ}’MLQÇS”®%’` ­¦›b?²´»[ µ!€HkÒðE×vkWÚ]ݶ(šcHô`2&šxó`‚1k¼B¢Þ ž¸xóâÅ‹W5F_¿ 4¼ìfçÍüæ?ïÍìæý“—ú­_fMgélB½Ý‚.{ îØ hë„fCqy½àñxÀÏã0A­ÇÇ€¿‡¼~òöB7Œû)ÀoÖöSû{}Ú£³7áœaR\–2’"ƒ”XNUE9›Zxnò"¹XbŠœÈȤ¨ŠàêîGyôÕ¢sXIßÈeER).&„\* Yˆ*ð®|.˲<‰E”¸˜‚!¦áàý½‘¡RÜw(î)x=ä<^cðEÊæÇ­lr!SK_E`°(Pô£'ÜTÆ·+Éép%ùY˜fŠ&ø9>BÊO)òJéX‰ƒÇ" ?ÂÐù…;áÓfŽË÷W"­)¶€Ð¹”¨e.®ë)RB&;œTígäµµ±×¸1;ˆïÇ#xkbù=+J“ ,‹ê²’ÊŠqÛ‚L» @QPI… àö˜¹=;²ãÆ{¿”éGWÌή8ìí.–Ÿu‘üjÕzVIÝëv{AJ€ÓY­ïpÁÚìwú.2F²®*ä&Ÿ§Œ:´¯Ìàn«µ! Ajÿ´ñB¸ç [‚ÒÍ>ž’Á—÷ycøxš7ÆòÜî´°$ª¸éÑD3Ï´éqãÒS#p«¤åA`q`ÎÒH'%Y …h'>œ3ÕÜa¢aÞt²†À·W¬t~´4õ€ )/+èê#×”´ Óà>Ø£]´P=CÏÑõÿE÷×g…òwëµWü[¨*tàêe³‘¯>äK­Dþ&„¯¶Ñ„8Q"pVè£j¦´%X(zZ^’I2´¯ÂÈ(m¶kw6ßi&ÿ@qä…‰kƒŸž´ï»ÿ¹Lhjë”2xœ[fôSwƒ<» —rJjZf^*g€g¼¯¿‹«O¼#'§¦¨'§!ÑŸÐàÉëÙEÙœ}99¹6ÏàüÊ:¹Ÿ_ˆE7ŸæŸÇ“œ‘X¤ ¥•›˜Z´¹Ed Åa%gå‹xœ5ÊÿÛÛ°‘#ÏþHbäÁ³éizNù“.Jé”dØ aê¼w¸G뙬˜ÏX€Øç‰Rxœ7ÈÿïïιÑy˜SîõÒn jžÄ§¾‘63ý‘âV³cÓ±µpR¥²vm€ NN }d“L#9˜ë ˆexœ›ñ†ñîsÆ UlŒf›«ÙBM'³ÛÊL°âžÜe+Þ™WPZ¢¤9ù¼µ+k>˜uÖZar»áä‹Ö2@Zcò_N0[ÙV‡=9'?9¬Znò[ÓÉLv¾@¬0¹ÀNL°ÓƒÒì›ÅìÕÙY ŒŒ'tRÜœèÖÆ»¹(´Šgb•Ðæ‰Ù›wÅ3Û!7_á‚Ùmxœ{ãÿÂ}C0/#×䃼2“/ðò1ë仼"“òò2NNä“›ü—sò[^0þÊkÃgd¡£`d©£`lĆ“íùšêõŒË”t”LvqñaPgˆ€T…{€§¿9PH)¤Â"b6È‚‰€Ô€Ô€†1#’A9þÆ0U&A¸ƒ@b¦1_ÿ`O°L§¯g°?\‘ÜÞ`1gW4g9»‚œ€T¼“ue¸9õõôôô€aÁ5YOP²½ ³ÂÅMÌAâÒJœP65‚yÇæøÉý\â“øT&Ê1rN®ç“Ùœ%8qr˜üf aŽÉ[åVon•Á:™UšóBUo&Z×f çŠrxœG¸ÿ´´°°:ðè(&YF8z/L ½£L8hósÜ100644 wiringPi.hQÌ‘…ìöjÄóΟè„ntw°Î³êJ,Šâ ŠYxœ¢]ÿ¢¬›°ê“¨ "“ “;•“®“~÷“Ü" ³‘N“æ$ // Padding:“ñ!“Ò+“€"“<" ³D ]“ï#B“"“/$“€"“<"d“Ï$“t$p³ã$}d³`,©³/H» “øQO³PR:“ëZ“ŸZ ³ [Ì(³r„Œ³›$“ϳ³Á 7w=µâ†1xœû©»[wÃAÖÍwYY}996ײ;±É¤V”¤å)$çç—($g$)hd:çç”–¤n^Ë[Ç:ÙZ€gs®p3%?Gå’)xœ5ÊÿÛÛ°ŒoÍí4©?j9ÞïÿÛ¡$,š÷“.…LœU(7€õûBßêcòZÜ)ï…}|ïçlxœ7Èÿïïβù•QjIiQžBQj1ÐäZ.¼ÛDþé€Dxœ›#Ú'º!‘urë§É¡lq²… ¶ iE©…Å Ñ™y± Ö\ @™¦ |™Íc³ {!ãä>%¾BM°y‡{ø䧰Í}ž§Ù6ÏŽ²SÛü½aãæóMª“SVx3)(LÚ§0Y~•èäc+u7‡­R˜¬,}²Én!i…´k.`ˆ”(€8 LÞpªg³àŽÉåg¥6ûå±5ˆªãˆ›xœ#ÜÿÀ2ò*°¥³Ý4³· ê³ûN““¯ó¨˜ãŸJxœS¬ÿÛÛæ3AÃ˪µHfÇ îúFòÏ40000 gpiob*¹ÈÌóšÜßÿJ…hx î0Ü-Γ.ƒñ§<¨2*ŠäEö‡$[^¨x×&šï¦1xœ?Àÿ« ƒ °2*£x¦C䵩Ѓb†À\¨›š®7Õ“FZ³ÈÍàÌf²MKÍaÏé)ímÉ­h¦#¯³©ª­¶o…Ù[xœ»Åy‹sC6 ³«Ëä<–-Û/è#…¶jxœEP]KA%£À }(0z¸kX;²¬#"”_ôàƒ="> ±¸£Žà¬ÍN&¨ô#ö—D¿¥‡žû#ÍÌ®ÛÀÎν÷œsççî«sIêp¶'Øš ˜äœÂ“·éQI'B* Õ‡£ß#R„öJ U |Ìîr*»¢×“vD2g_ãÌâ8§ÖíÒÛøFÆwºöé”qšöG¤þ2x|΄t”Ã`A§)û¥Ç8(“™ð–ÿe_•«1.ã{0£-Ðœ¤Ë•£–‚VBpú>2œCM+^7AGwuõ 5C åò—€ë³`»ÑÀªôy~uW#ÇRÊd ¶%¨ç›ÀNsà&5¿1â8Ê_?ô€m"X©=†ÝlÈJr`lÄ·(ö–iD¶•ÐjÒär%ÔÞÊ£¤[›Pn¸µ©Ã~[åò˜—œX² 5âó`1ĉÌéO]‚Ê7Áõ£ =úÎÚ›ªâ¢xœrÿïÍ:¡-U“ cjÔŽ÷òö4z!ŒÇ»‘N^6áË£"·hÝ)r<Ž¡™ö¢Bñ100644 gpio.c¶ZðëcÊ<Ån«FØYÙU<–“4ÉøƒÿÉŠ“ µ` ý0±Š¯“L# ”4é„Ê8xœû,øQpÃUÖÉwX—2ºNndó’çÙ,$û_ ÉÊÑ$;9²Rbï¢=xœ›å¹Æeƒ×æ <…Lì ™y¥%\“5ø6gñˆ°z °íŽxœ-Òÿ‘æÜä°o“»E“#W3³{(W‘z“G_“_^³Î]À³Ôp=œN•åŒ]xœÛ"°E`C+«å’œ¿møcÇ{Ää๟uÆ+› ÌLLŠóÓJÊsõ24ÖjNã9Z¶¶m݃–Ñ€»'=NÞÇúÉj«×¥IçwÊèzrTÈí=tÔâùÅË ºË3‹2óÒ2ÚϹ5¬þ”Ûg~6‚7šÅk¡g±ÙæWl^Œ›¿9ó䆲ixœëRØ-9!dc$7‹rJjZf^*§¯cD|€§_0§ÙäÖŒ¥“õØBd+Û)ÆÒÍìÌŒ“›8D&ppm^ÁÁÊÌdf _LjøO¿`]CÍÍÕ\LÁ™ kˆÊCxœ{ŇsÃ|–ÉGYd]}á‹Lxœ1ÎÿôúÍù°n ³„ i“z)“ârã³âs1“auFPWM“‘w³Ùu³öv~FTBáå‰xœ5ÊÿÛÛ°Oµ"R>B°u²¯"›Œ†T¨c“.IÔVÙ4€§ Ž°‘ù§ ú¥Aƒ*ñî…xœ;Ët–iÂ9‘_˜ûê˼™‹YT²ç$˜ìÙuzâ£lÏâƒNxœ»ó„qÃ=Æ ÜlŒF›yØü™7åJ7ž|Ï–mòOeÛ͆ÚFèÖ ™çƒAxœG¸ÿ´´°°:ºaÙú¶Nú>5“ÂÉ° öy n100644 wiringPi.h„.‘vÏØØÈN÷qoxaû$³êJxÆ·â4xœ;û“éú¦ ’|›øž'l.+ ÷Yõ°lˆ–>xœ»¦µ@kC$ßæ~¾ãl#Xÿà+xœ»Ít›i+£ˆëda¯3Ÿ¦*k¼¹õÎëj±uÛËÉ’ŒNÐù 0î‡xœ;Ët–iÂ9 e%õÙ9­ÇÒm¶HyoÙÏt;†kâ£l½Î óàxœÛpqq³1næaSÉ8•dãsxœ3ÌÿÛÛæ‰o5MÑÑ–¯ò2HmŒÁ7zC‘úM ÌÇy¡ÒGô„8Œ.NŒqXòlÊ]lŒxœkæ¼Å±¡œqóÆÇLðÐjXxœÛ"ðŒBèÆÅÙ‹îmxœáÿÛÛæèsâúÈ£^r»Îa\w«'=ÿœ!‘úa>BäŒ\xœ$Ûÿƒ Ú^ˆH³4I×ÛVáËô”éâ{ȱr³ ã4‡É凖}xœ»,{ZfÃBÖÉ;YOlžÆ¦Î¸Y‚c7gýRì€xœL³ÿÛÛ¢úpgñª-³¥ª}“eŒˆFÈ‘¶O3*…ÑWÀ:‡m„X9jˆø“.0Y·"ܽ¬ñm üëÊõd{«8¢$Aì®^xœ›Æ¿wC>Ëd{6«É’¬Pš³[ #~ÁîŠHxœ^¡ÿÍÍ:<´QŸ¯§ýŠ¹ëz^Z ²-é›r²]100644 extensions.cÇå0†ù’Q4.ý\•5^ª‘vX#"'›l…Æg<´Äï9Û\ ‘âkŽ1'Šïƒûxœ{X¾1kC,Ûæ6]æͲ<ÜÊ“ Ø7kÿ`Úìb6—¾2 âë…xœÛ"°B`‚UØ[ÿìW×’UÃÅŸ¿áIÜì±úþ±3†f&& )EÉzÉ ì»>çŸùõ⹋ê–o릤GmCRÁpèÈ+9'݇ÆŸÚäsô˜lœ£Ç,â˾úôiÕlï 3'Y+¼éY”(}ó=æ0ú¤5²Êxœ½X[SÛ:~&¿bK§Å¦!z:s†’ö¤@ 3!dr†'F±åXGòÈrÒLÿý¬$;v(—–Òæ{½×ow¥]ê»Ø_z5N¾*Ê}X2ÉølÀðA… B ÇÃ#ðWRDK¡„E ´¥Ÿ2.´ì‘ˆW’ÍBŽçÂ~£ùN…ô‡3ÔIe"8²½ÌO{=Y‹(àߘH"X{n¢ •Š“ƒzþ—z*©ùR̯qªê’$ñ”J¹Ú‹YÝJáJiÕø[C HJ!ZI`%RðI}–(ɦ©Bî×…„¹ðY°ÊÔ 9ÕÁ•óD{©_NûèÑ$Áo§”SI"¤ÓˆyÐcå ’dJbMOBêÃted;Ú¡Qætš Š ^Š C „ßá}f-S”i®ºé¥#‘ b-ê¢û+ˆˆ*¤k÷£QíãÆŸPÄ]ˆ1Þ%ÃÒ˜RH¤Q5Ó€üpÙŸ]LÆÐî_Áe{8l÷ÇWM üJÔjcó8b¨ƒ“„«Æ)9?¡TûK·×_é0:Ýqÿd4‚ÎÅÚ0hÇÝ£I¯=„Ád8¸ÔF”–0x÷À$õ©",JJ8\aêô6ò!$ Š%àQ¶@_ vG¼z2·›y >³M–#\ËXºp¡ª ó‡º±Ž—ËemÆÓš³zdU$õOµ—ìªz¥òšq/J}4›(Ÿ‰Zø©DRlN7)ºøl“†}Å`AÛ^nGQÉH¤¿”>éSÉRì `k<œœT^f%`œš×-§Ùj5ݵÓî,yÉxî° R©ÔMþæ«ãç§æp8 Ÿ™Â€Ë»–‚°(é\({æùt@¿Âw±Nö­ ÁüÂ=pÓÔSëšè#qdI»Ÿ«ØwJ{m´ënå[ ¾»[€c¢iµ»m0»]Q‰y*/$ØþZÑÞ§À¯ÂŽØqá#Ø_½]§ Eh„%ZÖ6¸<¿þ1ñ¦FÌô=!Ç6åŽi@ÒH鋆§*ë,î}Çç/$¡¨¬r[ÎE“ø˜Ù›ÌÔA{<§3‚Ç2V¶©cäÚKãMÓ-‚ }aé¾XòäåZØô÷¹…QA(;Bz¶ÒñK§axSLh‡]sÜW}ƒÉñõd kåÛyoîX+?Ÿ^€Û{KM_t:?b»ñK¶ËåuÌfL‘èR2eΘ?Q"e›?[ ¥ÙÉñ`è†G#Ú€Ï+8(²õK­¸œÿQœr{¿£Å3y÷·ÐøŠU|»6ÇÁa6¤Äÿíè™c¤dðÇ᳘ÏÆÓö”xEòlÑ´2¹SzG.cAû² ¤*•­îðþvá¿Ìï{ºüÂ_²ø³ø?Œ¶4W-Þ #½ñI­Ûó9.1ÏJAŽÝƒãbŽÚÏx’@sTõF(ÛÁ }Á>%ÀéƒA$8Þ\xãÊ¥G²ÓA÷BIe@fn—? ë´MíÃAålrn„§ûY³YÔz‘˼±¿)7%Êm¥üW›7¹¾‚÷6/ÄWökš£Hà|èäwÁãØiÛ½úÓçbÊ™¯%ÓóE-n»…qÓ­¢Uè²o¶¹uf™¥™I 6+t+ïØkSœººžg«FÞ²ó§! R+s.)fØ;yÕ”¥ý"Všm¯Ûx(€í$÷Ù%é™ù '^ú!õ¦g–nÜ­Å"!.¹‘\ Ò™yÅ ×tÊ‹îZ6ëà„=‹o¹,Ûýk:Dº<³(3/= “Á r»Ò»µkîì]ó1—÷ÏëS_SªWùŽ†l‘(xœÛÆÛÈ»á8Óæ?L»˜"‹9äÉ xœD»ÿ··°98 6·Ò™Ë¤”L Ç( õÐ]100644 piGlow.h_}aªàaUäÀʬ=MÉ䇮˓qF‚>Æä‡Ýdxœ[*>C|ƒ;‹pqIbIf²Bf^‰Bn¥Sbqª‚õæ8o&(O[!'5Ý'5¥xòCN±É©\ü“³íœ<—ýDÁæwF({ò-NSK‡Ù#¨þõÉùyÅ%` 2ó@ 4¹ª¹ŠóŒ -‚SKJ 4 :máJ¬¹¸ôõBJ‹òsròÓÒJò€®/*Q(Ï,ÉàQéž“_î“š® a £`Ò„"h”B5‚*­ågVÒïˆëxœ;Ç}Šk;ËæÉ,‚Œ"ÉùyÅ% ™y% ™yN‰Å©š Ö“'²ˆrÖr)§æ¥d¦qtÑï•KxœàÿÚÚ Å´qÅÑë 3e?ºŒ®GÚ›K±´¦ì’ù®xœ340031QðMÌNMËÌIeX0cêÎZëuQÖ[^2Më\c4I³Ïߢ¦ Ó='¿Ü@/™áò?ïiÓý–® ¸gríˆszcP±µ¦\Q_¸h/ßóØ÷§|²ûÏ¿ù67À.!ㇵmxœ; °oÃ4ÖÉóY¯N>À6w² ‡>Tr¾ï†¥?xœÛªy]yÃj–ÍïYìØ&çò.š,ÊwŒ;ÀÓÝÇ?<ÞÉ1Øuó¾ æÉr“½…tbrRÓlŒ¬@,;[ SWÈÑäRƒj.΂L÷œür   „Ž‚¡¦‚5gJjNb¥‚Œ‹®lòYaåÉIB¢)E™y [LFƒ™pk@< {‚@J4@R6™"[„¬Nd™ýd^‘Hoî–[xœáÿÍÍÎë»7q÷ånˆÀŸ<ÎÁîWH¹CÀ‘âkû-‰àœ$xœÛpqq³1læaSÉ8cá‡nxœ»Ít›iÂá°•ÿ:öD­V˜˜í²ã £Å‡¥Å›M €@!µ"1· 'µ˜áâÍgg}UöÉÒ½["\Çhiré™&DIzAf>ƒnþ$>Ù[Or}¯¶ý±YMG©¨×dIF'd¾*áÏ|xœÛÎúžEÅÐÀÀÌÄDÁ71;5-3'•a!ÛMÓujLrölK–*šÅþ"p£ Óä*&[žGææ§|xœf™ÿƒ Ý^5ˆH³4I×ÛVáËô”éâ{È40000 PiFaceSöGåÀzù#~ ó|M¶A‡aêÕ‘´Ã³ ‡iglow.cÓþK–—Æû|PÞ4Öô°Î.‘\³d[ .àî™AxœáÿÍÍÎÜí•Î ½°[^ôØd `Ûau‘âkéJÇ០xœÛpqq±1XnæaSÉ=ôœãgxœS¬ÿÛÛæ3»…´ðã¡âœ“©5×¾‘40000 gpioH"’y^Vû DW! '}~½Eí3“.¯m‚º•™8²WxåÚK¤%½ GÐÐ"¢ä xœ»Ë±“cBœHÏ¡°û;¿ÜMOo¸Ú\X1Õq.¯ÜÆ¢l¦ÍŒÌ1ŒN(æ›xœ6ÉÿÍÍb‹àìηŠ¨ TY…³ú¯S3·u‘vXÜí•Î ½°[^ôØd `Ûau‘âkäÆÐæšuxœÛ˜õ0}ƒ'ÛæX6;ÅÍ›4ö²mž¢?—rn @äškxœ$Ûÿ¨à:ÞÞʙݨA¨n=Åð†´Ìq>±NÚ³p¸=pâ‰ÖLxœ;l¼ÀhƒûfvöÍ»ùÙ&ïçØl)jÎÂœR”<9PL”?8µ(31G/C( —Á úŸåmxœ5ÊÿÛÛ°7çd’_A; ¡õED¦%nF“.’•„+mÇÐo¡¸M¯±8$ Ùõ\mçxœ7ÈÿÍÍΛ’üàÆ@Í32óS`}ß‘â47 1xGȱÍš÷,ˉöNý¦“*#¥]ä£xœÛpqq±1Xlæa+K›|"G›1òº©ÉM9Ú›?çØ2uè¶Ixœ{c÷Ân?£áfn~9~M{%L%+%ŸüÍVÂË1?ŠTs L…àbxœ ßÿààíÀ¶&Lž‚¿­Åà-2ÑqûAðh$B³ß#¾ïÿuxœ; ´Ohƒ£Éd6%M5ƒ 7ƒÍÁlo™áå„8xœ5ÊÿÛÛ°Œj`ñ*uýiD4‹gÓ &)vX“.c¦Â—ÕiTÙZ’bÌÅ™×Õb#/ÈîKxœ;Ët–iB’H¡ýNëY§Üº¥Ã…*¿_^Va7Q²xbÙuÇ™ œåƒOxœ{˜¾"yÃkÖMl½²›»T'slvÑ›Ë r! ãƒNxœ{À?‚•H~;[ÖÛ )ÇÔŽ Þ8-°Ý.–8ÑoÚf=ÆMlñž ¡äƒKxœ[`Ôd¸Ÿ‘s³$ûRÖɼ¬›ÿð²m®`eN)Jžì(&ÊœZ”™˜£—¡ÐËàœ ‰å†9xœ5ÊÿÛÛ°)œüµâvÜóDmGäøÐIj¶x\“.1‘`q9€ZH&–¾»¾§v8’ŠlŠ¦ÔîxœáÿÍÍ:ˆ;ü%Ú‘Ž¬Ð™•P1ÌQ“g}좑NÿÞ&…á€axœ›Æ?ƒ³ˆÌäðOæ+¼ƒŸ=î¸ÏùLámRýÕû›í˜#XíyÂì€xœ»Ít›iƒ;£HÃÓÒ®”Óçƒ ¤ù®Õ³™h³¨J ²áWxœ!Þÿ––°à.}\õutÌ/ÆÔÒ«šúÿÅHs³ô¢oæì¼>xœ› øQ€[_‹KAK!7¹ÀØ`"·ª”±‘Bp€§‚c^bN~ºBI¾‚KfzfIbÎF/ +´^†T[%DYPjbŠP€3(µ¤´(O¡$#U!b@YbNiªB~Úä,y™y%(z&K°jMöeµš<‘Õƒ#ÉÐÐÀÐÀÀ`òmViN ÇÄ1˜ìƦÏh0¹–ÍЗKA¡b¾†FqA¦KbI¢B´A¬‚‚¹¦BBÐ0VÁÎNÁPSSAMÁ ÂØÍMÁš«– îjg'ïa³`1200žüƒ­Ž ȯ`¿4Ù›CV ä.[gu#ì6›çßY}àWxœ»Ít›i+£ˆ‹¾À²öE>nåOœÌ·¹Eθĩ=Y’Ñ ¶ ïk‚_xœ;Ë´‚iãd]FàìCxœ»Ít›iƒ;£Hû[•é½{÷ä~èÿtTtíÏ—ƒå¾Œaj‚xœ›ÆŠoÂŒO6±Qóå‹0xœ5ÊÿÛÛ°ËpøBÉj+n'àªág`“Þû “.EV9Ÿ›'íȵeN†E^k9SxŠâ²Fxœbÿͨ:£!WzAf¾^¾’)z\Ht)l¬.QîŒ,xœ{˜þ‚šV%L…|mïú+nâ@p¢Äm§‰ùPi¥nvŸ—Ø»–wmÇ+« .ÁãV©U‘8!¡"Ÿ@ qàÚ7þ8 ‚nÌÛ}Þ8IAGöÌ›ùÍÌ{ó{›»uÝyÔõÀêù¤w{HRƒ¡¸xÙ 9j’þ´šZZÎ.§²ìÃÞ¡>ÛѪCëóÞoºÙ{ýF«ðÔí§›[D3´Báb&û¹¸g—ÀÊf:%jÚüÉ[í¶5ÍtÀ± bt¢6×Ë<ŠG𬜖 š äÀ!e1ëF·L“è1À Uªš”€IІX†¶U$£†Q fjÔÙuÁ©éq˜-ã³M ¦eð´åŠîTÊĆi°©©7 _¢èV±¨™èXŠeê¼pŽ`™Ä+-Ž¢ÐÐÀ¡E,«FÆp¼.5·c«RͨbÿZžƒìþ3ZSßÕÊ0‰ÝnhEÌþÎuH’»w!Išâkª¯…}-âkQ_‹ùZ\’9âöÒ" @ëvjÍÕÐ)µæÔ²"´õÌvZhéíŒtÙ ){°$<·„æ—<ë§M´5ÅoCÁ6·`.“$ú× Ngïé <óFÖ•‹kÙ¨!CB*BªB†¥cøxäP+Ѭµ¹[Ç ±H;‡¢È ¨r”0*QüÆð;+ƒªÊq¹f  ãè èQ¹?Ü<‹æšÕºó°JÄSòç¡` á¨„ÚJͱ6^„c6ñ'ÖŽŠƒjˆ?>ú„äÇýqos„•À?ú÷«Á`$~Ú›>Þ=‚¥ÄÂÞNf&qÜ‘V‚æË‚Ž.Ý‘ºÜé*Abèå r©¦ÕQZ0™ ÇÏR~ –9æÀ¾iÕ)Kgƪ8( ÈÉ(Ø/ÃZØœx)¸´¥9 Î˜Í¯ k°òÜ,ä4Od"ò¹¥Ä÷zÜrÙÝøH³„dwr0.MM»!:µ©k¦4ýøÎ €MDoÀ’€nÀ¢—´qÚùߟ@oöu|«y |4b ¢+ÀW8²Ì›’Û ¹7ê8Z&dÑó‘…×ð_‹À$t¿ðÉQµ¨qt®0Î×ìÙ·Ï291ú¼ks‡Ñ÷`7/ΟÌåeÙ"ÕQcúdúë)v_??×±þ%Üð^ piÚ~º›²Î¢oj… Jö`o0z,ïãÒœJ‹­³OC|²S|F½Ñ"¹¾HptÙw‰…fçÁļ ÂîøñÎ)ÐÞQდ’µVø CœUǵƒ†ëmgqÏ»&à6ïîK扳Xp¼`ñäÔ@2 «é•Ux¤Ušß•à"HkH$6páÜÿܘ+³ƒ­_ÏõIìϹTÒ'õ÷9`_Ì÷”jE±ZIÊ}zÁÒ÷qýÚü0û-e¯,¬3g!Ã~X˜f—&^b?….´’‹?w·~YïîQBjx‚HÀ¾¿ÔÓÚ¸|{ uõê}­/»?¾ù{h|ƾÝ{r"ËÿØÒìÒ)—ëÈ7Àµ†·G•Úßÿ£ìXZÙÀ·¥>Éîåßõ‚Ù™ý¡ÖÝógØaí {XÛd#U…e†]ùHÈêÃìúÓnz믄ì:fp¸îê÷Pÿ±‚1(߯¼àöòzãÚߦh…pìxœ<Ãÿ–Ê:¼Gbƒ6ÁDµtÙ*RQïf3Ä8‘NJ±ä.ézmôõiNü_šAgWÞ€³&p ºéî‘gxœk2ìÒßð€ÅÌÙÍÇÑ=˜ÓVAEÃÅÕ)Ô]SA7<-¿(7±ÄÖÈLÌÉÊxú9û„º¸‚ä2ór2óR7³^bÜ,ɞĺy+:Ûfná™,“/‰G2§%O¾(*ÊœZ”™˜£—¡ÐËà9¯"å»+xœ5ÊÿÍùòó°²ç`³vqu4“A¦‹0“Ѧ howLong * 1000³þ¦ã³í­àŠÃìšxœL³ÿÛÛ¢wluo p>® ³B Ý æQ4Ž^‘¶O£“ìø…E÷hݤÚÇCôtüd “.rûÉo±C‚Un)«U‹%öâ¹®%S$ææxœ›ÆßÌ+«¬¨Ÿ”™§Ÿ”XœÁÅ•œ‘šœ­››˜ª›Ÿ­¡ÉµQz Óæ?LÅŒB 1.$“ÙäØ LQÖ*øÙlØ0D7—²)2Åb'ÏàŽXxœ@¿ÿ¨¨¬6®Môå«s¡‘©bJ1RbÝ"D™Ï100644 gpio.c3¦”òVmÕï ½Ä©c•y.‘âFƒú¥æäxxœU‘ÍJÃP…IKÑÅ…ˆR¹T]ØäÞ¦MZDúµ¦Ø‚¢´i(Q›„$RA\nåî|—bÞ@ð\+è øÞÖnäœÅ93³™GãMKgë[$³Y5Ì É0FÄ´"¯i„)”=LΆÛ"Ug£aÙ+ËÿêµÎ÷¥‰1ÙïvdëܳÎäŽ×²¹.mó{éø%ñ™Lšõuþ•:â·Ãe¾?ñóè¡ÆW‡âÊT+1´à¤"öãìL˜HDˆ?¥Ó7®9ž‹'¨Õ„‘Õ{^¨T‘£À4Ì‘¡ LÄ扨b˜ˆyÔ@uP€ÁÊ%R[[U°rƒ^ÞU*  ÕªF‰”×<¢4¡ Hˆá>©˜5iŠBÀ¨™HUkÂ}$îî ÍCªP¿\CZ€^/ijßÉ¥°$Ë~àÚVf[×öܬkGrÐ}ñàjÉwä®8nÛwø{æ.nÎéÒ/Ô r2lxœ;j~Ð|C‹Ðæ![N$þÎæ]xœTOkGÇq”tæPhB1&46X»š•mÉÂ;iêXø¥à¶ŒvGÒÝ™eg6kA@§z4¢çB¿‚úúzíWè-ôXzê›Y›˜žÊœó„UeBÀ·ºD0BoäÔ”~430ÅëT¾qxº3v½Rz\PÇH;Ñåx²X½w~gæ9GOÜ^7Æ4aß@Vâp`s¥}jnóÀ~šÖ\A&;½Tyi©£º#V–zR!²æ2M›e&. ,}¢‹ÚE"Í5Á°…ë›m¹~n6â“Ãû3œ ØÃÏ`ÏiŸÕ”ò¡>ò-¶ÕpÍzSú)HêðE™[ï¬è»´ #Ì =ÔH_Ï‹ŠKÄaäI.n™Z}×#å†ñ@jdTi¦Þf“‡‹¨‡ +1eV£p08‡j"9£{ŒQ?¯œ5îÇà×üïÏϬ9ÀÑ&/K;ZÒ(´ëxa„#¬ë%"ëƒoŽ6(D$b$Âë6…6‰"'l›Â‰ÚNØ…mm9a] ;$ÚöQè-\ ]Ò"iÏH?:èÁéá~‹Â.a¤M¶¯U_·(k‘..tt:è÷ààªéàŠvnTŒbjøÐÉn­<:>íSÖ&»¸0×Z×?=¦lË…‚izíü‡Ÿ>è’³ËCÊv° âöÖ⯇.¯üg´æwWß7šî_{ñãjwé_„CÛÝî —Rxœ›ýžñÀcÆ ÇX7gý&8ù wìf=ɹL“käô&3ˇLŽ”w™\#+0y½¼éäU²Ü“ME'³)H3UsMVWPšl¥,69FÁlòmÍ‚Ì<¿ÄÜÔb…h +VG‹31§ÈKO-qÌ)QЊj‚…'¿S0œ<Ýo2<ïd;EÍyŠ,²“¿Ûï›Ìå(7YËQyrµ-×d})°ñŽŠ“ ]Ä&Ïuæž¼ßÞx3»Ó$‘É¢A²“?„«O>f8Y×YŠ§,1GÁV!1/1'?}ò¼P—Íæá) èîKâ€gxœ2ÍÿÀãÿâ°Æ6³Ç¶J“òV2“ÁP1“Hatoi (argv [2]))³LQt <æxœF¹ÿÊÊ°Æ:¸ã¢|Øø ö™tG<^W¨˜j100644 wiringPi.h` 1‡cè^²ÔRòzaEèl-ÇX²J<;£í§ËSxœ­Xyl×ט#öÛØÛ<›³Æ6ksCVŸ8>X¼8æ2ËÚ;¶§^ï,³³^[ŽY®Di8|‚”pÔ½HT\êdRh‰´j¤öŸ¨JÕT©UUJÕHmÕ´}ïÍì\^ã…”?¬Ù÷~ßñ¾÷ûŽÇGÿLùٔɕ©Ês©Ï2±U«PC$Ø# b…åHw˜e‡DÁ¸²lý¼ÿ8!(#¼^ŽÈÇ ÝÝÌ’oŒïãå­Ù ×ñ× :BuÁZ1(Kb`cŠÚPÄoÂû…>Aö:%AŽ»ÂÁÙÞœú„ˆšŠ¢ ‡|o¶4kÑ5鈾 ÖÄž/›mÅtD˜—Ý>$ éj¨­>IŒ„T÷u³ZX4÷ÚyŸß‘ ,*êäQj ʼ$EB²Ã•¶Çzì£åz8ó•X`í¾`Ÿán$ú‚¼Ÿ:+©[6“³2ò CBX”FÒj•?±Õ³ÞÉRáÊÂ%ðÆ•ð«…/#“©ŽïŽôõ Á>–-*HøÛ-Ðex˜7¨õ3,éFý¼ÄÃÝ‚W@^\ w‹dWÀüÂbx»8K²a²Ð KÇ•5E#)ðáÒòsÏ,†šõyÊÀ3HQZW¬J‡ñMiÊËÕÏÎV~º®5µ¶y¹NùÅà EÂ<’ûÕN9 I|/O¼A²ˆ¾ ãC‰xŸGQˆ„ð%¾GŒ”³¨,­;"#A^FÝ<D0‡eÞ_â¦g7Ô¶µÁǵb>ª¨BX¿Äˉ„ç¾>QRêêN¤¤÷û$Tíq°£p¤6Wù¢áè\ÈiÿíìFÌ3¸ß¾þây±‡Ò‡¦N§[0¨ÁŽ²HS¬m)Äá½"ýÜ‹?Ñr´nu¹•15Þ*Ô36k‚¶›ù5øjµœÛD¸5£ôø8L Iº‹Ââ Ä^ºçîlE½ZyÃ^ðvÎqÞéÎRÊQo…^Ä‘_Èå"‚ÞÖíuõÞVƒ…;sø@˜g¡ä…õ]cZ‰1H¬ûk(ÓŽNf†S2Sã ˆŒ%áj×z÷ØT1j&±˜Õàª2"dJlP9²«”™…?à;»ëá­æl½Ÿ#{á'{®B÷Þ"åðÞ3 <ÝU g¢‹ Ôµ<5Ú/xÄq°u.ü¨Ë‰7ræËb!e¿ C9ö`Ù<¸¼ßßmΣ:ÿ¼¿nµÕ{µ(ŃÏE›Ûð‘#Où,ÐÈÀ·uô¿Ç ÀíÉaU–P»¡cùp÷ÔB?V¨ÝÈÏ­aÆ äH¶JK,“A‰åÂ23‰ÌÂ>%øòH!3 ƒÇŠÀ{t!4MÏ …„Ê’è:º .·®WӔȫß`TË'½ððƒ\pÊHÁ÷è>U4W­@<µ"]—Æ¿¯œâà‹“ógá ÁïO9 õô2ÕŸ\Rÿõ8©•Ó¿ùdI\ó†QªÄÜ3(ÞšV]åª0Ü /<@«ÞÓ٠¿ Giæ—(ÉäȈdB.ÏI¼ˆÔ]"me§èŽºÉoª_•)ãðõ¢•çÀ@Õ&e`üò©‡Ú]n‰ÿž¾”íÇ®D»ªÔ8aÀéý¾z˜O¼Ï)Ÿ¸ÏÄ(ÞÜÍIín½¸ªÄ3ãå•0ùc–3שr”c5 : —¶_¥dÞè^ ÷ÜKXð,dîp–¥8qr cb;:àã«é¶Líšžt£»piOkÝSâf‘ÐaQ#t“/Þb:áóÁJ†…±štmc[Sã6ð½’»¡e{§Q’M€'K‰·fNeÎé”ÙŠ<ÖÕC:NÌ÷äBõ¡|øÅdú<§Ê4œ<üð‡JgKXÎ*„ÉC9O9Ñ&T…6+îá}ZNŒä/6»„È8F~!êà¹ÑeðïÑbøÝèxëX .fðb ¼7Šð¢«@guÌ#ˆU·Ø–Åm œF!¹¬Ð¸éà»ë,á5ͨ88x2Á„êp—èF·O’ü3ûíå¸×ÂgáB¨VƒS.\„¿×›òü¿”3 Å>•7Å‹Ò_‡òYÒ‰|s[£­´î/âÈ09÷'‘²Lk!.×Ú]·ºÚ†œ)c,ì³áõ!jòúPaÒƒjÂvŠØÓîD³cóµá}jVƒ<êâã¤M«5m ­óÌ œ§‘ràt C›Ä·_k) ó×ëÇ….<nð‡ SÊÙ3å rísp‚x,Ï. šë§ñ˜%»\cÈ5•<É™¢š•[gë˜ ®éD²Ìá“úà_çjÀ%4/A—ò7(b`Ùù‚¹e$^X{~cZÃ7xe-mŸw!k6± ÷rÀ{¡e1nÂŒ¸ú]M;½ [›Z:Úë47Ç êÌrp†Òp›ÏWº_À0!Ø}qã¬à‡{¿žçÓÍiä‰ç‰G•••pû€.­**GdÈ¥rTÈ4.!ƒ•˜Ï£—ª3µ'Š:ÙqÐq{)|~)òj3 ÷òFlêÍËÍpéÐ|H½R â••ÙË5 ,âç¾ÄUÁƒ+Ç•ãW} üñ›©¸ªâ1ÓOFÉýÊðxxl½v‚qÂo®¡Ì~1Ú"âé¼ U9Nå?×N̆ô‰ùz,ÖÆß›öáVÛJønI¢(ÓéÕ‡Gàœˆ„8G%ÂÞ‰âf:~LCV; ùàâJ;›Ú›ÚÝMÞºúšŽÆR*q¡¶Ž–ŽÂ¯oåçÓ× %=⃾îïß,%é;~½p¹–ñæÅx”C LdŌ禖>8¦¬žofÍogm”·€Ml«Šl[‹YT›Ÿ¸j󚶿ª1ؾDŒÒËãÃO†Rã~Õ)¦Á>YXÎSÌç5Í?&°©1ë`[S7À~!¦7Lmj¢:ڞܜ¨™œ6ʼᴥôSðóí:Úö¢1T›zƒ ¬÷ †;ë¶P iÕÎe|·WQˆ>6'UcΞøÁ O9=‹œÐº§då¨æ©cøi(aü—†ÍlZo'˜Œ“%,ûñ"Þh¨TÑ*Ä¥J¨'£µâYQ¥U,ß—`Çž¢Ç2ó`2î\\ú¸¦žÿáá'15¯WKü@$Ó¹²&‹+ÏlÅäÕ¯d¶'0ð$fo¿ö$f3ôÓúüaj·ò±ì²°ösOb83nXyé N¬”+,±Û«•Ð»Ì\bvÁ—׋ô–ÁÍÜ%HpØ3±d;µ=S—à†±g ˆsÐäq˜}&Í@k7s“kjAM¶ ˜Ð3¶˜6k'Ý t‚F0M'HPüãŽÇ¦>“®þ6ô å߆ÖÏ,°,pÿ½ èz¿19Ò‘)6iÎàd&‹ê™§ƒ“!œEs¾Ñµ˜ù¿’¦›<Û¬`¯8f_ÔÑÉpÍæô£©fk¬Ú6Õ¡§¥y¼|8±qËW3”º™ÿ'Þvàû“qxœÍZklוe;6)Ç'U,˲|$[ )S%?#KŽe½ü%Z”¬ú¡Ø#rHEÎ03CR²ãNR‰·§‰O“IкûÀî¶ Ô Ø`±»m¶(ú£è»»EÛÅ¢íŸh’¢ûcÛ Ýsï<8CI–ä&@Þ{îyŸïž{‡_ûjÕ¯Þ®º³wÓ:AM—ê6E}øõê>cP.Hª"gEY‡³‚* 3Q v'Å”$‹þÁѳ—Oû›¦NŽŸŽ4¿7yHúÇã.þ½)tt@TÐæ ¥¨ ÏŠ0£èº’…ƒû!'ÉY)1 3bF‘Ó +œf\Ðr3¢ª.@L"þ ShBÕ@PE ‚”aj:Lù$$Å‚”pëNz.c—¢}ñÓþ`d~ˆú#¡@@Ó]J€¦w¨ù„EI•ätLU’b\çC­î1 zatrdŽ”|›oWo ì–R$Ä?¼4q2:8Ž··¾o·('¥¾µíYÃâ_P2ôŸ4•È»ô!›c‚ƸµuÂ[‹œ>«ŠBòR6¯‹ó—tFeDÁü7 ÎäÓiÒZ`\Ôóª ¦S À¸Újr*0?½C}#ñAbà&1÷³µ¥kè«Ö$…b@¾Û1WwߪߊïÕ5àö_zfGn]$7» M(Ã9IéææÈýÀF¥„aŠB°“B *ùô,tD¨Úéâê8š©ÑÊÖáÓu×ñN¸ppÿ4ô®€|öûÉàˆùÌ¿ÓWzꢈðöÔé<íCçþ°Eßy€=u¢§Ãì©Ë¡ëê"ûlº]|Ig™á£4m.¦i8lÂ!®M1Û~¿³¹ ý !ÌÖoŸíø'—!]k0¤Ë‘»o•†ú` ¹¿mˆ$‡òrB§ØA\̈ü‰Å<¡ÈºªP¬Uo‡àpl(>8‘¶!6;L‘Ïi ¤H hƒ}0#éä¨n4q†±êKñ]¿¬*nj¯.‰mCë}™Ò;£Õ V’QqçU±;­~öÜc*È ~>~ÏßØlXód)•t!¦r5³‚ ­YQÓ„´†öööFA¸”‘hž`/G&áL>•"5/tFº(nTiR ‚œ%´´,U5¡dÉɪY„¼„Mþ”åªA&! –!.‹¦59Gœtbnʤ¨F(†àhÊ–™ÔÄŠ0ÄdÄF°ñxMu³Ö¶ÔůÇ7n?€ýGçK?8úɪ ÜòÒtßß܇ïöLÖÇT¥ %Å$‡Fq^U™¬Ñò9 wá{G×±2ü}OÝ&»Ž±¾·uÅ•ÌßlEL’Íœ7C` ™®¶!‚Âì»Õˆ²pÿ]8à¸`×ñÃ?ÁŸž8¼¾£µµ‡ Ç°¯ÐÜÈø,&xô((Éèh¥Ì„\1õ(%OT³bø^$ÞDhš2‚œ“M%ª0W)K䤠&!+¨sÝZNHˆ|}7Îá —7àO>bz• ›.eI‰§ »VáªoœÚ…¿85I¾3šÈFþçÔãˆé¶»Tä´­»©xl* *%ƒÓT/¢ÚS"h4M›ölÅœfoÖš›‚É‹íp2 JŠA›aJlUYgA^§a”¢¹y…ÙZŠª¤‹Î̭癪]âÓÕ5þµúủ``äÑíKÙÝŸQs%iòá›ÑÁånà 1÷|#nÇÇGo“c·¯À©v }øí3­øýØà;§kð©ìÜx¦÷ž³Fž?³ñL/Ñ °•á»Û1=>¶ŽÔ—/~¦ÛHê®=Oëï–§¥§¦ßö²l¶1lH’“£V²š-ˆ’ÈõÌófßDkf¢áôF+¶F6[ l¸ËJ&„ìòöV¼ª‹³¬O ÊŠAf»eÚÅ"dþ8ÚË•l;J_Ž !,Á4ŸéqÍD…ù¹Ð)].ÕDc«2ØÇÒÅ\(äYðòc FÅ¢í/?5g:ë{d±ÌÝæJ2Ù¬Û˜¥òΰ>M[ ɺYP¤$ïëhå@>›]÷'¸‚ÇÂ`ù×|àà@¹î "å¹GN>“™Ì О%lï. \£ \>Ir–ÄÚ¤”–h·§æÕk”#ÇXIPÈíGÐÈØÔ"«,aS 2<Òîf”±„U©Bwq_1»XÈ=xÉ1–ÄÝ'Ы¤{oõ‚–ö^¤,É°l2E-aÖ=ØTiRànþwÍ‚r‚Õ¯ÉRÎg©?ЬÝÎ9'ñz] IÌRT’¥l>ËWÍ_4:`òŽÎHq€`Ò ‡M`2Ÿ„ŠÞŽ‚ S‡ú&úFÂÐT¡w·­3ku›“LcwQ¦ÖÌA#S›þY11B† LjK°…ìŒÊUS ¢šrÝLAÖl-¬·ávô”õÞ븈æöîå0kãâb$æYáà§aEù fMYjiKGu‰šqžvqüˆ-±ßöAÈ„O U­¼2–Œ]ˆšNÚ‡‰Hº*’C—OÂ5ËĘ^¬5WEUѬ~À”åÞ+* í]¥“2¿M 8ç"ØgŬ¢.à_¼°Ó°lrv§t\!sÓÐþKÐ8Q¤QgÅ f†gEy›8â’_†u~"ë…Šk…³ÀÏëE€½ˆ˜C„›Øp#®Km $]j{`³LYF9›²÷*iËŒ‰Ö¨D®25ß³]ŸÅ}TŒ”)mø¨ìX¿h^îЈ~NÔKÿ7>ê«êh¥ÝüìèWToö\ÁÍþ#~5»Ý°+E'€0h³RJ§ó\F_z-Ù9ÝN ¸ï¯B,Ï#!~­0&·Í(ì‘“¶ÈVÓëô‘AÌêØñžÚɧ\¾¡ pÒÚ=K÷”'¯g¥ÝøÒü–Ô€Msû±îJ#>ze=›WÀ×®4Þg5áÿq¥ÛçÇïdjñá¹-DpÚÕ+?3Ú ®3þÛ\ëýà>™àïæ‚5àîÙ!¸¯‹!vf"÷™§=LdqÏd¸¸¸Gÿ4Ë9°ƒŽ‰†|;댰}J7ONx­ÜyV„Ê‹´!o«ZYÔÁÝæÊšmÛ‘€Ç«$µt@¼è÷ӵƘ0ÇyÂþxòų‡Dq²P÷AfÏ7SÍZ`bÞNÕ£?Ý`Ž7â|h¤ÿ%Ý`”#áç²`p^ev±È¼˜Ï¼!ª@Ó ©‡ÂfãëŽÂT-âÌß¡‘¬5>ÐÊ^9P/<8É—Ç)@lY|AãÙÅɯYf²tJjV°zÙ­s(àw÷Ø‹˜|-Îþg²É2š¡5¾{u{‡'ŽÁãòHä‘<ÆtÉ“Ã'\5DÙÐ~o9\!‡}q6q'4<§9Õ=Ör¯7Q*Xz¶ Ú0k\Ûk9{p×TžŸx Ÿ8[÷!(è`¥LÁÏœ­¯3¿úÙjÞâ3Yd7e ~çìî~îJÿ­©æv +PìÏ~÷jÄôWAZþëɃ®;¯–³û÷Ë=QÐ…çÖYh‰û5ÜtáÙIüïÐÕ…£5HÖRkËöØ %VÌÆU7Y‘º¦‡î©»·Ýy®"åN“ßäðReW6渥@HKQfîlF°Ok²ŠÝoÅ${å,}- ªfÄ»b¤¢˜ä÷¢i…&ø…SòÖÇ Wü>Ü–­Í69·ØcÉcQg^öeÈj‚Ýäþæ4=¿È…ÖMX…—õáþ{s¢y;ìRéϬ±µøÏ÷ž³Jýò¹x=€Á©†j²8žRJJ”ŽO½î«‚ Þ¹\‹ï}tÐ~IÑð€ƒÒö%öcçö$Ë›¹„Êb#²‚6g7+À¿AOO¯uÆ´±ÚÝozK‘ jõv A/k;? íϨø•s;7›¤æž€ÿzŽuêKÈÅ·&wàæó[qÇùGø¥÷a6»œÑ^š‡|xç‰mø†rÀó¾¦{Å{p'ˆ©$Í»úœÒº\ØWz÷‰£>ìÕúödØ=†u¬æïÞ™zÞ÷ðxUkÆ¿Ö¦½ÊýAkô­g¯×0’þ†òõüÝ!$8óì7“È2ÅH þéDQ¼“ߺÛqüòW/ø£üö›l>˜+lc>p|P–°d;}—”¼ñ‰Âo}ëRq>í3Ø«(r]QäW*üE=èE)ÁîãRmš¦©Gh"‘QØ]šÞnûÚörYÈ4ƒhÖT2Ù&ýRTÖÕÆ߃â¶Û­ÍåI3uy(+WâÀÕ¹²[î\=]þòÞÕžóçæÙ°ÅþÍ„] åÛw‰Ø~íÀY^ЉõÆÁ¦tYBõ&f„vš´ÞhäåJ™øÏ·ÂO^Ëm%TLBVJ¨ä‰„"'5­ÒÄ“}xþzûFkÌ~ÝWúÍõ7÷Ë:?²ÁÎ×Û¶¦E:ëX£üw44ºíA×kh2jb|rÿëåÇÖt·G'à|®¢yM‡TEÑñà+»ðÅáÝøó¿ â¥çö䜷¼½®/ãvu»²Ð’Öü¢Ý~9v]‹ØÕxù™×ñ{Ï {î^L}#ѱø^»9„ïÜüÄꈽ¸íþ ïn EÓb’]øaó§ŒU/ߌME]«ðâ ¯¯zõ–`ÿÈXÿiÏú;/Þ\ƒò±¾¸[ù%~™ô¿·n­A!¾ÆͱtìÓ~ŸõÓ¦Ò‰—þÊ÷°7áxNA0„Ï·PmÃÿ~¥“/ÕâåWÃU±Y¼ùêÉõ1ö‹ƒ×žÝ³)fÿâ`×ËÛ¾XÙË¡»óÝÂÉb‰É‹rN¿¾ø¥Û5¥â«_ðùWQBÕ®Âèëýð¦{iæs3¾ÿpQK퉒Gxœ»¦µVsÃîÍì<&Œì~©å~ù)©“›x¯oîç;Χ .ìÁxœL³ÿÛÛ[’ÑêKÈÂêÍtCÛcõ“ñÜdo‘o–\FÞ²†t!›qîw©W‚ƒùÙC“.æ }ÉGôs¥oÜYñ©g«ó>§×Õ'-gŠÑxœ{È6—mƒ,3 È[æÀTxœ6Éÿ¨¨bÚáêÎÅ#@P[à„f]íA–Ä‘vX‡Hëª} D[¢ù¼…RfÝÍ‘âFµ0¯æÜ xœ{˜Þá¹áëfO6+ñÍ…ÚÏ7»èÍeq€êà´ xœûÿˆñÿ#Æ ÇXM7gÝ‘ Lªä³|xœd›ÿÊ€:ð ²ðó¸WÇ-Ûߟ%ºy‘é±NŠ?422.cŽ&×oÍB2ß ë»å9 ^áˆ100644 mcp3422.h‹N5 ç(åR¿ÏŠÂ‹¢Q¯0³aé<¢(VêÅ8xœëÒŸ¥·á8Ûä‹l›³-bݼç1ëæóB»Yœ1 wå‚Â|xœePMKQ%0œ?­T.d¢£Fa µ‘„vBJÐ"Ðyoœ Ã{Ãøf´kõÖ-[¸ ×ý“öùÚö¦4£v÷|Ü{÷®øšÏÔ+TÀ³ì£ÃÖÁC’½n'_ZíÄ–QBf¹¡°½tȧDþFï;–>À pBÀrЃ%zÈíS ¶M-!u§0ÂA?†œ ݪÊÕÑúë‰Ã—ÀˆñCÊÀÁ±‘£¦`B ã°c@æ"^0M3>sΫÑÝ?y÷¦ÈÆ@pŒbè^ø(¨i>¦/å½–•…ÍS¹Ðò}³˜¡Øƒ¶^¯Ã—I5 84ä•^hü£›†¡¯n÷ðl¿ó-–'´vb9ÓKsÐÜ cÍÍgzó7–Æ ¹zi?µ£­Þ)oSo?‚~–ÝŒ‹L˜ƒ²MTÇ8Ú§"ð4º6> A¬í]Zxœ•”KoÓ@€Tª‚@•Â†"¡¤´‰íô¥¾¤’ªD”Š§jcoœî:ò:}ªü„,'ü®Hüþ3k;qÒµ‘6Ú™Ç7ãýSúYš«-™°'n¯¾ê8_æ`þM£I[xí4`ÿ ñëðï­daæÉ@Åžqµ»g>Ò ú‡Ž+ã`\¥.TM„î¤:²^S=AËã§tZ8>‘~SŒ;åZD©6Ç3àjwÑ4ͬ†‹}É‚Ðoqæm¡Â  0p»LJ@' O îrÀôÂåÉýÛïïaEC¿ä‘ñr@Æó£ ЗJø’{äÊŽð—¡má²q9¸ê°†ã”}»`¡Æ¬Õà­ä+ªbðÐãËGÂ÷y½ ¯4BˆyPU51JºŸ§ç›|‚r'ÏfÖvv`­B‰ÁVö<3 PéL(íŠæI~Ï>¤áHu&b·;æ_1òˆô‹9ZQÑÈÁ‡ìµŽëÇk[†Aæö&´E¬´`vegÃJÓÒ¯m!?}µä›Qº“éìä³¹à…: ƒTÈ;X.cP¯P…öº.±m“°Iû¶3Jqö!-ð*¶­¡5õújQÏv‘ê*ï$bÛñØ×ãY·†<«Óxì)]Ìî~+ùa<¸>]Ú@ë¼~X¹1¦³jåÛ™†Iq3ùj<¾9õ:€K"ŒxÜdæ½m^Ž†=ÿ#<ïéao cÌqÜ%?6¹K4ë@7:a¤‡/ó¥à~ ± Lšž¯°3Ëz¶…ãî{^Ä•Jåì=É$¥g¨…¹SÙgB&w¿r³l‹³«»W]pas V8cÃ÷ ÏŠÏ]š"k–¥õ?”ï삧&xœ[Ày•‹__‹KAK!7¹ÀØÄÈH/y"¿œ˜¯sˆ£àiä¬àè⬜‘YÀ¥0ù"³ÃÄ ìwÇ2ק¤¦eæ¥rBÆÅÇ››rp)cÊšrb73à4Â&ndbÀiÌ…!ãîèéo±ÂSÆ‹%` ,¶€%,€¶Le1 „ú=8µ¤´@A#3¯D¡ 3Ï)±8UGÄÉ4JvLI)J-.†ð“3óòRs ¼âÄÜ‚œÔ Ä¨êôÄ̼Éõ,ŠñWcså‹Yxœ5ÊÿÛÛ°ÁÂÄyöZj7UbÒPMŽR"Ó.˜çmi;n~Ïiˆº•ZJ¢àá›5³æÍxœ6Éÿ¨¨bÚáêÎÅ#@P[à„f]íA–Ä‘vXPD™v÷á —þFHßÍhb‘âF±â;àÀ,xœûÿˆñÿ#Æ ÇXM6gÝ‘ L¤á‹ xœkàkàÛpšUdÞœóbÊ|—ؤ—ur¸Ï}mfîÀsoó}VEFÓN Jà€û6xœ{iøÒpÃ"ÁÉ6üÜ›× Ú°?55à€rxœ»Ít›i+£ˆ|jáõv~æØÇBߌ’&M¹6Ëa²$£ÂU ÿæÎ^xœ6Éÿ¨¨bÚáêÎÅ#@P[à„f]íA–Ä‘vXG$«0£â4Ó—×ÿŽ‘Q•îy‘âFÄ àÂxœûÿˆñÿ#Æ ÇX7gÝ‘ Lžãì xœƒ|ÿÛÛ[‹è¶ÒåÁ‹LtCfÌ:r[5>>‘o3Ž»9Ö0›ÖçC¯þci+¬p쑶03B«[ÉÇ?,¬Mµš£Ám¼E 40000 gpio±†íäûÇÅ bíwùs°8‚á“. }]ÚäU7xÆ$Ï; õtÚ|@C‚;=gŠáxœ{ÈvŸuÃ}&‘]ºixœ­TÛnÔ0}ÏWÌn+µEMBûª¸´€V¢¢U< T9ÉlbÖ±ƒ/ÝÿÎØI6énU!Á“/ã93sæŒfiÆeš1SE?Ïc.eBŸD¿"Ì+óg°æšËò†ƒD, Ø aq~ WxB55J y¦×h ‡ ‡d¾Åw‹%8CFòÎ8“égf¿9õ°lÛ í¸\Õ5“Å‹ÑÀ¸Bkl\¢à™O½ÀûñiÀÒNB’fŽ‹Xɸ|:!&¹i*Eº ÜXÍ3g¹rk•#*(bÅî)I5b¬•^r*µ&Ã6µ}¦:¢4'¢–J{H=˜ÖX¬8þ¢´n!†JYXIÂé‚ ¯±»°•re5;Ù©jÃ-œE¿£(¯0_Å5[a¬V}Kù¾Áá+˜]Àsøþ2F×S€aMŽðžqE’$SË@f~¨±FcXI5QÃ`É7´¶Ðh• ¬MD1z¤ŒõüëòÕé1ðÛt°XSLè#V"Ö3µ.ÐÒ ãϾ%9“}3F¡Pì˜[óºÐªT2‘hçûevLeìéŠ7›Ã3¸€ù&§dä|BQð¼ô·$–þLK^lǃNžl®)IÒ²áêq nXM5›G­Šù8Ù‹j/§[9ŽÜ˜WWè×arE];ßË8ŒT¿° òáfñ n©sÜc]û%P¶ÈÛ0&×¼±¤é¾ékÆ-©lÀeP—?AúíAFƒšg/!uF§\æ˜ ?Áiÿ)$ÕO~¹®ó¥ÆâŸÞtgêÌ™;¬¸ËZ‹OâNÆéΞŽòÏñþét¦<ž¿óæï›ù¿‚¼ë•=ØÑúV"žšàßÐÐ_)‰Iô[ê„,xœ›ÅÛÏ;An¢¼3GjrF¾‚’×Äë‰+´4 Ü’ŒÔ<…¢Ò<=ý¤ÒÌœ…ÄôÄÌ<=%.¸ò¿.“Ý&w2:ÀØ|™ñ8 ¤¨áUxœmP=OÃ@ U•€èUl°›´c{…JLUÅg&`Bˆ^§±¸&UrebCl ÷SX˜ø üœ4T€êÁïìçw~Ù|k4š;]Ÿ’®¯òøõ³¶W³Žó\Ç9‘Ö:[ËZpÄ)xvänƒ·,«Ì³Onû°Y—R‚JB ¨“§m01& f&(CÒú&ê Îz'£žb–»(‚kûîvì—Û\”Ð:€ìÂM¿$â¦ÂŒÊÆhÔ *`!ëxF:¤d ÷”q¸ NLüohò3•æÒ+§Qçø——EŠ«ßÄ—Ì°ä\EůZC’ð|–a*r¾béªÓÙÛµá´{l}}ß6ø»#Ç-òsÑ,›ªÞp®&S¹ÇH‚”]¬Š#þàB”såÔ 9M”â+î‘ à?xœÛÆý‡kCcdrŠByfQf^z@&—‚BjrF¾‚nž‚LÌJAA‰ÓZ!71;U!9'51¨¨EOO?%µÌ'3 Y X¨¬gr£´8\.½ 3,‘›Á(_—s­HÌ-ÈI-Æa—{jQIR~bQ ²]pA+\î ÈtKLNEÖ»o£¥ Aß+)XO.d’QÀë]¨"9}/‘• | RbÈ$1y"“ÿdF& FŸÉRLz“°°L6b5‰ÈËLN-VšY”XT©„Гõ™$áê™X·“ëùxœK´ÿÝñ^ñárQŸQjã,ô‡Ý„9I^˜Ì¾±rÞ.cÀXU~@º™ÓÂ7|`•šîùùÈ“‘L“100755³>PU æÛdxœ6Éÿ¨¨bÀ¥¾<ìèü×'N4@œ2‘vXç œƒ"«Ô̘ëJ´ %:Р‘âFzWá÷xœA¾ÿág;°F“\D³Io7: * MCP23008 “ñ *“Ç „³Ÿm³ `“q+Ö“q,’ ³=.¤©­õä š xœkà;È3ÁJ¤ï\«ù¤[j¿Ýá] Zó0/®¨:p¢ßœÍñŒÂL–ç曉OŠÛ}¦æüââØŸ±÷yØú ÌLL ’Ó,LÍMô2lÖê^Ñ3Öã-ád/ý[ziË æ§›¿2¯c´ái•˜ÆµgE÷wöã‚«{›—O ¯‚ê.Ï,ÊÌKÈô4rÖKf¸\°}•áš˜ó×X_{®h¨©þýoó}VEF¯DÕå~‰±xœ•UÍoEW$ƒ½—Ô–¢T╲nš¤=QŠp%”¶V’ªÕxwv=Êzf53¶cU•O\à8ˆŽ©Îü'\8‚‚;ofcÇNÓ6]É’ý>~û{¿÷áæÿ yR*ßþb7àºý¾4?sã鯥¿g†×®ÁåYW1èȘiBÞY 4·n4öÛA¸|ëÖrmÊÑؾsowÏ{Vj„„ésÅEÚäwfרnd>As°×æ8R¼Å4Ð8æ†KA34öø0b Ü{ 0mìÀ0³x ç0V—@GmÖa  C‡^tŽ-óB‚æ“% 8Ñ£Z W=R@SÊEÝÓÚTD¨¢ ³ŽD š`eÅ—ˆnh1¤ìjGzcÊÑÙwê %ôÛÒaì#e½ˆ!ÚKx‚ªäTË€{r.V©fpsÚv‡ iÂæŸ$†›vÊaÎYÄ“!0ª+4Orsá15t©ì•‘',¿,`åe×}Àæ(Cz’ÇÈ2\p ÅÚ˜xø\1`ÁMOìï•óŸMB`£ïçëbM £dV;%Äp¬X¸ó”ší0×NÉÂå"ùšoǘË!ÐÅMQÓó®C*¾ôhÖe“ v†œžšÎ3 ã)®¡L*|•‡S5HG%žé;}Q&ž zŒûÓë?Þ߆)|5!în(á±F‰£»:c‚#—Õ!ÂU6nk,t˜Ö4E&¸oþÕ8¯k¸Áv»|ió$Æ6Ö÷›VⱨFt;M.4‚Ú‡åï®´Ú)âÄòï9äêÅ;œuôÛ3ä¢ý³röBaŸ`t¼;ç;71˜öLp¹:9_ö,ù˜äýŽÿá1C+Ékä¨Ó¶¼7;Ñ.û]éN°htx¤Á¤påŠEx-ãÖ2oÿ+ÏÙoÊï؃ÊÆ&ÝWW%U1ìP·˜Â#Úä€òÆ}wçF`ØÓn’ØRåË­‰FAŽÊ P{r3çr´ë^ÍÂáÔšK3Ó¤ñºâ=WÛmR¯¤Ì42D²$øà­I!V¾þŸƒKU”c—™Beû„\ž- ;T¤ÌþV}ÛþCÎZØÖ2í«xk©ŽSI‘±Æ,ý‚ý+¨Üu2ú‘TÝÜø?…°‘áu?I’ÚÔÌBŸr³!Õ8Û ÄW³ß–ûÇì {®ZÇÏ›v»º8WL±JqdöôëêÅ™ÿt%‘#à“(xœ{iøÜpÃ"ÁÉ6üÊ› *±?ÝKå•cxœ5ÊÿÛÛ°#ï ªîVKnNRÖêN§¯~"õ“.ð¥IC·wÃk rŠý.Q;æægxœ6Éÿ¨¨bÀ¥¾<ìèü×'N4@œ2‘vXŽ®qi3?1(ÐQÜ„%Xøo‘âFWVÈàjÚxœ­•MlEǵ$ŽM?¨ŠR׎í×u?l%ñ* ÆvÒÄ›¤ v²µJÒj½»¶W^ï:ëu¶’BEâBzRÅ©GD+ÔhAª@‚$.H¸TÀG˜];¥¤Sæ23;ÿ÷{3óÞ¼ýëGê«©77·;öáþ4~Û,TTC‰Õ&i:,«‚Ò%Ș².«UN&Ÿñ Ë‹E—æb’±du]ƒuÈè/ÆM]6¤¸YŽ7ÍF\P4¡oh¢4‰/Láî'ܶŠWÜv{qÎ}´b±˜3Ùp'ðK÷ç–åYñP’å9²Õg½uì ¹ã>ï0ÓùKg™nÿ”Ý?GƒÛ¾E<8€8Žþ®ûgœñ'þ0¦ÒYœñãó#cxsä ^j"‡"oÔ$œk ÊmÌšuU3[dÄ Ùë-àu ÚM04{‹ç‚QË z†¬ŸÇ=CØW àÛç|NÝÅ&Ç;²ï§ Öýôyª W 1›rnÈfa•[¸ZXfg¯r K¥(œ>MV›² HDáúup&“YXZ)t%Ñ( ¤é’ÑÖUëTöÆ¥ãíÜ=·PãUURðÝùgð.›¥6ñ7véH‰[(i"QÛÝx© /W%Ý(k¼.N«¼¢UWí¸@Äúiv›zˆ“ÛÓúð.ë" DzfÑ(¤é-ÚzïÂ"µ¼¯g…4úÏø¬C‹IÊú"ç±ÈÚ¾8è8Nš$ ‚ck*ƒ_{±½|Ñê§ö;dï—^Ýg$¾–?a­¬\sá½õ þ~¹àôÏ®]ÆÌ•SÖ7k5ÊÊ\ùÃ…(^g0)>¿H‡¬ïij^’ü8Z9´w´óŠ˜Ï7eퟸsòI|éI;³CƒóÜÂ2Ø?îe÷ŽU%ü°âÃÛÕüè#0NžãiNÓm*§kÕ=É]Ù.l7j)ß#È= ž nÄ}=Æaü¬6Êr«ÐtàH®²º¼)Ö”tÞ5µE÷2©ÿŠÇÜtnv'Kð–È’Ú5^æÆñžˆv@Ô8³á˜B„¸éZÎLçÉSìånÒ°Õ#dlB£EÿO(”þ0Bºm¾ PäUƒ¼Ú {ˆrvÙ} í«pT‰xѹ![Ú¢iRs5I¨C…Ü_÷~AÐ ^[øCù¤§Wµ< eh{€MÄ×ë‹ýÎàû:K›åîfÈt²ÉbPè®QXÚù0]›&KÛ©ÕCœ¯GPž ax#…·ØÁÊAÂ)3³?4ì†Ixœ;³—ñÈ^Æ B¢œ¦J: JŽ>!&“¹E7»ˆvxˆMxå)xœ;²—ñð^Æ ™¬ŒF›³X›¸6¿å¿îcÚ×ëö!xœ…WMl×­?“òY?±liDYiSü·lÉ’lš’l¥H”Çb”÷‘\‡Ü%v—¢„4[AQ MÚ¹ô”¶h{kƒ¼ôRÄ@ R0P ·þ é©HÑEÐKwÞÛ%iÉvBb¹Üy3óæ÷{³ÿÆñð3ÇûÛmãá`(ò`û¿-mYs·Ìp³5µ:ñƒÖácצdú ³.׈¢f‹™ÁtUÑ5¿¢p2þ©µß×\*+ R–íçw³“©†¢©†¿àÆ/ZË~§;ì†Ý®™å•9áøÜ|j>žrºC[ŠPÂY™™,k⽶ÁoŒ‡2pw|ڦʒ.•Œ øý~|Ø6Œcí§ÐÕ>Ð?­3ITuÅdIü—Äþ«ívwœ<ÊiR±ЙÁL<ÞÑf{·¸ÿ´=ØUÍ)Üu¦KšÌfÅÂÚ{ŒÔ´ª¶×ñ÷βÜzœrÁyçjE³À ÁY­T’TªŠYKº’/˜ WTf@NÓ‰¦°¢€Î¶ò ¿ ï_;æl(FÇõSøQе§é&Ì@Y¹®Iº¼Ê¶Áã…™ÁUÂݯ¸²Iolz7¾œdÃÔ+d O¦ø¹^É”xÕÓÈÎÙ,^˜† —¸Þ¢ w/eK~Ö;<Žè̬èªØím|ïDŸËM|›2Ûv{1æOŠœ§=àM¦«¬ÚJ‘y /PŠ@ÕL(j’Ìd?Æzpf­c]hâ6eª7“ µ·ó{Ô€ñ]•Ý>xÊî2…È+,ní&+5¤,gð÷~ø’ë(e é90VÛèþܱGAµ¬¤´•Â®w'¢˜qq÷C!„ÂtEèºH×]—}&\ò9€ Uâ%ââ‹>'}8ù2‘'‰Ž;›¤;© G|GˆCQ.¸GCÁºdè"Ñ'ê £B)ÀD]ê’ßòÕæ'è{Þ—s‡iHÈõBë;]g„ýþ襯c¯sGÉ”‰^é¹ÕF…9*ãÕ¾³Iöà/zδòH⣞yüNàÙÞ‘~.× |°U1år”e›áÞWñ‡½‘®§3@˜ÁOzßÒù¾'ø£þ±j¨=ê?ܹ—Î)¢óeEÞͤƒ×ãÄ´¤˜¢ñªÉt½R6ASA‚<‰«œÓϹ֊¢M³F­Q`T¡ã ˜c0ÉPu­RÖ¬ˆìBÅ Â^[¥®‚§ZPö²ÈÒŠÑ°¸ hDû×M1†½üY…*C)•IQd¬ìÞ¸l§ÌÛ‹ ˜ŽV\ia;Š­F×ò~~+ Â<šãn{¶5Eík z‚Ô¼¥8dâdƒË‘vŸ° ÿ=8ÙB¢Šâ·F{ðÄñÁ ‘ 5œNà¤æÝ^àCz87¡Q"™ÚœŸ»1¿¹šXK$oà‰ð)|£Ý'drKèù2 ±Åŧ„¼BhK3 |›mt}9u?÷z„™]ÑAœ8®CÒóÛp7‚¡ÙQÞúõŠ§ÅC!·¼#`#!‘¼ô0몴UdvŠ*ežÉ)56T‚Km(ƒO:}ƒ¼fpÞvÕ>éî<&Ð÷_´ ²þr-‰eü^\n|03†?ðMºLkÙÖ„Ÿ]íî¶3lE‚Vìäã G­eþ¾£öé¶u‚ÞdÅ2þs}ß]L†éyOZŽÀÐ øQ¤âTsBг% z½!¨OÇWñ~òÔ!Âú`ò<—¾Ít>•Á9HKº.©æîWIßnJGñ¯‹÷¬9´¶¸ô]‡õ—Fk_&·apý2þeÍR'É3äïߨm¯Gxòø>¼Ýß[ïyQ7xi>º‚o¤ïw†x'WJL5]KxÇCuL²g€}Òâä±¥s-+7ïà“;½øçôR·5ßÚ%m<{gªkŸ Ç_¦_ÆÿÝyù ­õý9Îð9‡ú•Â¬²jsœå™ßyÆ2AÏRµG°8;BêJŠÁá¸)le,§d%“ž¬*™>¼7ÿj"E8›X\_·Üš©,½Ã²6ßPaç'˜©_8ãõò“v…_hUèÔ$(,1ÃòÌ°çë€9¸Ýq±*S¡'ûÓ#Ñp†W»ØAÉØ6 Çg ©¯é7͸¯»T­1ÙŠÓš¼<ë!Ióñ@£C»žÈUÔ,Œ]LJ¨\Úœü@pÓÎ^¼ðº¿qÚÉ{Ò¢ü|ãV ¿ÿgcÎY®–8‘žÞËÌõ[Ðà†ú‘Vü s±O²5<µÈ)èÈœìâ& ”O*Y…¢ÆëpÚêÞ§µÙíÎq™ûne‚»ÅåÉ5;Í–|üZëØ–TÜ·çJµ´ÄÏLR±’^Ú\Zž£C3¶ˆ'2爿c¾Žyióž&Çuáù~öUIÍ3üq&²Ïaˆµì›‚AÖ)Kî ’<ÇÉœÁi¿‡¹77¦Ï4¦qw“½ùô“LXpÜqǘx£;°¥ujÖc**œô¶Gfz;ÉÌuf¹Õv¢ÿ˜™ë£ÙÀ ¶âóÒ7S=ø«L~áBýõÉ‘ç•€ý.£ÁÿízŸpà£Gxœ ßÿÁ Á °^ÞÐ{¦yz1S1n™˜³±›,ý¯“rÏꦪèš2xœ›!s\jƒ Ëäh»ÉX&û²J2L6d²¤-l”ôSRËô‹ 2”ž¡’‚5WqIbIf²Bif^‰E|‰å}óSR,[ ’ÉkXeÔl Tå†fõ@å.©9‰•`囿°ª±2énÎææcäQ(J-)-ÊSÐ5T°žìÀ#Åä29†GUÜžGnò7 ÅÚA.ñNž!Áñ®AñáþA.: j@»œÂ5l 4Ñ ‘ŸÜË+ÕÆn^Y9dq..7-È­åZ¸W»î(€]xœ;.µDfƒ ‹djQQ^¾^†—rf^rNiJª‚MqIQf^úd5f½ ¥Éq,%õÉùyÅ% Å%‰%™É ɉE  U\é’Zf  `« ¤Ÿ’Z¦RzJ Ö\´bj3ÄÐVš™Wâj_ÖTæ›t#PŸ6…HêœÂ@ê,àê&W°Ê°€4nžÁªÆXž òf@¦[bfNiQª‚Fx€g¼£¯pˆŽ‚Rh^bRNªBI¾B~AjžBp€§ЙɩV ªÅ1yJ:@k‹€—_¤ CMÍ͸ø¸@ö¥–”å)à·d&Ø7Ήyé© iU¸-úDAa²ei–€‚‚X;&Ëò(L>Á£K‚ùÁ©©)¤ø‚ nxZ [Ë}ÿÍ~«xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQééâèãÃЕkñäᙪ˅µ›ë_^9j6kTI@j~AN*C÷‹m—žìö)qN;cUÍÆbjgUäêèâëªÂÀ®méKÕönݾÇÏõeˆf,ª275UH*ÍÌIa8½qÉ_ÃÓyº&¾Ês®êì>"wÄÝÄR+s3$ÏûËöç“Øï_¯ ¯7…ÿ?ñâЇ(I/ÈÌgØüÛ$¹UãÝÆÜÍ”çÒ‚“ÙA¤Ë3‹2óÒ2Æi9œ·¿à•óRr¹˜X²´ñÓPîo‡ª8xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Êpïo ÷¶ùYÉ®Bs2/oN¤«ùëTMfq‘n~q2ÐÆEï¬önû·cîÝ’ ë,çø¿¡¨@û}ÈzáeÜS׶ÿþ“~iš¸ÒkÆ<¨‚œd›T&ÖwÖæ%vŸSÀÔÀãÑ£ U—Z T`8¡¯‹ï÷Óÿ|"Ó ™gÕ\9{Ëú"TA~¶O*ÈŒÙVâ<‹xÖÝYSðé’®²À®ó§a¡X™–˜œ TÃÏ0ÇfŽéøIz?÷œP8P{rS.LMy.PÁÁ?ÆâÇg ½ûµÁ³÷¤éß©‡¦ÇM‚*(N-ÊLÌ † Pݼ‡R‡&LîÙ¾p!CvŠá¼lù­_–£¨ƒÆoîÒ=¥:æñ)Wjý¿èÕ¯ ×ueù@%«¤6¹jZ ©zíûÆaõ3œI–ŒŠ RÁ^k3§º÷hü­h~}±K/.Š5‚*)ÚcJ¥…òb;n΋džÎÁcicï7ýÙ^$%F@%¬_vs~á|u?éò»Ùßä}yS’Ÿ ¾.÷Q-z&¨s/óµ(s}òÉ ª¢<-¨ {[§úÛ+Ö·VÝý3c~ã–Yìd<²®xœâí‰PNG  IHDRðÜ/sRGB®Îé0PLTEøüøüø¼¸øü¸¼øø¸¸ü¼x|xø øøìx‹ pHYs  ÒÝ~ütIMEÜ !2qã~8IDATxÚíMŽä¨€=šUäz«zwè–Wý$£—sŽZåf;»·”ò­ºÈj•2Kq—D€Æ?Uíì—ÎÌJg |D„Ã7ð‹lÍs´$ËlÐe¶þÇ·ÌÏ™ít;'6øžÙ^²•r•S '€×Óë3è0`\ícœ™7éaè‡NíõC0¨7ßþüñ @=õüp &ß“*ô€¹¨ªŸ/· Àí 7ð–áRýÖTͽ,„DUŒ8á’KbXÌ ˆyâ»bžzïÏÄ<ÍÞ¢ëO —è/^Þ¾CDW k…âÀÊ ¯¢`D D‰ÄÈ¡ë ˆ– d¦ #b' ¢+o@.·›~· J*/oz¾¿¼¡„—«Ç°“ 0‚0 âTŒÙjWüø–99ƒ¢.(£ZªÒoøÐ{ßá Áœ$¨V¨ìb” A¬ J–iõ!ÑvaAÀ1 dA ò#ˆ¶õQï aÀ•½p ÕÒ²² '9¥$ð^Q¶ƒ|G€F}£ÒY‰#ÎÙˆëµ|‰%²Ÿ¤$òÝW.y3Ýo Z^_Tñ{­ñ{÷Z>HÐkM@ q½VrBÝ}M#V2û#Ôõj;ãˆê®Œ‘¿Á ~ÔÆ®«¤+oÆeú…šN"¿ÆÈþËøZ¿Èk(tÓW£"š¾× 7\ë'ÐØÑ&ús§L¥[Yô -Ãíã¦û[´ðïo/Úhp“T  É~U¥TeM=Hû«öiŒYaå5 ¡©qÐTÛUÞØûz…qÑ/»o¾Ô•7û`q5›WÝayú/¤@ Ä°ˆò‚G-Ñý¯ú‹#¢ê£¸¿3 1=/©V‚=0‡²äl¼FíÐà”ŽþkH8Œ ÜT§D¢D¬²y ½­<©™êõø'@¸o óŠ÷Q p¾)‰ÜôÎ(UõùŽcŠaö¸BSpg¼³ <ÒA²V fL4 pv1¾¢U-+Q"ú/G… %2k##Zd#BÃc++ðmÄ™{ ZÀab#3½–&¢^.ìµ4‘6„Œý6ö^“^K½62éµøì8ÂЋ7ÌÁ8¢aÆ“~5È]^ âÆ‘7ë[êµ€z­ïÓq„ñ‡‹rP¶:yÓzFaÍMÔ.iþ®ÜþSžÿ)¦l>ý½uûkH»|û£üï5YN²XrHµËA>äºäºÂþn3͹l9æÇ}%ò¡ª~xß³jaD”½@® wï&ì>$!ˆ­¸~·¯»áÜEné¨{ Hácë>ÞʉÅƾä@‘¾0{œk# ÷c#<4öQ"&¦°E"Ükq^À£¨4ˆù{‘…Î;ùG¼HÐûìFv#&Y4ŽHnOPs~'â{ì«Z¿Œ¯õpãnü;©Vãmí=«–®c¢PD¨=ý ‚Súý𤃂ªoÞÒ¶€Vó´F|ý…hD‚T>?¹ý[9¥¸.É6ó4 †@ÔWb4T³æŒ]ˆ©;ÚÆXm¡ ©z?asª%¡¶¡ymC3¨²„ Œ îsãéäƒÊú…¢+u[¼„MAh‘˜L)70%ž {-™ÿ(—„ÌCß•P’ îâ‹Z^gÂ¥†–P+䄃]-¼^KÚ¸ MèL|Ì{>e#iQ´gcn²øÑ!A\ Ì\ˆ.½qÄÎ7x~@”ýU‹çmK%Âk¬nóÈ.‹=NA—de§UPB °Ÿ¯%¡¶~|e€UKfUë瀰âøèå<ü­ä¹Ãðx(g¹‘í ¡Ò4%T6´„ZmåH°Š×vÿ‹@µXÁ¦Å ºò½YQÜò+¸Õ¤üÅešT„§¶¡ymýªAd$zèÅŠdèÀ[„© 2Ûy.aP©­b>éBÁê\¤p¸ñ<þ­Ì¸ñ¼xïÕ|ÒwD Vç *zÚ¬¹†æP©­0«ã„ þŠk`µ«IFjA ¶~ëA´Dú!/× Ôðd¯UeA± c26Bª5ä@:X’i?¹!¡¬ÒÇ C6bÿ1‘<}©étÀe)ûªŒ¹e¢yQA=.Þ8bÈp5©™^KÊW-^jh1#^%‘-#»¬rz$놑œJûùZ*ë—jÔtCójØ„ ðTKë,~:Ÿp1·d4Ïþ—'êÆRÆÎv©ÓYkõ¿æÈ’Soñ\µ-÷T‹•CÌYX Íeô':Œ“jD0¹¦1«þ^çú•Z¾„¦ ˜³íÑtYˆNQ7<š«¶µݱÏ3 mîò=º´u”ˆ^ö0só'¿…—¸Šd8N&.qeÉX/”â.qÅËt¡ñµˆôŒ¦£XUC'é6&·m¬ê«ª‚ÌÜøÆÌoýI5ŽE4ÞÌl+‘wqûJY²Ù¯œD3³” ¯[Ð×óZÕâó |Òk‰2ˆ˜s«æ}ç+ÐE¡f 2vb»,܀ġªª†®9¢Xv|™™öZ¢ 6ñ8"Óq³Ä´7ž§Ñ¼\ðÏÏœ§ù4M8ŽK%¸W<œ ˜ŒªõïòÁª¨Î2+£M“jª:UGÝÛ‚I›|-Vb㵪Ï È\ôÖ XWôxëIóXµÂ,‡|›_˜ˆB¿äJA#:¾œœþšïŠG¢îcìfŒ¿ŒYeöËŒ¥aý&¢bQÂ>×УÂta–ùX>%üºÁØåX=Zý:*ÅeÇ­jaª!®Ÿ˜divc–kâ~Ù]?|]äÆg@¨…õ­lÒñJõ?ßeŽ„gº ›Õ×En|d,ÌíeNgŽ"³{™S©£ò ]ºmdôï…n|2æ6f¦ëçÙl4^’j&I WjXÅÜðßW¿‹ãɳ!H½ŸŠöëh}ܳ¦ç. ½#†tCÓÇÞ °¥…Ìâ²—¹ñ)0ª×¥LSU >ð”æ7.H·Í¤ìen|áá¾Y†Åò ×’æôtHL¿cA¯%!‘%þ.â'\æÆ'BUñmúDC³„è¨2!º4ŸŠÎ/{™Ÿ‰†Ô.Ôè1æfJ½†²‹£y,PÁkØ6ÓÓvÃ>n<›*¾k%é«–j¾Û4!~M+…éS Sóïº}Üx>Õ×~‰é•“„¨A<Öüé­=l:µ3({ƒ¯•1ßLA† ݤmøŽ F)wx1Ţƴ®ùn©{Ú ®m…—e"!¶ ‰ûíÇ#nb[—¦)G4œÛ¦÷‡¯Ó”CÅÙÌ~ŸÐuñܼ'û¥ÿ\+‘¤â[daó¥ïiÓEÃÒ2¦Ÿó°÷®7v–´krT-™éIcĨ0]„}ïâh|áÉÜ;H]Ê’O]F“˲„̦Y^W»ñ<£XFtqQ&¡Î€‡ “Q†>¾B+.{µon°— ÐépçÆ«æëþ“î[”ÁšÖEÕ’×xŒËµ.ûš‰ý.uã%äïJ5tÑ•„ÙóÞCtc6ËΗkÄd•Ï p»3%wÿÚÎüýÄT}üëJ‡óÒQõ Nøû0·¤Õ`vÍÐË­QÙ|Ñ ŸÛÊ䟫IøY!7}eÂLÙËŒ]G¾¹©\¸é·Î^ZS^ºM6ÿú\™å+ûJÎbâ¯ï;ŽMßõÝ—kí ^ WÈÚ–¥[…Ã,z?ˆã{ãt ¤{ª­^z´4IuÂ\J„–oskb#ˆ@ô½â¿r˜µ_ŠÆË\pÒ‚•·z¿¯ZzælwÔUÄ-¨§]álÄ`ø6¢”ëØ ¸Äa( Uü=í’wÁIBI‚8ÿ׎#ýWò§•j”£àõZ¦ît$"šD€îpOÓí ãÇûá \3ðO›ŠýNµëÆÿÿ€<ÖßþñžUë×Y7~h‰,qãï¤Â_ht»nü7þ$RçÆ߃jU¹ñÇöµ¸ñÇGV¸ñ‡Ùnüøñ7þáÆ?Üø‡¿Ò?ä]\nüøñ7þáÆ?Üø‡ÿpã¨Z›×?Šjm^7þ(Ù¼nüá@V®˜hüÖuã&‘õëÆMµV¯˜^këºñÇGV¬È‘}ãºñR­÷Ùîý~:&H»¤9¤j‰ Ÿ*·fLyþçÓ;oÍrê_Œ‡Î·ó¹ØšM³]$ïr»|¤‰œ—N¯§Wõׂ€‚÷·Õ )íï~È’j¶A)A{-,f@Z„n<¯Aðq¹¨fÄ ´>í!ˆîwÿ wó"™5ö¤Œ½£¯¯¤µÒ_ ºŽ7_D€¹c+´‚DjÎôw ¢ÏiÕÂ|n—ÿ*q^Ô«¥wó²¡6ÐŒj¦/Nµ-@çÈð€…}Çô­—½ÐF¬PMr[§D=´œ”}hÛÐ ÊN2 &¯ÛYÜÀþ׌IEND®B`‚7uE³Õxœ­V[oÛ: ~^~у Ië\ì^Ö¥§rzYd]‘¦Šs†A±åDm’¼,öß)_’´^Ö‡9A"SäÇ”H©»ß€}ˆü ã÷qôj¿›ö”iÀèâ%¾qÕ±3s¡¿×b–༑ù4˜9‡”)E<‘®Bæó {Mö9¨H¬ú0ÌŸ ¸¹<:z{Ú{_&FIDPÀ’_ã”6¸&çÄñB¦+%fsM¿^ÏõàƒTLà†':‘ ©þ™‡Ú€CqŠã3 CX %’Ù°Éš“ê~·›*¹à¾Ñ@ÉÒH¸é*¦Ó)WjÕNE7·ÂA >%‡ŠsÐ24K¦xV2Ÿ% x ´Qbšä`(1]© –W Š3ŠÞf3kbI/n`ĵƹ<á¸|Nn>=L`pûŸãñàvòx†úf.q–ã9šˆÓH 8§XbVCòñj|qƒVƒ†£áäƒëáäöêþ®?awƒñdxñ0Œáîa|÷éþªpÏm ¿Ï{hpÃD¤7òðˆK¯‘mÀœai)îs¬ –DºzñÚp,’ÉÌ& Ê0ò†Hã€FÞÓÆ-¼\.;³$ëH5ëF9†î¾ÿ£Õm4þ‰eºÕ&²3¿-ŠÄô™  É6„Y‚;$xªHámËŒˆùÓ* [ŠÔþH]AÌpÏ5¿I´?@ý „ 8+^ÂÀuðǃ3h ÈŸ3\M\ 6ã.üëŸ|±ª›rï©|š…¨{ØÛy¥eOæ01ì«DÁ|5ô—+¤ˆ ¡¹7. `ùPÏ5\œ–3Åâÿ’½V®/P·Œþž›,…f ÎÏ¡í¶´Uøw,­¦[hcpNÇÂ0!ñ‘ƒ ×ü;uÞÑèØ9qÞ:½üÓ²))FžîIiäöjÝn½«ÓÊUÏqÏ9t k²"£:W§•«£"Ö]öz•ÊÏ…ë’EöHGaÊT‚3ôús æýÌ{ ˜Ž8O×éGÛ;©õM˘J˜ÉŒ.¤{ÏŽÀÂG-€[í­ÇÚw÷áÕB@¯×·ß]ÞëM//û?ö­)õˆgæ^mô(Ý{Yð^mðdßn׿^ ¯|-×´,s4}­÷rþOž¢ÖÝž+ŒŸzð~顼…1°­½Ð§»ØLR{’ö|Ð1³W)tÀ¯òöÀëto©o6­b9Ûâ%Âz9U¨-¢\ óvŠ„oÊ4¦ß±¢à¿±¸‘–ÞjýŸvÈN/¾ð:˜.ã#ˆïZxœMQANÂ@]ȆÆ×/šV Z PpãÊ!‘DeAÚ©L‚3dfÐ(!õÀ3xãü-4˜´ÓþÿÞÿï½öóäç8»8·p#kÅz­N˜6)ÌœAËÔL‹LV .ðÆÏcžSÇ‹Ù»Æ :ž(W4'°$R€&b)‹ ÕL"á:&•=zÿ•ÐõýÕë\Ä‹UÂ0dJ Ùš_Y‡–6¹àVTì‡ÒNN°ê K¹`ÕñÍm5°,.ÌÞÇcoŠÖè\vµ¼„Ñ…Óõý²·ÙÞXÅ¡œ¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê°Àyšb¿Ñ±š…Âò÷v'_=µ9X1 ª&½ 3_ÏáMjଠ,[¶œÞxºú[ F˜òQdÉ Ïåœõ ¹äÿ<ê>MñON¤GeœP…¹©©BIjq‰^qÃòC»•R[E®yÝóÙ ;qºÃÅ£K!§FÞ®Exœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“ÊplIhä†l{ŸWuožlîðÙþçTM«£‹¯+Ãñé!]Âuæl_)ÆÉÚÞÇÖ®ùª"=µ¨$)?±(E/™aEe¬ÑÊW\~¯¦+-øyMx£ßÔR e 3þÊUÎö¼µ­ÊÒèË>I©ÒÕn"Pe9É s>*ßÖXßh“·ïþ”ê¢Ã«EV}p`ARÁ°ïõöø—²^',ÃV®_˜ñþ·ÿ®l¨‚‚LÌ€¢L )Ïd;ëçuM,xäÆø"üØö€ò#pE~©Å@% EYùº¦ h0®ÿÒ°aÁ¢MuõçP”d0tÖKˆNŒkÞ®ÅõL^sã©«ÒßV…d¥&‚\¼Ásö“©ßµ~Nºuèü¯‚øàc劂PUÅùi%å¹@E[3îo‰YÊ),/Ãh¼9~û\‹…Ðe0h¬ÕœÆr´lmÛº-¢wOzDRœZT–4kîË/¿>J5±{×Wú±´^éx}j †² †JŸ¯A–³s\ðQ/ßò;Ìé¿zC0’²ü¼T a-ÉIEù·ûw?âþ¸½äü¯^þ¦èª2Žù?ó9±wR[ü™ßEo•8n‡ª*Ï,ÊÌK…ºÐÆõ‚ïùÎýñ˜{tþÎúúà…­ÎïÐUe0H»Xl×¹Jhf´¢Ki¨HEäŽÕhªÜ“An[c“¿x OGòyÅ»}û¤tÿKDSéiä T8ùŸ¬×µ¢R:Ÿ½õ¥ìó•m±(Ì`Høïv?…oÆ^7—{Gݪ„Ħ`( š8¯¥æŸNoi léã×uòÜ;Ws¡) ð*tqôl5ì²>÷rÞþËů¢_I¨èaQ˜ÁðÕlúŵAg~þfK±žÛΚk+‹¢o™‰9@#5ÞDö…¹¶û¼X_yÄê†Ilm¯ÖIl*3¤gœüþ‰ñ| ï…Ô/õÛ5-²êYQUfd¦•Ü¹}‰ºZ¥†ýîí[³LÏH^<Í‹Â †Å_"¤y¿Û=ŸqwŠí·…íË+:­S¶Gä…Hxœ$ÛÿÞµ°‡¦Šã>eËÙ㛳k7;#Óp;“›±“ué*S¿xœ]Ž1Â0 Eçæ>´{7fÄÂl·5JíÈqTq{ˆ…ÉßÒO?ÜØX– pà-'ÚHU@gØ´øûúJp²XY¾Hèæ*Ó»W`Vû4®XòÌžpáCè0©,°³¯°¡<›ÌfB¯FP"$¾·ÏJÍYÍC·¢Å@>õЖüËC8×” ’#§¦ò±QÃM4yé£é¢Ò ù`?ö˜yØ?û[áR]ZæŠÚXxœ]O½JA.rMîl?SÅÅD QOQ#¤ÞìŽÙ…c6ìîvÚ[H¸÷|Á'±ó-Ü3Ä¿aŠ™ïg~Þ»ùÕŽÈ!0'gNz=4‡©ïJQ𮊖)àÖyDC˜Œ/¡©¶‰…ã/èbm]‹ûÖ{ó„‘’1:ïìîAW²(#™©Ä9¢Cå¸Nzç[wj˜T$Ýr땳*l#P¹"j+¡Œ] VN‡É˜Rˆæ­s²|È^ž;½ÚYýóWÁ²t󩷑зÓÙ`šѦ ¢4[]LчÝÞëlŠNq›O.J¬.GD¬wËŠ–*E³ªè7A|÷0a>Áã0Š†aüt‰ñ:G;ÝÐÍÁ±8I¸Þa Èý(º¾Ã]Ãß‚I?™2ÆAŽf3?D0„é0ŠƒëùdÁtMf#дôˆƒïóžY‘Ø”j uÄÃJ¯0Û"Eëo(Z ¡lƒ¹HÐþßÕö¹@ ÁW–€=Ã^dÀ…îƒÂä?#£·Û­·â•'äÊ/jå_yoÙU~§óãIQ¥øZ¥S&¼üêùRÁ–Ïײ„ëÂ,Öºûròn/¥ÑŸ lKÁé1%ÇOŒíüñá×Ï®cž¸pÙ2®m÷``ª ¾L Ft|+kgÒATÚ†·#ÿª )IMKŠjˆ+aµ@[¡IÆÖkûѶ¥?Kj§†(1u™ä§‚f:[žeM°Í[߶X%c’ª·“æ¥HÇ„ö^rN½NäÊíüÓK'è9æ{ÏÅG†K¨Cݒݱ©dà¼ïÖë† çòÒů12p uc!烨}8;wá Þ¹Z¨çòbÄgp *ÀWƒ,©®$‡p>™àâ×VУ¨Ö’|±mÛv¡Õ2AUqØâð=—7EÛùc…J…éGTëÌ-IòŨÙ*ª*ëÓJøÿÉdÈ>* œF‰¾•O œÅMS´É4½P WÖ>^èÆÐAjyLr"qà¬×†“¶/ÀJ|:€õ­U¬yù=¾ xœ‹û‡›ÑbaÃI0ÝTÎJŒ×¸ùí:Ùèr8r¢Ì|Â9OL3‚GM=˜s²Ä3Ù´àø#¡¢ÞŸ¼[ë@ÿÆæsF¿ñb< &óhÔ:Ÿ8ÿ3éiÎj—ÕnÆÏXÜ–L46ò;¯úo°×ÚNB±Å\J!µõ…3\*Zß׿chº¢-‘F+øqA/F7·£Ålϧâü^Ï?ŽÇÃÉ$oÛî0Ï&ÔÍРXf·e¦­þ€(˜½¶_2õbûˈ¥Ðy·ö€j•m|ƒÒú•’~!°Sü%ãþÊij†“NT·_;Õµú©Òt½9jë=~’55èë'QÊ"Û“Ôߢ¢5v½ÛÔì4“¾U Oð=ÒÃ"ºyŒ\>µ3¦!gçuq/¬ÛEïvŽš§ÎiÛC};|úßœ!}8m²ÂŠ:ÿ‰ExîŒWxœ›Í4›i‘°¥v7?mÏ‹¸ØÜôùØy³v§’‰?”çÑsîŒ xœÛʸ•qBH÷Y‘ß«¾Þ]Á\oô2{ÃýÆ ‰“”ÝÓÝî-xœ›Í4›iÂsîŸ×7λ¡Ÿ»íÌògæqñ[Êx”M €@¡<³(3/= “áëi]ãXñÂc"¹¯…_­ÝÌÏüW}7^ãÓ¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê°Àyšb¿Ñ±š…Âò÷v'_=µ9X1 ª&½ 3_Ïá…Ø#­=é¿gmÚ¾ôÈ7¿Ë.­ZzYE2CäO[5Lj»:ÓTÕæw°YÌ\§íTanjªP’Z\¢WœÁ°üÐn¥ÔV‘k^÷|6èNœîpñè’Ë H¥o€åxœ;j>Ãl“¯³oá,@Ú7ïýVxœ;³—ñÀÆ ™¬Œ“³X{7ÿeý©=ÙÅHf²ˆ‘ÞäG@:ÁHL¯5Òa)-PÒœl`ì7¹ÁØw²±±Âä÷ÆÁ›=LŒø7û»öJLÖŠ[Ég¤ç0xœG¸ÿÞÞ°‡:»"ÞlÞøÓ/p ÔQÃK=0g100644 wiringPi.hGØÌU¤^ÌCüé¾€ð+‡Õ3³ÁI´âMŽNxœ…SÏ‹EfÆ ÙŽq¸ ‚k|¢!=îîLÏÄìºÉªlf“Í’m͆—êé·3•íêêtUO;BIÀƒ uI„„àÅ›( 9äã? è%xÒƒ"¨àŸà«žˆâ öe¦ê}ï{ï{ï«Û_U¿ù¬úÅÇNñÀéWŠ¯Ÿ:X1¿Œ_5݉#æöÄaóÝDË<1yļ>Ù0ròŒùiòš¹6µ\,NG37½¯¸?Uö6°É¦Å½™Ÿ«féɇ•£ìÿ´RÜyæÞ¸¹é7ï»S¦ 3ÅnYXž)î/¬?V\_ùÞ)v­šÑêؘùáòKæs¾ògÌo>mü%óãe×\÷çÌ—þ‹æ[ÿ9ó»_{õpË*k¶H–ÍV¨!É„¼okQÔm.×[ úó,zÞÙSïÔþIüì>ŒY!õ³ãü=¶ƒ«Äµ†Û,£É¥,¦I¥ØåJSç4®¦×zeÔßË®­6gö¶ÞZ=¿~¢F…lܼwvöÀ¿ Íÿ‡x[k«›«5 }Þ³ì‚ÌÙž)!„CÀ"w0!C7©©Ùi/Ú1b‘çY[\uJo\êa 9 ¥WJ/ H6‹@«·¡…ìcéˆ$‹"È’F(óXYKl¤‘)ª­e½^‡S¢m)ÆšîÈICˆev¡`[¦ ¤@È9ò4$n¦d\º‹kZ)ŠÒ8µ ¨,Px%#*`Z£Ht´‹ßÕ u’9ûh©b©áJÆ5BW)3¶i6%ZKaæ½õ«‚ùGb6 aɧ)Pì‘«w•JË¡ $Ðü-ä‚l“J#Æ–+‘¹µþ 3ŒPÍ“fàú¢~ì»± $å‡Èì ¾Mï¦Ãu4øK¡ nËe—cZN.Ê7m[º˜¬ÅmëTFà–ëò/®mmœ,Øú'Óß’{‹[âî¬éÞ€âÎ7÷Ýïî)O­[¿Uÿ“æ`éŠÀyxœ›+½ZjÃm–É/Yì&Û±ªn®d aÙÌÂ5“€È¬î‰\xœ›Í4›i‘^£ü÷“ËoÌ–*Ùd|aDÿoIñ‰?”Ó Öí‰ÈÝæÍjòêsr”K—…µZØ© À”¤‚½¦;“eù£#‰ê¯—ø +q/-]«tª¤h!PI݆Õ~³þøb·mòõ^Ù…biHJŒ€J;Ÿª{yWŸ%i®€×NkÅDaJòó@ÁÓ-¶PõùŠôJËÃW}.›ÿ»UÓ&UQž– T½­Sýí•ë¿á[«îþ™1¿qË,SÝÑ戤=xœ{È´iƒ£\xFjQªBjEbnANª_bnªBf±B~^ªB~š  i‡ßKxœ;&òž{s8Ë{V4×n‰³Exœ›+|›‘kƒãfvÖi, ¼i‡”3xœ;,8™s³Ëdïᇑ0xœk|ËÉ­¯Å¥ ¥Ÿí“š2‘×ÐEœó *‹2Ó3J4’5Œ Òó‹Ròób…ªI/ÈÌ×3dXaóóGÊJÓ ‚ù|?ÙžÊG]žPðYE2ƒQ¡}í'ýô$BüÕL-6ªyU˜›š*”¤—èg0,?´[)µUäš×=Ÿ º§;\<ºä–Fç‰xœ› Ð'°a»tQ®‚nš‚~iq‘~N~rbŽ~Rfž~zAf>çäõ쉟 ï”fxœ›av×hÃwÆÍ¿;ùXô‹ 2'÷ ˆË—d¤*Ù )E™e©EÅ ™y%ù `ÁÊâ’ÔÜÉ{dXòó¸&ßpfIän^/dÅÁÈÂ;]á!• xœ;°ƒñévÆ ¬Œ›³X‹9$’JÓÒR‹‚3«R2ó¼Òò‹Š 2'sñÍcÒN¥i“wò™A™“ø¯Ãïð'°)(p)(ÔN>*79Z £ÈKÍ)N|‘OnrŸ /LéÁXN%…Üü”ÒœÔÍþB;ë*•Ü<ý •tàl#$¶1Û‰mŠÄ6Cb›CØÁ.Ž @ Âvö³] ؆épŽ¯°'œíì¤ÙÆ©p«Bbƒ-¶@b["؆ öä³"⓽Eƒ&ˉqN^+ª1ùŽ¨5­(èêàé¬`­ ­]™§9¹IL}ò:1“É?Åô'ç‹êUñxe¦)hƒ0?±(%(µLACSÁÖVÁPh‡‚BQjIiQž‚5Š3 Â< ¬9ÐHÓÆVÁÈŸñœ›³Ä¯¹Ó‰àµKxœ»ÇqcÂiÓU§6ž°óÿ$ÿs¯€¦Ø1‹òê†f&& 9É)z o.^Š~W4±…µÂîÞžÿVó¸ÙÄØÎh5-ô¶êuÖE“îp$ô ]õ±_qÍ¿ª³<³(3/= ¨½LíRËí:y÷Ò7ÅÝ·Zü¹.ßÙ|i.#}8¦l‹„xœ›êÞàºAP`³š`¾ÞãŠÐ.xœ[Éû€gÃ!–ÉGY”Xj² +çdVÃÉ5@¼ˆŸ°íî û脧cxœ¥W[lgÖÚ&±×ÍÅŽ'ÅI“˜Ì8k{×&±sïúlj/_HÛ@¶ã½SÏÌ?™‹752IC ¥¹õDJu!x(¨hx€Rhï ¨â©}@BâÚ$¨8ÿÌÚNê5Í>¬gÿsùÏùÎwÎß{¿ìÁÊÞŽVÆÛÛ!¥¨ ÚÚ,ƒŒgÛÌt!«©ª®™ÓÑèNÏTY¶ª¯¿gr JöûU•5‘Ϲ‹9XYÇѪ3ø›ª÷ñAt¾VeºRÖ26wX†›ª#ãðÅñÒ^V¨ìí3! 4¦]13D*ƒ« $5ÌFhï›;†ðš ŠÇ-.FnœÎ1òJ.H=p@i+f¨´1!²™Á©¯#,O×Á³ÚUž7A‰Q[hxÝíò¶¶68n´A/7 ê@:#&ÍÉó0Å2 iA–ÛàpƒA^cš­’oÅáfÀ.Í¥’2# Δ  8Þ”ÃÎy¢™×e†åBQøÁPÄ*‘s– W&wᜧ¹ ¦ùYšÂL˜Lq×å†H0Ÿ+¾:#¾²0™ ÒÎZP Y‘Õ+®²P˜1Å(Â_¨Œó^ÊÒÍ3f _Ï ê2s:sb”3hîn‡â}#2d Ð/Nö*SÄ ;O}“Ñ\½°˜¡A¾…/Q “å!CÅi£ƒ §EH“VŸÙËM×æ:HA¹R“}éÑcǂΧ Ïr 7×}6ø <º8y4Ó ÿz½¯¥{"µ;µì£³1Š¿zñnUkv2SÕ²x_©ó%¿Æ_0æ"OOl˜ò²p¦û+ØÌ¿„•Ö†´`Øyâ(US)«Æ„F ö…LÓ² ‡CÛÑf®g›¤§$Õê>#|èâ!tÁxÿÉôxÿ„Œ.÷Ö„føW¾ÿa5ø Ö¶ lšÜŒßó¶úQúœ¢À< ˜bÓ²±»ð² óþÏ^¾SQ>^ph˜UÄénz¥?¾ØŒüòf»´½3Dàxr¬/=18Ü?FÍr]q5j5o=TÏ0 ÂÇ©Û›j‡F“}²Hì0äx~ˆ&:ŽÞ®?;8v*Ý;4&€¸Ž|…V‡¡ÅÛ`Ð>7¦ä€ò9qƒT”^jýŒ`B~é?‹š¹ütùé”F™uú?¹üóHÝÊã&ð«WšäÖMGÉmsgÓ´à …ÆSð¡žR›fdhÎñïW¶Dɤ5\RþkWµÈ€G t§]h™¶4>ÌŒ´ÐÈ hºOÕ Ÿ‚øé1HÖqm/Cô¦³Y±süçïEðÝoÜÁé7ï¿zË_©i  W,b‘ã» -xôî‹øãoþ 7}½?|í(~÷ÆFSÏ5™¹Qâ -$g„ûbqEAy.éŽà›|¹Q·#D'³7©K$çd¥4J¡6)hiææ&h€Ý5yC³ˆšKÀêIu ïdU|.Il—,HL)ÆíÆ6aIô@k Õ-Æø¢eKÛn©’ÌÜÔ"œÑCŠ«O_× ,±5D—ušàqÙæ­<¼€ ðÊä¤xœ[-uJrÃAŽÍï8œ…RRs+}3“‹ò‹S“óóRŠ5'‡ó¨MžÀɺل˅iòvÉ|¼²Áë£3xœK´ÿ››9Ž CÏ9”ê°µè8TÊb@X3‘MUfj¸xÄEõVϵд‚HAƦè.g‘¶Q u(G»büÂÉXI¤<?I©»Ó:!è €Âgxœ›ÅÛÏ;An¢¼3GjrF¾‚’×Äë‰+´4 Ü’ŒÔ<…¢Ò<=ý¤ÒÌœ…ÄôÄÌ<=%.¸ò¿.“Ý&w2:ÀØ|™ñ5£òäý,bÊ ™Fɺ™yÅ%‰99\Ê i™\Ê“YY­€ XE1lNc5aý),–ï•[xœ»Çqc‚•÷² Ÿõo˜/¹Û%t‡dã–e,YýXád ꌇAxœ;¨òWqƒ%_yfQf^z@¦§‘³^²Âdk6-.'/N[Nà ÍKØä'GqÄn>ı•}s“€ãäÍ‚ ²0MÁžzùV ÈÜ .#DÓoXxœû«øQqƒ%'çfw¶m\/!ôî|xœ›Í4›iÂ"­_¿Òbþ³|îïn¬,:|âo|ÞʉÛRâ£Y¥xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQééâèãÃÐÇã|ÞrÊ« [å_X„œJrˆ0…* HÍ/ÈIe0ý±äôÚKiùy÷ÙV¾t`°3‹ÛTanjªTš™“Âp&ƒeÙòÏO]~ÅÝ©ú÷ÂÞ‰|æi&@ Z‘˜ 4¢˜áyÛáå‚«Í—'\ÉN½váÆæ:¿Ù%é™ù “_žº%rû¾‹ëe&ŸI«,Z…’Ú!Òå™E™yé™ ¯.M2ú4) ˜!p~ÑË+UóÞlçÈŽdÉgŒ©Yxœ{Èö—eC-_ï§yxœàÿÕÕ:6ü…J:éH‘±Â¥²©í²±N‡Ð^ êå‰æ(xœ»)ùD|Ã]–ͯYÜ7›³ë0q)èæ”d¥&¦LNæ ers'ïàtaÑ8ù@5›í¹f1V晥 xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“ÊP4«mó þ®~ðŸ5øiÓT‰3P5é™ùz† +l~þHYi:A0Ÿï'ÛSù¨Ë ¾#«HfH6ûÅ#ÚµöŒWó·–«qz±î@榦 %©Å%zÅ ËíVJm¹æuÏgƒîÄé.9mIlŸ,xœëèØð”eóKUf ¯šàž9xœ{ºñévÆ ¬Œæ›3YkÂ?èƒá œxœ‘nÿÞÞ:béÙ¸çPò‡pAT"¡æà…„ßî#¥$Ã’x ©Xk¦"Í㸕§B…rN‰4O/'“áàjäL·|ߢ= ¤ˆ8ˆ§šXÂòºMxE¼]/.Ì^qo>íÿá&2XÚèuñl¸å›ÆfĶ@¶ÊXÞÀjD))2Œ$ªæyÇ”Dj·fÉÛTi†×Êù_£ûkÇÁXržV·5ÓÚجe@|¦´Ï?ÊÚ¹*Þ­HùZ{0Š“ý œ_ri¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê6ùˆ§àdW¯©W±1½9.ùvSTMzAf¾ž!Ãáy±'?˜¼]]üL_…]Åqµ}ÎÈ*’‚þlûêRÀ¬Ÿ§X¡0ã`\¥Þ×Ã@榦 %©Å%zÅ ËíVJm¹æuÏgƒîÄé.9 G l®xœëhØp›eóKUf †ë­gxœ»kôQoCóæÌÕŒ›°ÞàÙ¼@È…q3§h ¯ß ½é­9xœI¶ÿå·ï´°÷“U5³iq“ᓃ“#G“³“â©“R“5ì ", module1“œC³x–7³IUûÜÂâŽ[[³w˜32Aš¾uîCîBU¬ÓaÚcGu²m!%ÎÃøøž)õÄÊGp·p€næ7´øqµD·ÒÈeÁbÙÇpóÿI,øcÞˆŸ_âV½?ÜxÁ^mU—,°áÆ­šÔ ÑÚˆThÉÉÓÛ£RrmK«ráë’W*œ¥7ïȲ~º³<%Khõî+M4fø-`D7ux±9„*fºÓ<¤ÄDÃDÇVË ê] üïeúý*:R* <ØÙþUÍ/a]]î 5xœ;%¹]|ƒËd3–&E.å”Դ̼TNO¿€ÐNN¸ˆhPhò_ S#.¸°8Š2Ow €!BE@¨K¼¿›Ûd?V1A 8²phÀärV% „î€pßx_×x'GNÃÉYl6Œ)›—³¥°L6f³ÜœÆˆ¸0'¢ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQš_“Ê ¿R!–­Kv…ª‰¸ÖïäSLügÅ€*ÌMM’J3sRJ¸‹×(XÌ=ý§O[å™ø_I£8 PH­HÌQÌ—úï¦Î³?Š^(­¬31ÝRQ’^™Ï°qÏ!§Ãçî=Qbð_ܺ˜ïÙ%ˆtyfQf^z@&CRÙp¯‡nNzµ[œS'¾;÷ÆnßQfŒÅ xœ{Èöƒq eiìŽ*xœL³ÿŒ€:¿~/¦ä zn¾¢#üÑ㆑N9Œ•R$ì°Ž÷Œaíµq‚I.è’¹=‘›™“W$softP“|!“èh“r×ü $íš]xœ{"Þ$ºáËäS,{&O`•ªWHIÍI¬ I-.ÑKV(ÎO+ (ÏÕKæâòwòâ´å,Šêå+€h# ]\šš¤s’AdyZ&,ÈLKLN2ÒS‹J’ò‹@Ry©Å@av>Üì|..'O¿`¨á6†³!&ƒÌ™ 5a"È<„i0³&+²ÅN®gSš¼˜MuòI ý–Me²»Òd3v…Éá@\ ijØø<‚5ts J2ŠRS&3s(MVãPžìÍa6¹‰Cmò*•Éç9$ Êr¹¸ Xq‚“9E”U4œ²ù *¿(¨hø¸¸ù8º5ªhL6ç´ž\Ì©6Y™;Öt”x®;»,»GxœSÑjÛ0}Ž¾â’a“&±C_ÚÅ­-ì!…²‡Ò•a"%8r°ä.¡ôß{%ÙŽnaz0Ö9:×çž+³3©–YÉfÚp™ÏÙ*•$´‹ý‘…Të{iÑläFt꽞˜ýVè¿ÀÕavÆÅJ*Ñ»~¼^Ü>ôâ(Šìævñå±wyɘT›Tª d¯ °Û>Ó›6E¹4°å^Ò &>‡™:&ËÕÚ?h•J˵¾Ü9¦¨R)4ž¼§g‚Î#Aä YYë•–§å Ã0åAˆ$Á(™uPV(ÄþôV~“÷…DG¡ï#‚$±Ý±É_S-2ÊFhckal“ùŠ§{Ÿl£ß,^}LN$³Í'Êؼü*µXbD)5«Þ’kCöû^aeü§êS¢¡«³Ê Uÿ >Ú ‡;Ûå«ëô¤S€‹,ÝßÉe‘Ó÷sÅ57çš?Ñ Üb~ §{ò1˜Û¹…ÕðL‡šÙ1†Õ,kªýî¹ßX;£›\‰+Ü¥;ʇ» d_\LõªbÿϸšÊƒ NE–ۖ­9|\U|ܯ"ÓâX5û‡jÔQ³è·MÔÍtE˜FîrGêQa•ÚG”5¿ýiÞØ;íÆ8!¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê6ùˆ§àdW¯©W±1½9.ùvSTMzAf¾ž!Ã>‹J™Í.¢SÛ/F:ÓØ·cö¯îMÈ*’>Hü?=U,}ò¼c‰]¶ñÛŒ”U˜›š*”¤—èg0,?´[)µUäš×=Ÿ º§;\<ºä*xHè‘.xœû¨7[wÂ݉ŒXróSR7‹0~gÙü€m¢` žê ‘+xœ{¿…ñÃZÆ >¬Œ&“}YÛ&_cµåÌÍOIµSÐÓÓ›,È.±Ùˆíûdu¾i“¯óMfW°UPÊ4Jž|O~òjþ´É•z“Ì';Z)N^'Ï5™[PfòC}©ÍN‚n*“gY§l3»Â´™Ù’ƒer³ôä¶Q›÷Úo˜œál|IÌVEÕÑêøÝ5_Ûörw³çñ5”üYŒ¦=8Àh줂 Ìoe4 ²eügæË6èr›;¹Ÿù<¹lILç:’0xœ[§°Tfƒ>Ëäb½É–,r›W±T0Ö秕”çê%+”geæ¥dxê%sqù;yqÚrÂõòáòn‰É©pnpjQfb‚›‘™V¢—ÏÃÅÉ™žZT’”ŸX”äƒH° Ó/µ&1áäÌIªP(ÈôÈ (ʳB2ŠRA‚0Çå£8.r&›ìälRÑÁ!Ž!žÎ±“³éMþÀfÀíéçè áâtHONžlÅËè…Í÷ùüK&/µâ‚Nxœ[*Ó'³AˆÍ@E#8ÈÙJ/ÙV/_“‹K91'ÇŠ“(ââ鬩 ¢áéçè drA¤&ï`SãõÉÌËVÐ.I,ÉLÖœü„M²(»>X4–‹ÓAEÃÙYsr{,[~nAfNêä ì*|zþ~®‘VœÉ9©‰y“/³ÛóÂ…JÓ‹' rè ÀE2óŠK€öMŽáæVŠö„ðb•67p\ddTÞÈÅÌhW\šUÎgY‘šœ‘¯ š‡Ð^ÈÊÈ×—’Zš—2Ù–Caó5F¯|Q)é–exœ[9•ie Óq®Íö\gÔ™R'óU1iêMî4š½ÙÀ8…cók¦Éžv{X€`2£èdy{½ÉÉÙ“ãì9&ßµUràÉi”åg¦hji”ç*h+„ûÆ;ûû…ùûh*Xƒ”gdæ¤*hh`*™,ìc<ù¾ý®(}}—Ô´ÄÒœ…¢Ä¼ôT…¢ÔôâÌ’Ô"…ü4C#.°IH&Ä»8†8j*Ø*(X£J9ú¹»‚d@'¯v”b+šlë(;ù¹c ³‚Bíæ$§…œèÎÙ,ìóŠuóÕÐÁÉ*a“ùR¸&ßÈâ™,›q²A¦·<ÔZ%™¹©EžE…A‰å ¶@£5Án³ž|*+`²w ïd…ì+“wgpmþ“mÆ2Y¸]eó„!0ƒ©ù Óæû­ìŒ›…ÛÓ7sv.`BÝz¼l”jxœÛ.Þ!¾Á•cs ‡33?àå„xœ{æÔè¸ÁAhrž ÄæEBs¹&s(XOn’•™œ¦ 4ù™¬Âd.9íɼŠš“m57÷Ë1ÔL~-+,56Þã€ÅAxœ;.uLjÃa6&ÃØÉ œ›ï±e²Lj  xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°Húih``njªTš™“Â0÷ƒû?/Ùcß—lÊÚ"~ûïÎ áã&@ Z‘˜[“ZÌ—úï¦Î³?Š^(­¬31ÝRQ’^™Ï /Èfé»HWÍúPDщÇo—ÊEA¤Ë3‹2óÒ26mœwlž#ËÅ­ŸS|ßžyÁYêÑ}WI½é©>xœ{ÂqŸiÂÜÉ Œ†-e&ïdŸü–Yc²‹ƒþ ¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Êp6ìé{‹þæSÒ­jR‡^dlÒM…ªI/ÈÌ×3dØÅØüÍ&qÿ™‹ ?:Ý%ß«…ŸŽ¬"™as°Oÿ%Fî?ÛZYXo+8ñ¦Ò(¨ÂÜÔT¡$µ¸D¯8ƒ¡P=¨M%”SAmÚã×΂³ßyfutZ)EßçÏExœë¸É¿ÁŸ…ÑxrK7—²BpF~iNŠB^~Éä¿,­lé™ùzù“ûX¥¼ôK‹‹ôsò“sôs2“@¸<³(3/= S/Ÿdq¾ž¡ž§CjrF¾B´Ë䭬֌Γ¿±ªLÖdSc䚜¦;ù>»¼Rf^qIbNŽL­nž‚’'D h”žžžÂä=l e ²J.ùy©zJ\œ\\¥y0­“'°Û (+¸ø+øù‡(¸¸ú¸†¸r„äIqà?xœ@¿ÿ›-ü).TH "GPIO" "14 June±³A@“³§“`q“ß4pwm“Ý:³$R“Kîs÷àixœP¯ÿð­ý£°L3“Mä“/“P/³¯Y ³r·?" ) == 0) doRead“QM“ßU#write")“¿UK“ VJ“ZV–T`ä…çmxœ{ÇÙÊÄ­¬¨Ÿ”™§Ÿ”Xœ1ù ó/Ch‡éDxœ9ÆÿÉÉ:-ygñ v™?I> â¹ÓæîܱNŸ­b#mZ’z$­ÿ—Ô+]Ùú§‘³HÇ­Ýä‰5xœ[Ù´òã†m†“·ø†MVe™|ÕØPÞ VÁšKA!9#±HA+ÌÎÌ+QP(R°UÐ5œ¬`ršÑbò[×ÉÊfrn Õ\œ™i Š™Å)™é™% ZÉšš\œ@òóJ2óJS&p‚ô&–äg*h$k‚øIE©‰Ù`£A v²¥© ;P Ø‚DÓŒÉæó8Šì &_5w¬/RPµñ€z€šôµ´ô@¶j€5i*ÔÔ(@ØÆ@ËAf&å'¥¥–-6[”šSœŠ¤ÇI)Û S¿‘‚5;Ô€Éó¥7ß²0dœ,de.g¥ š¢Q©P”Z–Yœ™Ÿ‹ÉSÒQ(ÚœgµÛ«åa|  xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°Húih``njªTš™“Â0÷ƒû?/Ùcß—lÊÚ"~ûïÎ áã&@ Z‘˜[“ZÌÀ wãiƔ†F{å–Z=þ Q’^™ÏP,øÝÐìñÃŽòþKßD²?Ý ‘.Ï,ÊÌKÈdà°Êþ0oïÑó¢éÌßÏ:ë¾h~zNøI€ï5xœk`i`™`%âÊÇ{vRpCœüÉßÛØ\ä›uÿznôÛIJŸ "ãxœkÝ-²Aˆ51'ÇŠs²›{q~ZI@yîæil˘6[sº3Ài ¾¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê°R÷êOQÞ‚5fŸ´$ìgîöYq÷TMzAf¾ž!Þ>³‡|Ñlí&šâ&åû]îíjNè@V‘ÌÐ-ún¡ðÒ½ê‹4Dn·þbX"ûéP…¹©©BIjq‰^qC¡zP›J(§‚ڴǯg¿óÌê躰D2ãˆ3xœ»ÉßÆ¿a5ë䳬/&_d“˜üŠMu²»ÂdCv¹É@\Ïþ® ƒâ‡xœ-̱JÃP`’.=§`ñ Í"÷¿¹iÒQ’*¡†¯Ð­J & J)ô!²úBžÀ—qwïÐ[q9ðÿ眂.øJ}¯í2ÿàµý·ÿ9ôÞúåÈ \×]ý¸Ü·ÇÍõ{ݬ«U^âá£yÝÖmÃ$¦@ÜV‹" ††Ðš:dm8ŽÃ0‚Íî§ØôIQØ*¿Ig‚øBÑpÇ‹¢¢´9%ÄôEnKŠû¾ÐÍÌ)\ó²Ë(8<ï²~tý;8{4gáˆ%xœû»˜qåbÆ >¬ŒF›}YU¬'ŸsPŸœçÎ9¹ÅInóF‡dÆÍ%N:ìâ)E™e© ùE 9ù‰) Éù¹¹‰y)ÅV“':ȳƒå”4'ó(MŽöÒÞ|Ƴ‚er _ £ÂäzýÉý4™ Ì0 f0;DoÖ8Ç«»,á˜lxœqŽÿÉÉ:ÜœÚ,­UØ|1’,Ø9GO‘N}5h&¦»{Ïw9[v²v9-C€§ (?Yhgf^ZþäuE&“Å°Ãn76Ú¦ 0dúä9Ú“L”&‡š¬‚+þo"ÁQžY”™—9YÑTª¶ †@Ç]«¯¥¥6ÅD#M…šTKŒ55Añ†©“LEÜ™`ê3Å2ÃjÔSÉú™ü oZ)¨¦Ää)é ‚(ÂDSŠ âu´dôŒæäéÒ“·¥kMV,×™ìa®&•ÕAµCsót_qS÷ßPl˜ixœë_/¶áÛf{vO Gî„xœÛÀ¸qB¥ù»×ñI)ž Z«MΈonT³”[²ÉÄÊ3‹2óÒ2ä6||2‘ÿ’¦X_ïñ~Ž©Õ´;i^î:xœáÿµµ~¶–T.ÀVnîôU‹¨Ç¸Ïûõß-‘’#ÞóßæŠ3xœ6Éÿ©£ßž°î“^\n" ;³š94“ß; and Range³<³¡?ï³êO¿ `ûç‰uxœG¸ÿÉÉ°í:¸“ Û9"'ï×Ñ<OLý,MÍÜ100644 wiringPi.h!ú #Ì%Æ£ú–ãôˆ‹×³'" Ömã)„Vxœm’ÏnÓ@Æ•Pu/J•JUõEBJcÚ¡6Q1j¨AZèµÚÄÛd¥Øy× Uå (²Ä…€|GÀCpãÊ…#WfíðO§o~ß̬¿ý(|9/œMÞ~m¥'s߯@i¦E"ÔƒN†"ì-Üñîí¶±™ çRñtŸÃ~XÑ$Z°¡PzÀñpÿ>,òÇ,â`Šëx-Žº¼Çb ]QI¥Dwhʘ¶êõY%®ÆH!V&ú…­Û}; O½Øj¢4T»âcC'­Á xÄW:¤DÅt£Tä@j,”ÿx­‚bó9(¡`&èK:š&7‡>ºB×pD‹™Ø¶mY ÌWÊÖUÍ._ä9 y¹u99hÍéøi«§ŠMkÖPwx¤ëÛ2Px†1WyArÖœOž6ŠÍfrÜXKo­—dõxKª5ÁCF›3|¬dÀ©ÙÕê×̜Î÷`§]¥Çsž5' 7–f2ƒG¥‹¿¯Ô ÚÑT©ÿ’¶½=Ï€ÜëkäEÏ]œËS~;yå.§£~t—ËSÆ_¿P {Çí¬8±Ò¯îùLzÓ»±œ¾=|³¸Þ}þ®ð©éÉážzxœëÿ'ºáÛf{vs¦ÍË92A~Æë…xœÛÀ¸qÂÉ,ÇânÍ<š±9boïù Æ{œU¨ ºá„xœ;Év’mÃ[F­˜`Ã=_Ä:uó|ŠŽ²lr‹ÝÌÈäÁÚŽ Òâƒ\xœ"ÝÿÖéÐç°ÿV³ W³î[®³¦]¬³\mö³\qz/h*ë†xœÛÀ¸q“÷s}¢·í~›»BÙhMêŠÃF­ªµ dá… xœ!ÞÿÉÉ°í9ÃM§[vQžž»ˆ¼h™]º®uè³Hßä „exœ»ö’ñÞ5Æ *›½9þroÞ-òœY”«¸$±$3Y!3¯D¡ 3/$ß½ 3òG)ÑÉ"’O$€@×P†áh’”òäz)ŽÉÖR 6ÿ’ù®Ä®¦`Paìæ¶ùƒýoÑÉöaÁ“K U7»„/dÜü*ÖŠ_ÁV¡<³(3/= 38µ¤´@ACSÁš‹KA!3MA£BAÑvó¤ÜÌ›K ™~å7¯â€$xœ»wñÚ5Æ l&Ù mæ² ÑZ-ï  xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°Húih``njªTš™“Â0÷ƒû?/Ùcß—lÊÚ"~ûïÎ áã&@ Z‘˜[“ZÌ`söa¹Ì‚_LÿÞ:µô͇U7Êó JÒ 2óæè{Úï63Û^ÊÄòÛu¿<ë9›lˆtyfQf^z@&ƒÏ‚·ûYN9¾PÿѧzæzÖj‰š½¦®Is☠øºïŠªfxœ›+<‘‘kƒãdvV-!}}å̼äœÒ”T›â’”œÌ¤Éº¬“³Xe2óJ€ 1/='UÁšKA*  a8ù «ðdE6ÇÉ“ØDëmmt 5¹@2E©%¥Ey †@õ@~Z~‘‚†µ5Hª, €h«` ` 5ÜFÁØ ÄÓÖó!FAt€,ªÕÚ­Yr€Fqfž‚†FJ~iP%H½Bª‚–‚o|€§‚¾‚¡…ž&ohd®g   ¤-ô&Ûr(rèMÒºk² G¦ÈàZ.æ‚;è®Z.™áG¥ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ雘š–™“Ê°R÷êOQÞ‚5fŸ´$ìgîöYq÷TMzAf¾ž!Cñ›Æ½/N~ÿýȯ;ÞÚËM 2‘U$3DM_µ}kñ‰‹õ²=…e—¬nÔª075U(I-.Ñ+Î`(TjS åTP›öøµ³àìwžYßèGuë™Mxœ›¬¹RuÃmÆÉâLò“}˜4t““S‹‹JòJ2RÜ<ý 2óŠ¹òóÀA‰ÅI©EE• ™“¯0©ñ(¤d&¦çå—d&sMfc¶äW(ÎÏM-ÏH,Q(ÎÉ/çÚìÇÌÁ½yÿM#æî:xœ»?ñÖFA}-.-…ô‚Ì|½d+ “s¢²>—B@¦z±‚{€§ÿÆ„ã̢ʙyÉ9¥)© 6å™E™yé™zv“ÕX–NþÉÌh¸Ù—u-ãf?öÍsMÛ„6_÷è`fxë‡Uxœ;ÄÿÉ÷:¸ ®¬Z7^šw‰²¤â&å3Ó±‘N5½~`£.è~î¡Ý?€Ê0ïÙS±—Ç“°™;5õå˜xœÛ+þ^lÃBÖÉëYû6{³ýfÚ\ÁéÊh¹â†Nxœ2Íÿ°°[ßMå›Ñ­õW?é;Ž|µ®‘n.ÜTšÊôŸ&N:&‡YæÊ)!;–­à…Yxœ ßÿÚÚ°<åXĽ%Œú)“–‹ÇºÚ”ër˜“PŠôþƒ¾3xœ…RaKÂPýì~ÅÁ6|Æž¦Fj%}I‘$úP#F{«7t“m!þ÷î{¹FÐy÷ÜsϹ÷LëDǯ«m 0Îò@'§ï—ÖRi× ,OuüÆXüÔ .tš„ùâs}à*Ô±ÂýÕüvÚhH×5Pcþ0{¹›Þ,]ËÒqŽ• fþO¦ãa‚\)Ðè œ ôC¹AI-ÙãƒÊ‡¿Úªì/ê¹Oï½Ïû,â pƒ rxT[û:†íX; àZ DÜ£*„mXª|»!&t¤C]æá†ú9)äd› 4“d“] •=ÇM •¢NRØEâŽCÊ<–’\CåžÍB&iºÄÅc˜ë¨l·õѱ ÿ:U~®`›Hµ'8‚â3³[³Õ ÌO±]Y4‘jÏ©­4UŽýÇʆ©®/øÛ¦ jåÁî»?¢ë•§ÖQiU­;œ"ÙGÆÞÌF^E(BÒˆÕÿ@¬Ád]Þ¾·¾%õÚâáƒfxœQ®ÿ÷÷ì O_P*×vdþ,òJAû’W·lAQùë 3#ðH¶*´K“k\JËñ†xŠÿ‹lMt/£ˆr¡¤³Û19 Úlöxœ{À3›gCËæU,3"ÅkŒDxœ{ÄùcËd#–\ßë„xœÛÀ¸qÂyQó?ÚH.ØmïÑê÷Þ*g²2žh bæ€6xœF¹ÿ÷÷°¢9V¿Mˆÿ¦a´˜ÿu_¼¤4fàç¥100644 softPwm.h¦ØÍIhÌþÀ2ÚÃ[µcy)¨s¾â³Û¯!¤à‚¸QxœÛ-¹C|ÃÎÉî\Ú›qÝd:K™ãŒ‚vxœ{Ä9‹s‹~jEIjQžBf^‰‚BqjIiAp~ZI@y®‚H¨ 3OSÁš ¡h²-‹—8LJ¬­,1§4¤ ·h¸ã„U ÑÏ¥ì¡àâì´ù)£;Ëæ;lÇY&ë°­Ú|‰÷3[z~QJ~ÞäK‚×éóEêŽqxœ»5ñyㆶÍØŠÔ&ß5dßì ÛÌf\ÔbÝœnþžwój·õŒ…ü·æƒbxœF¹ÿ­­°£: M£i»„.Gí n=ÔÚK ]Y÷100644 wiringPi.h«x|Lµ×Ô/Ðc!|t>bßpo~“ÝÐЙæ —4xœ»wñõ9Æ Ý\›se©NžkÎ¥`«`f`àíQ¥9yƒØdUCsy0HÉLÏ,IÌ /Ê,IUÐ(ÈÌÓQðñ×T°žìc Îí’Yœ˜”“ªî;9ÆPaò.CÁÉ}†BP¶2VœüÃ0x²¯ìdu3©ÍóŒ&1m^mÎ$»™=ô¥Àä÷Iª›óÓ¾0mÞ—¹€4¦59îÐ1xœÛ.þXtƒëæzÖtÆÍöìlŒ“K8No¾Æ9•‘I_²·$ofrQ~qjr~^Jñä@n)u}ýÔŠ’Ô¢<…²üÌHIÍI¬DVç‘X”T›Û¿ÿk^xœ{,úPdƒ(×äé\>=î‰DxœÛÀ¸qB¥¹ý†Û¿úî_HY{5Wÿh/Ó:ÙN P(Ï,ÊÌKÈd›™#÷¸÷}›Øâ¿ê×ÞœZÏ x.:î”yxœÛʸ•qBˆ¬Ðªý]×›V…Ìâ®Ú,(áðNÏ’}â$e¾d åç+¡9xœ¥‘ÏkÓ`ÇÉÖ®MÙ˜cët¶n©Ó¤Ôfc8J]'ƒ-³®K#z›CCò6y¡MjÚµÂýüñ€'ÝMAD¢î¾Ãv÷èÅE= Aó¦zñêåáûý>ÏûyyßçÓ÷ø7"g«IݼQ $ÿ0#'@£g[°ª•«onô'3Ô1ê[&….õ¨ci4o/â™È3<Š\åfq=zÍß‹¸ˆþ•Ø.ùB _ˆµ@ì¸ÔôçGŽ'¶¨y£Íj0`….¨˜›¼…wOdýƒÉj$èŽ «=±)”{â¹p¹'¾ »ø3•¦i3!J‘½Œ ï¤eÔÒ#ô¢a»]Äšª7ðI<…kÊæÇðe&‘¬Ñ:)Âtëº#ä@÷¬lÌnâþ$îL“d–ê- [w,†x-›6Á­AÛ&@Ì e¼—^ø¯»FñcjÈwúWœý ¿wn°Ÿžï†F˜÷‹({+‡Ê ~Y™ÂÊ"V”SÃbÀ2zÄ?ý¾W¶Y?Rwu5e,Y ü3Éãþ¥·CÔ  ×$y\Ê'q¢2ê¿(k}±0§Žÿcí+Çw=Ú&ÛÃœº÷ˆn†æóúJœ ;*á†*p€Ûª’2=Ú s J%˜‘Àt5Ý\f)ÞWÇñ›:7 "#É!\nv2cÉáI ·›ÄhSB¡Zú ó.ÝrïŠxœ[˺–uBŒH…¨À²µO÷èEÎÝtåã»#}–,.Þ l™Þ% ýi€¹xœûϸˆqBÔÄíîxœÛÀ¸qB¥ù½‹³T8Rý*`©W¸¢æÊ%”%ob å™E™yé™ Ößú’^$©n٠͸õ¼‚òó‘»í¯î‹xœÛʸ•qBHÈý=¶;¾W®Xi¼¤pY€l-¯uÄÄIÊØ$ Qç „Oxœ›6‰qOã†`¶ÍóÙUy¸€  3Ï7?%uòm+T)kqd CG! Ü7~²¢ŽÆä:<, ùÉïu¤'ï×1€qÜ9mm 4aR›Ãu?slî³`ãüÒÍbEJ~xQf ÐNwãÉ™îÜPÁ ÔÄ”ÉçÝM&oCˆrÞÝ… Ê(ÏÜèn:9ÀCba‚Ç6@œï‰Jxœ[˺–uBŒH…¨À²µO÷èEÎÝtåã»#}–,.Þ l™Þ% ýiBxœÛÀØÏ8Ak¢w*V=ëxœëgìgœP-2ueõÏÇ?rݾaxóˆšcoÚÆÄbº. Íïgxœ[˺–u‚•Hà—r;÷¿ß&‹Z/é~¶#ÌFãn—òF¿x&Ý£ Ëé²kxœ)Öÿ½¼°—“¯„³K¢“ +“x v“_ “> '“Ž +³¸ = §¦ xœ340031Qpöˆôôs×óq v bH=zªcYÁ¾sd¢:Än¦l°HúiQ™’Zœ\”YP’™ŸÇPjƨ|áfoüù kÊô¥äÎ-ŸzÏÄR+s rR‹ä÷[Õžþå;Oßòn¤É¥ŽõÕ§¼¶B”¤dæ3Ü»8K…#uѯ–z…+j®\bAYòéò̢̼ô€L†©+«î<þ‘ëö ÛGÔ{Ó6&Þ|Há¸xœ+Ï,ÊÌKÈTÐUpTP/óÔr2³SDRQbQ¥BZ~‘BIFªBPbqARjP$ “ %[Uë€txœÛƸqÂ"‘ÔµE¼ÎÖ¦=½ôÚµqÝþ˜É—Åô»w Îàxœ[˺–uƒ,“ÈÆN‡`ƒÚ.¯9ï…ßzY¦:ÿY=Ù©à ©ë‚gxœëgìgœP-’º¶è€×ÙÚ´§—^»6®Û3ù²˜°1 YëƒxœëgìgœP-¢îyÌíü–÷ þKŠ—Ïý×t5ø  x ¼à}xœ ßÿ­­°£û^|höãrÁO³#ä@зñ “·öñoUáŽxœ{}ŽqòÆ s˜¹ôõ'÷Š²h*XO2QÛlibd ÇÌ ë„xœëgìgœP-rˆCä_½ãNõõbŽ–5mA•^¨=k àšxœûÎz‡UßÐÀÀÌÄDA¯<³(3/= Ó-19U/Y¯¸¼€ÁîíûÏ—ê-»oJóÞ!8»•5d‚•Yà—r;÷¿ß&‹Z/é~¶#ÌFãn—2Ô” WG_WV+Â< gfêû˜w˜éÉc•U]«'Wº,½ë|¿Ð‘ÃÌua,æÝá98Ùƒ1Àf¹^2ƒiaÝ÷Eæ_NÆIXļmöü¨épU ÑszjÿšÉm¾5}ßqƒ£Þú&Šß'«39ˆlaìt6¨íòšó^ø­—EaªóŸÕ“™D&÷3ex5c¸°€xœíš[lWǧIÚÄIÓ RAB:uJë ö^ì4 IºöîÚKíÝíî:n(ívvæ¬÷ñÌ0çŒí•‡V)´}£T´‚ ˆÄ‘PÄE\ñj< ¡"$x@q© ÿsfvöbWIPJÌ'ÿäÝï|çÌ÷û9³Íô©â"9’œÔ û5íä¡ý•3£»´÷d4mÅñLÇÖ®*ýÌçêfÚG‚SÜ3RëÌcöJ…mþPÐ š4®¡¸Xb‰åºd¯65™I½“Üþæ¥7Ú™Xb‰%–Xb‰%–Xb‰å?,ÂÝ®]Áÿmàcà¦+søÿTø};87ßc‰%–Xb‰%–Xb‰%–Xb‰%–ÿÑMMÛ…ÿ'äÀþààŸû4íà à,xÜnÛÁ7nÓ´ç@4Àॽšö4¨ƒÀ>ð“[5íI°Š`øõMû"0Á£ ÷ƒ#à.°¼º[Ó~ ~¾¾ ¾ÎÚà0¸üiDÓ~΃Ïؘà]à2‚ü#ø)¸¾ žŸO‚³Àïo·€?ïÔ´_ƒ¯€‹àSài À#`ì¯Þ¢i¿¯€KàûàΧø °Á£`\Þ¡i/€çÀ'x/È€7ýà/Ûø¸ž(‚1°üýàwà›àëàkàEðyÀ¶ýäø¶ ïƒ#õ6ã¢M ïØFÛslÇçD7 Ê9Y¥F[·_MJã*ÕM¢“fGPÒòœU|öè ã‚zıU‹³•É©ZæH÷{­R$MŸËì°ÕÍä=¦¥jÚc!Ì1„EÆ¸Ë æ¸´m˳Å|­–Ëeãän¤%ÈqøJð)Ùd‚7\ê5ÖÏ$ÓR7SYFzÌ]JÍFûCD‰J®IUd`RKï4|N Þ5ÈIUd`Q›ôdšLE)ÞF£é·z)c¾ÍÙŠÂ-Ç^IHOüVu#²×b_߈b ¾=4ù0lM]èÝ‚B}FêQÛCê´TÏ.æËÕb=&<ßÒ¨ nO·y M…Êí3[m¹üÐÔÃ[$Ô» Ö¸Ð3ÈšÃL²î1Ae3"¢ÐnG™¥ï Ù·RàFK—õ9³W®­ã.KŸ»=W8×Ùo£ˆƒŽ«0i‹ÙTU{5ŸÍ¤7eºÚ‘¨1¤:­i©™uVWuÛ$†cRåA_/—ÅR±>2|®å(W*OŽ¶tß„ÙL0Ýb-ßVQÄp K¥¥Z^z‘Îl*»^)/Ȕɡ”r®*Õ‡†ÔóÙ|IêésÅZma)™ôPŠr “à ‹Åjµ\ *a0e&[º¿±XÎÉ:ÔÐ Æ5BUU¯Œ¢ê[^ÈÖgF¤÷Fº¹J±è¦z)Õg³•@›é×”.]èË]Y t¹ÜåR }w¤Íå §² öHÿÓKõ<Œ¡íùTD•–}>•sÅj Ì F”U~ˆ(ÐMEhÓ)]:?Q ›Š(Њ(ÐŽ(;Ô7Q`99Q LuH¥Ìªv†U5lNtÿîD!ÅõÍn æ±4&›þi¤ì‹¡T”9b´©Ž%@Žã3”º̆ãvH›zÛô2A.5)ŒÖê¤Ôð%LHêýCÝt(·ï¤­¯Q‚•e‚SA­†'ÜA¶{àr8ÿÁ5¢ÖªÀ²àºÅÃ'‡Þ`¶5ΧEèõ:¢9*Ê/cËBVÙñ~‹©ÉÈ"X¼`qoZ 0ìVb¸ªUæèkš,bæP&}¥`ŽôÂê rh&£)“®¥ Á¿t2=Öü)ÝczÓ¢˜eÕŽ¡CléBoRâêœã R\OFSKfØn͇“*L=}•½A;ÀlÃòáÛh÷¤ÉöhŸú„ÅlC::”lŸìKåž—òÍjµ»T· {XÅ… w7멺±ë˜\L űîEñ¨¶î±Tj}}=¹bûIÇ[IYh›Sž:™ s,¢Ë­Yg¢M¢Ê MN;>ámÇ·Ì ?{Ô lM6H0<Ð#åä:WZ" X Ñ.sÔFW·HÅoâ‰(&,é5M"7ZŽ‡…Þ¤Bgïú°˜¯ÎÎgKõìLq¡X?M`V(ÖKØΑB¹J²¤’­Ö‹³K Ù*©,U+åZ>IHÊqKÃ2š¾ ËÅú|y©N²¥Ód9[­¢ÈÓÇUØR1°‚…‚­ºC„뺇-Ž1†…t+GnLÌC±° W˜6¹œ*°º ØZ–ì¿Ø¶|k¼Wa´ã2Œ1ØvÙ•sC‚èv'ìÞæªn¸²ªxkvÔà â«9-7ñÍñmSÍ/ã„" ^Øjm×`*ç9‚­ò«¶a¯Ÿð-*¢%á¡#Çd8ÄÀléÑ^ ɇb£’Rí+'Ï 6Fd'å襮ç|€‚'MÏYAÌ6)Oçn“z^gÂíþäóÕF­Å,*ŸŽ1/d]ŽÝÈQ¥|Ä̃p¢Ù].¤è jF3Û†ßh”5¦ïïFz~b&SSWKG&5̤mð“v‚…¹mUÝa±ëmf´ÃÇÏbyl¥-Ș‘ “éÌ$™S¿–'óT6#Ç4³¬gb^vàѪ‹“)CwIeU/ÄbMO÷:jˆÉgW»µ /Ô^´ïGöj;*ÏÿOà|üÄîàü/ßñ_Âÿ"¸^σØðVð°Ü v„÷¿½ g^ðmð-ð%p|X &À•½šö3ðYàƒ9ð6pØFÀ.°ì¯ÜŠ³3x wƒw‚»À?öhÚßÁËà%ðCðUð"ø(¨‚w€Ëá=³àãàìî æÇw¿1÷.±ÄK,±ÄK,ÿÇ"oò=*|ÏîhpìЙ(8^Qî¥=ßdz“*ÜTËkg%&[aB·Ô+†éMªakyÐZ_ ®u§7©†¬Ãrú­ûUuÍ¥ÃÖ^er}ËZrsö¬c ϱd¦!Õ™"/˜­îZ¦7©"¿”yXeÁÖ"cäÎi’–wçê¦i%4ºûýŒÝ0ÿXB]ÊK›-’QÉs.s*8¡‘1yc_ÇÛøntO±Ýƒ ÁyqÅÓW•ô0:zõNYò^<ºã¦ƒwñF›¹ý‡ž­£ oåÿ'záõu¿§ßõ½¾Q×ßãDÞà¢GÈ—Œ«#©¼ÝOœð].߈¸ï3ù‹åì@n4Ñ-‹8¾p…/¯+Z¯kOïuï-Ú¾çhp÷.=-BO+*2q’m×|‹ ƒ¡© Y™¡ŒàdŽá,³åÒ8é½ÑI„WĽnßíÕU2‘‰êdëw¡Õ\c1û`£VÉçsù÷/DÕµp‚œUø/ÿ™:‡â€×3xœûϸ‹qB”—®®‚c^ŠB¢BN~ çæ¥*NÜîº8 Bé¥ xœ{}ŽñæYÆ s¹&‹š(o¶4‰e¬f%;y‹¥ÄäÁÉ-C'O³œ°¹ÁjÛäV'¶Ì<[…É…&"“ýý&ËrL^â覕 &ÏwT’ç¤&OHd¬ï˜‡KÍæóNÁ¬›•=<䙸¸¬-<,:hÚ(éªoÔåZL–+°½´,#wiringPi/.git/objects/pack/pack-2c3a6890da28e9aa6fd4e55a4c962bb0bdb42c23.idx0000444000000000000000000004731012457032560024051 0ustar rootrootÿtOc  $&(+--./0357;>ADFHJKNPRRUWZZ]_adjloqsvy|‚„†‰‹ŒŒ•–—›œž¢¥©®±µ¶¹½ÀÅÉËÍÐÔÖØÙÙßáåçêëîðó÷ûý   !&*.0469=ACDFHJKLNPUWY[_beglrv{€‚††ˆŒ‘“–—™ž¡©®°³¶¶¹»¿ÅÇÊÍÏÑÓÔÖÙÝâåçêîðöûü $%(+-0479;>@CEHKMOQQRSUW[[^`chjllnqw{~~‚…‡‰Œ‘–˜š›    £¤¦¦§§ª.Øåh”q€?#ð9*p±ÂãóP°$xŸksV§83M;2ZP)tRúpgñª-³¥ª}“eŒˆFÈ𢻦ê˜Æ7µ>„ÉEM”ÈÜ7 1xGȱÍš÷,ˉöNý¦7ƒ&'œPl#ãtrV…8>'£½*åÈsæ8u¨úï[b¶ð¥IC·wÃk rŠý.ð²'Ki|©¬„ª=±Öȹ®ŸQÚ]ÓÞ_%lJ›ý);ž½³õ«x|Lµ×Ô/Ðc!|t>bßpo~ÅÍÖ=»30єˉbèjçÜTšÊôŸ&N:&‡YæÊ)!Ž»9Ö0›ÖçC¯þci+¬pì,Ô ¡™hÂŽñnÃäã$ªŠ«ÞÞʙݨA¨n=Åð†´Ìq>âö~CØ1•ÿñ¼ÙRç¯éÎo„._p[#V ‚Á†Z·,EÙ°…dÔ'¡¢½ç]ïÊLkÏìö”ºñsoËU\úèçD%´ö®”gZ¶&{íë±.ù"ŽòÅÐ7F?$ÔŠõ:kðž½ÅÏg(÷ÍC-èƒåßAÃ˪µHfÇ îúFòÏ O_P*×vdþ,òJAû ´® l+þ”UFOwuÏ”ÁOÑÜS YˆÃ/ xE<^²Ë¾“A5â¬c B³b‘G9±3Àæyg 8êÚ M£i»„.Gí n=ÔÚK ]Y÷ u(G»büÂÉXI¤<?I©» †ýCÝ* +›$•ò=ïòe` ŸÞ²1`žø4ðP½¸§¦\Ó^+ ÌÇy¡ÒGô„8Œ.NŒqXò ¦ó°Ÿ»DU¸€´¦j ÞØNwdý_HÄ-°7kðà Þ3Oý·—M #õE Ö86¦Ÿì ù×±žØ/m¶Ì§æ7^_´v # †dýâŸ.dÚŸkD<œÑLø ×'ó:Ň C8Ù;NxÂ31 hÎêkC|ÇÝP}ØšsmçÖ m¥ðŒu,ðž#y*ÿßÂêúRë@…ô3³ˆ¨BD4ˆqÂB÷ÄOµ"R>B°u²¯"›Œ†T¨cŠGØZ„.°' ¦M8v@äò:– <œ5À_’.ù¼È À}ɲmΆ¥ì9%‡‹-Žã0ç/àh¦÷­ …St#¶”re©ö`ä —S±¯ïÎüHÅŸ¹S¡…Cz"uñYy ìØ JãL”özKÛüІÇt‰{ ¶­qõ|}7FyiF XÉFǤ÷ƒ õS—é’û½‹]}ÏiNdWó ‚_jÇíFÍË•ûNÍ‚Tih„MýÍ€]ò?î—‰ä[$õ‘T¼Gbƒ6ÁDµtÙ*RQïf3Ä8¿~/¦ä zn¾¢#üÑã†"Ó׊ÏÄÃ~Vâ8žÜ Á_]wøÆ•ëÄÝ‡Æ ®§™­xLð/ÚÔálÜr°€(žm]h‰oŽ ŠUzFv©±jì¥%˜í æ#"'›l…Æg<´Äï9Û\ ‰ª™[!DuUxY¸«3¦”òVmÕï ½Ä©c•y.T¸Æ^Ú™Åh³X½Ï°3¼C$üÁ¯’•ƒE7~s*ÍV×ÈFPA˜É÷òÏd Ðeô·)8jH[ß!÷ÝΊ¡Doœ Ç"~DÅ´qÅÑë 3e?ºŒ®GÚ›K Þ†¨‚ÙÃ,nY" t./´˜ž\:6X… êwËœ¥Ãì‚®å’v:ű¥ºfI}Â×€z“Wò7¨KSæãˆß æ íbÕߪ¿Š×‚ªTš z³@î.9!ú #Ì%Æ£ú–ãôˆ‹×þOÉW]™fx÷G¡8Qæâä V9M¢-&;ÂXrÈãí§QZeqׇ,]ãHö2b’”Öš@¿:}ËúMž/9ÝY4Òˆ¯{ÊJµ 6·Ò™Ë¤”L Ç( õÐ] –$G*`üØæ yy³I¶¿²p!ZwD }ÏŸŽ8ïдR!…ƒ‘´ç1VV•¥²›»Áœ#ƒAjbÐœß1XÚ{yjšm#ê¿€¢óX6soÎÔ”…ÅÞ4ùÆ#ï ªîVKnNRÖêN§¯~"õ$%A:Çݬõ†½ ‹n€tüªS$¦²Åï6?ÎÉ4+7‰LÑóâž%_î¬J Åœ\$w$ ‘ÖÕŠòÄ%‰Z†pMúëCŸØ(D¥}ØÀº§%äìW £‡’ë+uÒ•,='IÆFÏ´ïXO¤s§þ‚ÕSà'i‡f²ö»]³jØ9åº38'¯À¹Øð/g¹ÀxÓ|Nñ(­)–TÅv­†®à„PPÝÉIÁ(ìYŽVE‡Lè¯yÄ:Ø4]}*É)œüµâvÜóDmGäøÐIj¶x\)éˆáû«'çõáh¯§âéØ쉚*\S1¼ô@‰-nM`rŲF]*£x¦C䵩Ѓb†À\¨›š®7Õ*úúf\ÿó‹yrÃÈ _n©+>)T˜Œ7°ÌPZr«ó›ìúI+b•3R—@^+ëÃW‹L9Ú >Èþ+Æ; l7âÐç‘e] ¾¼ùáÔ+îp„T.ú9@éÿÒ»5-°ö &}+ïT¯¦ •­‡ûügÒ–"ën+öñéBw½óIç!cò@ mš,§¬,_© ]Š¨%4*ûcÊÍ,žZŸñ<¥‘‹?H…@^ï:l“#-o’ÚýÊÊEï&·ã6|ˆuJ-ygñ v™?I> â¹ÓæîÜ-îlsgÔØÕœýœÈ;…Fa.!—.}\õutÌ/ÆÔÒ«šúÿÅHs.dž²Ç‘dûÎ&ß~§©2³É4/Fx>šÉäQ²h3ÚÝ /]™§âÄa'ë¤O" ¥u­"Õ0Y·"ܽ¬ñm üëÊõd{«0׫vw —HÀب( %$´Ñ0Ø›è˜5taw¹ò=¯ìcý­19‰™5ëqsovê© kÄ=eA1ŽŠûåÿ—1š|ÔÍÚ;Ñ1‘`q9€ZH&–¾»¾§v8’Šl2“JÌò•#(ìÚîG Õs;†é2mÒÙUŽ‡ÉQN.TO&58±&I2ô’%{#‚p9z…ùÎ\oùþ3¿›ÿ zjƒ´9œºwXYm‘3&;Wÿ6g¥_BX¶eJƒùÐ3*…ÑWÀ:‡m„X9jˆø4‹Ç9Ѻ]ŽkÝY•ÙöÔ÷mù4¹ºÔ]ë¿v+ ãÝ®uÑÉÀE4ïL[¶»ío]¨ 2¬e¨Ã2…5q~÷Àr7õÉ^8]Ç㶛Ÿt5ø¤Ë­Òfxonß©é@>6^¸6ü…J:éH‘±Â¥²©í²6ÄŸT‡ûD<6s ªÃJ¸›'7˜Î¦r5¢ØØ ½PôÑH\*_7´ˆ}Ë¢„á<ÈììÊ”^ mp7çd’_A; ¡õED¦%nF8\KÓa¡Z%)¢ßáGo&?¾dx8® þnš½ÂiZtXÙƒà\PÕªy9ÃM§[vQžž»ˆ¼h™]º®uè;¦•„¸läKðz*¢Çò2òÕ;*€ˆ8e5ÈÛÎ+/Œ{|·ÿÚå0;ò, §²¢¡%Lž1Î26;öŽbèb%´°+µÏ #ç`ðº<ßMå›Ñ­õW?é;Ž|µ®ÿ}ïóÒ9‹ÙÆK¸›…T?ûk—>ã2q€#ÐÏ’•mç“K?¡‘—Bm¸}óÄßàb¸nâÐÍø?°ÛúŽßÐgT¥]Õm/Å®‰?Õºñ6+\5`ä.çDÛZ¡†Z@Óœ¡¾•™ ëOo«ÈƒB_AšÞA@‹ é¤Qß°è)"ªBuAûž*).zÎX.¨4¦$B¶Š›Bwåóc]ŒÒ¾6ÌÚÝBße“B&_È6;šRb¼Úw9Èy'cBN;ÍEf6^ºãN^ÿº‡¤DB«[ÉÇ?,¬Mµš£Ám¼E C Ç1£l3ºÄ´ÿ}zôfÃlCB+æ¬o Þ_-ãæ4²ª^&Cæ“A°ÿC |‘²S'E uPçD/¦P¢LFwäB7¶FY˜Ò +DAI…1Š;Îéž¿Ósê[ê$.DuÇõ²…éȤ_UÌÎa'XéáLDãÛŽV8ãÓí³§â²’¸¿N4%EV9Ÿ›'íȵeN†E^k9E Í’S€^ÉûцDƒ-ýIE]ýc3¾¬»ÍŒç~åÏvF[ 6Ey"ÙÈŸM®Ò€ ¯h¦fÛVÑE¿ä<çåAþbŒS×¥ã‡F`¦{G²Âš`¢øTo‹M%H´FfW9nù èÇ’Œ5ºZξŠFsã‹;›²¢«wZ¢Ý\W^G$«0£â4Ó—×ÿŽ‘Q•îyG…bGc“>ÉòÓ‘k×X‡ œ1Gɹ²\| lïŒQA^JýðÄGØÌU¤^ÌCüé¾€ð+‡Õ3H"’y^Vû DW! '}~½Eí3Ie1Dì(’¸±œ oiîÂÁhðv´Ij=nŽˆ“dþUb—qò<èFIÔVÙ4€§ Ž°‘ù§ ú¥AƒJËñ†xŠÿ‹lMt/£ˆr¡¤Jé”dØ aê¼w¸G뙬˜ÏJ&Ü|`@^µ$D»à†ªÞëØJ7žÀ…Æ©ï@9霚ø…ƒ™àK¡wF×ÅŽ*ó`AÃÆøI”åØK£n$zĦòÉHPÛډ˟­NKõá1æå™aó´t]Üš&=¦Luq¸ÙžY— 9~lð·¥ ¡tgMÔ'epYªGŒ’¥ŽæO4[þn©MÙŽÿÃÞS&ÑG76WÌé N3Bà<£TÅ1ü?hx…£`Êz”2Nê>X&NíKxåzˆ}”diøwíO¦õZW^®§( *2ux¬ZµOÀ’ô…û Fêšcj‘k”–>P<(£»è¿g€ÌÌh æÍýŸãPD™v÷á —þFHßÍhbP„P€ „T«T°žE¬R_/˜QV FŸIànu“à|ÛdúàñQÌ‘…ìöjÄóΟè„ntw°ÎQtTµæ7Ú ƒrqÖk­‰ZQôw>Gýö“;¤‹æ¸V<(ÝŠ#R° þtŶ-o„4S‘¤‘+åRü¶üUDp/n!x ˜Á^y.õÃSŠlt¼¬ÂÆÚ½µcœî{y™SöGåÀzù#~ ó|M¶A‡aêÕTß¼=¸÷y¨©?S¤q¦P} ;XVn•LJÃûèázØF¹5ñÈeÿV“ÄI“EJ•Õ¢ìÇí²bV™lã(sý'×ÅÙ• V¥>Ùòr·nXу‚óÆð6‡BtV¿Mˆÿ¦a´˜ÿu_¼¤4fàç¥VÇ{Z.öTÙ‘Y¿o3gÀ± W4ÿB§c[ ªÄÔŒ™ø WÊd“63Ö$òHLiH †Ÿ9íX‘é‹ ô êßbÓî›ãìnôàgX _–µÞxèð:óç…÷Z.»éX^-Ç—‡ŒÇ ¥¹õsD¼Î¥CX¼‚9ö¼K‘]¹ðÒ„³Ž€ÜY…¡"Ï:@g©¼ÖìÇ€ Yù=&AXÝ,–%& Ÿˆ8™®+HZ—ª¿¯…sÈØ£.kI¤«.Z©z²b*¹ÈÌóšÜßÿJ…hx î0Ü-Îb0–Å@rû’añüsV FYâb€ÌWJáFB.}´CAe‘îËnìHb¶”§Ï)·ë&ªçוm4ìm=‹béÙ¸çP‘sqh²ŽK6y¹'ACA½N°ÔyqØq„櫯L彆T Õ­%‰r'Oãƒú\âs#OÉØX •ßò!rŒÜL#nì¹Ô„¸MùÕÙ 8|rš†½°ÝŸ1¡û{àÿSå‚•ÌrûÉo±C‚Un)«U‹%öâ¹®%sFf“‘Ú{Çû[Ö<œ‚fY‘3s÷16ãáèAO‘uìpYå´[s6Ç#O 7ÌÜm”-ûWE—WÁsä<½ÁÑ“ï÷ÄúÜK@+§4pit Q!s¬ 8ËüŽ+$æý2^tæÀØR‚7|­`倔ëN'*þu6#ÐÙ_ÏЬv.Χ•ÞuO=8q¥Öůy\!?\³ŸeKuÂui&U J±Tátxì ¦r­5uºh3aRLF®Ü³i»;òÍ.Óv&Ò„Û~Guìsx‹Ú„OC ÓÜvµÏÉyêA`É]…‹nÓ^èwU86ìz§‘Ñeïè‘ñòes¤Àwluo p>® ³B Ý æQ4Ž^w‰²ë¢€¬µeho@/ö*yx¦­å¼.Y²ÔñîÄŽ9DKxÆTfØsÑ“yUòµáÄež2„xÓa!ɨû5W_Ù–Ì¥ð9Äxÿ‡ÖFÔÅüÕæk„ªñ›âºyDoSðZ,të¿R^ÓBzý|yLõRÀ§ÐL'w´ûVBÿ'€Sy´×³Ì÷(õ×!ÑÙß0¹IyÚÞÕÉ‘0Uä b i9_a3Jdz%è­bœ¢á‡îÈŸº?£êÁznøè3)C©¨‚Tß͇͗X{„«Ýóò„Ä¿'‘GÒN1X!œ¿|»ˆeÈÜfuaŠI*uÂxÓ†…|ëkbzÒ™Yr…€[ô&-ˆS}ŸtŬ¤¼|bÊ¥xÔÃYhs}¦K/œk$ø_žÈD1Ëý,„)~UÒ28V'펽lO Ù½»®~°«Ñ¡ö;ñè»>=c¼'¡f;~CŸÄO? ]ÔzyA÷ e°€ÆOæLȽ’†_Ìè÷ÙRupA·lƒ"ãWÛ/VEŠÔhš¦uÆO¡ÿÛìûN 0¼ûCþ·Å€ ‚Ç=ÒS]0lŒ.ÛŒ̼µ?‚÷#ÓÃfžÉ“N(¶í;Â-)úþƒñ§<¨2*ŠäEö‡$[^¨ƒìã)VÀÈZ3H3nN`_$ïƒ!JØÇD´íèbßû3|d¿5çèƒDÔ‚©Q°å‘ܪœ±ˆ&ÎÝÆþAƒÊ¥8SÔçuo”÷•{„.‘vÏØØÈN÷qoxaû$„cbroÛ»âçã‡tÏúñ5…LœU(7€õûBßêcòZÜ)ï……¡¦k@GØi< :csÅ€„žol†3î%½Å_ÿ*[/ñ¥Ñ¢]2†¥ÆŽ~Ì}ª}QhÙÇ„:Ië‡ ¤ŸûH»fÞ]æÚå±DÈX‡Hëª} D[¢ù¼…RfÝ͇! (#.Íe8 ûð¾À§—®ÁS‡—ä’üWƒWök“¼,õv›DËÛˆ;ü%Ú‘Ž¬Ð™•P1ÌQ“g}좈H³4I×ÛVáËô”éâ{Ȉ”`^È+]UŸÜ¿îZù||‰‰Z kÏŠ Ÿƒ,ÄHt³oòèŒÊ+‰o5MÑÑ–¯ò2HmŒÁ7zC‰‘^ƒ·W* æ)±ÊÕ÷kŠí$—½¼mðòÅ­ù¹ÓSŠm8äáÌzÓq}³ë1QÔÅ6š¾‹î¡¥½'¢(ÛÇ;ô1tòÖ‹Íq%ç¨gy9ÃÕLÓ7þÚ|†‹N5 ç(åR¿ÏŠÂ‹¢Q¯0‹àìηŠ¨ TY…³ú¯S3·u‹è¶ÒåÁ‹LtCfÌ:r[5>>Œj`ñ*uýiD4‹gÓ &)vXŒoÍí4©?j9ÞïÿÛ¡$,š÷Œ…x¢k©^8ŽÔŒÑ¨ BÿÀ%Œ•R$ì°Ž÷Œaíµq‚I.è’¹=Œ´““(ú ÙR!K‹Ut ÷ŒÂVñ¿‰ôÝgg€Õƒqx•A 1”Lê5ÁNçÁí´ýV2oï“wØ›p²3Рûa•}åu|‹¨÷³­6/‘ëOùhòæ=ò“h+GXâ4 ©ùŽ CÏ9”ê°µè8TÊb@X3Ž®qi3?1(ÐQÜ„%XøoŽ&×oÍB2ß ë»å9 ^ሎ-Þu²‰ö!ü‰~-"ât‰'ŽÎ…7’È´}öÜ  %|án^r{Q&ÝEZúOY}`;¶p!%@¨Ô¡-U“ cjÔŽ÷òö4z!ŒÇ»ÉøƒÿÉŠ“ µ` ý0±Š¯ÊïÕWÌÕ[àÍ°…#Žr¿NËl‘#ÏþHbäÁ³éizNù’•„+mÇÐo¡¸M¯±8$ Ù’ÑêKÈÂêÍtCÛcõ“ñÜdo“&k\J8xp½˜#‚ðÊú•±§“ˆ]ãÂM›«¼v·é×Üú˜i6“éÊÚÛßDEÓ0L’ª8…b‡“þAo#=•4.ƒ8®Ý¿Œà¡¶×Ðæù»•©{ù¹Çñ ÛØ1ÙÄ&Af±as–C¬épâv\ö õq¿C(#íõ–UÛ%×¢’Ü`ÕL?¨ÖO‹–Ö%_y0õç]ªð£×zÞ[©Í\–݉Î7àИ(ñ»ZRb—Ö‡É2¶÷7ô ©˜YôTH–˜çmi;n~Ïiˆº•ZJ¢àᛘ¼² “‘ëÞ$ùëDðÒ8û«˜ýy›IÚ¶z92ôu«F™ ^? Éà(ÂÀ ’±â"7ššS! SG¬è|Æî‡: `¾öykvšê’Õ¦…&ͳì߸–ªÊñ)…»›’üàÆ@Í32óS`}ß›: £ ®Ü¬pòÒ-#ºÏËÕ›²¼æ2‘xQÖ(‚IèÉ b-÷œ/I?»62·uûE¿Îüf§¸'ø5ÈV˜Æ+æ“ ÌC(i£ëž‰¿òã P5Aס¡Ù5®&ð4l¼¶cršèQ¡Š–(¯ô€° ¢²~Ï ¡+šÙ9¼[RTdJŠ£jL ^b¡ËmÍÕÑ^.ï•0ëÚ3¤D¡ýt.Bô€À—úÀ/ &À‚zŽ¢±±TrãsÃGNM©],a¢ψò¼–†’ª“½Þ`CYDD¦£“ìø…E÷hݤÚÇCôtüd £ÀÔ"ŒQ·‡í$¬çÊâ Énˆ£ôX ÷>ç˜Ý”=öd T+Ó¨ˆ¤¨ÁÐ×ÓxðyÒ†}7æݳÚSܤغó¡#tÓa¢*ÌÙWMfK¤ðüCö°ü> Ä4ÁÎù~3©‚¦Šã>eËÙ㛳k7;#Óp;¦ØÍIhÌþÀ2ÚÃ[µcy)¨s¾â¦ÿ¶a”›Í­<®_Ä g.ä§Â>üHÄ3oȬÙVjBէ»"e…ÖJÞL°-‘—@ÑŤÀ¨<ùød©5oùåZÓp÷¨rî:½¶þ¸®-ÝÀ®9œÀÿ§¨y]2©êQ Nê—" ùÖ±N•u¨û«¥(âøWÁÈü³ ΢Ÿ×,© „¢ùèž×íÍd«•jãfI`EÝ©-Õù0 p¬6ò*?™»L¨Ýî©.XÅ©P ÿÛJHjétþ½Â¦dþ©i7’›Us[ y©þ‰CB¼Z« ‘kD¸ì8ð¥s³ª°RE):%H2¾ö:ùW‹ªXʱÈ>Oòù½)ä8w{諨ތ¤‰×ÊF ¾6µ»Øó«¹T[¡‰:&­ÆØ*áäýñC·´QŸ¯§ýŠ¹ëz^Z ²-é›r²]´¨ŸŠ%èÊ€<òˆ¶˜i7å@‡µJҒϹ-Ix½ÂÅ8çÑð¦µhß´\¥ 4³_·8¡üµrÝá+çézÇáÌãçMKУ&¶ZðëcÊ<Ån«FØYÙU<–¶–T.ÀVnîôU‹¨Ç¸Ïûõß-·lAQùë 3#ðH¶*´K·Íj”—ËãýEûí½¶‰Õ^‡·ßÎøþèJ—Ö¶{µdãa÷Ѹ ®¬Z7^šw‰²¤â&å3Ó±¸“ Û9"'ï×Ñ<OLý,MÍܸ©œgâÈ΢|§&ÜùÇ„ƒ=#¸ã¢|Øø ö™tG<^W¨˜j¹·¤Og&y(?»·µj4£˜c£–C¹Ñy˜SîõÒn jžÄ§¾‘63ýºcÒIr½;ü{Jäáµ?KË#ºƒö5“ÂÉ° öy nºÄƒ¤uç+…ß ×ßW7æ”·»…´ðã¡âœ“©5×¾‘»"ÞlÞøÓ/p ÔQÃK=0g»F’ØAÌl®Ù!£tyôúÖ¢Øx»š† hÏ9…Û¼o;»6ýÛ5»Ÿ…iÝI${ ç7ä/°øi:½‹¼Ž6á[‡4)4w¿DÞºƒ`ˆ½<™í Ýú!Kâè“kª½~`£.è~î¡Ý?€Ê0ïÙS½“ª”¥üX©6·~±ÂPÉ Í±½–)Ö DšU2¦Š°Û׳¬-ѽ¼qAùQLí¼ÁfÄÕy\ß¾Á½RûLJët*‡üëäW ¾"àâ ¯±fÐw†?‘…Z#Ö2¾8y³D•‡ÑYBÎ(¾¸›ú‹²¾ë·T_éJÈ9V©¯¡hïûOºk¿ Ø`ù© Ph™pæ¦IýÝ(?ÁrÑ˦<Kšê Ç™ýTÞ˜â{Á²!ó'RÁÿO—&]Ò—¼#Á² Ó¸ë PœþcVÊøNjØÁöÄ–„†®5B±]º‚å}úél‡Áü3Ç™îú°IÉ5ý•Â—^’ÂþA¹'¯A9|†R±"è&æÂàQÆ|švÅgi4q%bÏ÷Âz ãO0‚¬¾l·mÌH¯—¬ªÂƒ_ë³ ÃnQç,$è1ê1ÄÂÄÿ:B-á3PóCÅž`““_wæj^sóÞ™dÞ]ÉÃà“·'Ìlx>xÇ&¾CÄ3Qœñ !„¸=ÇÑ“¥JnÄ@‡F¦&î8xÒà ù~.„'ÄÒ?§Ìm½êP2‡¦¢ûóXüÄæ²rÊmˆš,QRË•¹;‰¡$ɼù¢{Òó´é̆zX¶Óe™ üÝãÈw©¦Óp¶ª1ø|\ÏÖëI¨€|{ûþÓòþ€á¨cðb¿*‚PŒ¡²ÓþK–—Æû|PÞ4Öô°Î.‘\Ô.ƒ‰ÉÑ]"ŸÄuØMî”VR{BÔÇ$À§WÛ -¸û'ÿ»¸ÈÕÂÄâbÛk4½fã ¨ûIØ´åLîŠü-ãJVãÒ+¯¿­ ÙAÛS„º˜{ Å&¹[uÂ@+ÀÚ8D<²W£»¾J×õNãõiq /çÚáêÎÅ#@P[à„f]íA–ÄÛ.ÜÉÅ0ë7AK¶ÀÖ>{ãïÇÛ’\ê óö~á> Z Òü<ådÜœÚ,­UØ|1’,Ø9GOÜ=¶(ä4·úÝ¥²w Ò¨°t¹Ü¨¡Ÿ¸±1@ØL +Š…q\Üí•Î ½°[^ôØd `ÛauÞÐ{¦yz1S1n™˜³±›,ý¯ÞÑš$e¢úp Ô&E RjÞýQ ¶ŸjQcHEœiÓ³aÄÊ'ßE8d1÷ºº1¬Ž$-‰‚†7 ßM–˜0 ?ÛïÊP¨«¸Mø¶ÿÌà‘ 3þʘY®x©ã¨þ€àÂbÀ›çþà%”ó| êØw|àÌf²MKÍaÏé)ímÉ­h¦#¯á]R*@Ï?ÐJlé§c3åUá|ñ‡7«µØéöçȱô%ˆCáŠeNÝÅÞ”$ÄOÔÀïæ—IÞáË£"·hÝ)r<Ž¡™ö¢BñáÒš¥qãûcpzÊÉ_¿hŽñûâ\¼ b{mŸzÁÿmu‘¯ U/âûsq'­­ó5WHLèµ\„¹ôã@Ê~éÝ/bJ¹ |ù­ãua=@idí«ËjÛð ½è ôåXĽ%Œú)“–‹ÇºÚ”ër˜åÌc(ëÜؼKL+kôRñwH}æ6ö!;í³]­*±rõãñANPªòæ }ÉGôs¥oÜYñ©g«ó>§æ¢Û6qg{û®¢,ð¥É Jç œƒ"«Ô̘ëJ´ %:Рç8 Ó Yp¸¸oê9dãQçC/1 ÀoùÅG–!ülYHy^"çŽç«7§`ÔkeÖÐس~N›ç®8cÇÊæõ¶n¨3)9eÙ2[çàkC/nŠ‘pâF aèWÆ·PwÄèâ*¼gûš²·¥ÄöN±¦Òª¥Þè+>Ð’²Ü§xAÌ}ÀàÏ-5ÅèsâúÈ£^r»Îa\w«'=ÿœ!èö%€å›R€n\E»e˜ÐÒéçú­ÁoOh1·âü:é¿Àé)šŒû_ƒg9¾†1~¤O,ù§ézmôõiNü_šAgWÞ€ë}&Çw«ÇCo%o…Lnƒµilfë»7q÷ånˆÀŸ<ÎÁîWH¹CÀëù=Æœ‹‚ÄÝÉÜnhaÏ3ëþPG³=D{©ˆ€É×G§†ŒÛ˜CìTñ?ªn£·.ó‰Yü©n¬ÿMlìeQš´´ËºQË{öQ>(V#ÅìÑÒ[îr‘„x>Þ¼Øþ« GqÄí: íó Åà`\ kLƒõï´W]íOkêÖc3%Wçì a³H«ßÆÌîbˆìÉæ*ch™˜s-Ñ·ñÞËîë_bdI€*ý{4̳&9¤²ïJ“ GÃ0nÈ$…¯§ñM¾²º~ïjCœ#§®ì¨Ò:7Lƒíš/Zû¨ïúFŸ§r<|XÙVXŽÎt‚ð ²ðó¸WÇ-Ûߟ%ºy‘éðÁÿ—eg“ÀnÆaŠ=_¶2"âð.'Û^¬û¥®jKdR:¡Ÿ´„ðè(&YF8z/L ½£L8hósÜðêêʱ’ñ‘6}3Í¥-&ñ#Û(¯š£?hiò“Ñ: xx·ŠJyÇ ¶oàaatK2©®äf— —Ý1&_Î*M[†“†¯)(²êÑæçµhÍõª®ÍŠÂâÿ¹.}‚MSTk5ÞBËf¦^Å„]þ:ñ`Vï¨+0DË(nž£]ø]‘]-G¹œèwøÍH)ó)T'tívc¦}µ·A‚†OjÝ!jdˆi ZúJ ÊBc,KK3:!\ ‘˜íR¹6k{ᶪIU†ôÙ{V8œPt?Ž¢ æ®Vô‹Êu;ì†*ùõ€ÑJl–tAo¹5´ lp‡Y«1¸ Ð@*Ü/EoçE"“OÚƒKIñ)ßöÒ©Iœ' Ïhô3¸e) ù³ã!¸”Ø_#f[ú'±rr£‡,᪡,¾¡{ÖÙDµ}û‰M+NaÁ&€j!‡¦Úe©§aÄüUƒ 29q!ïXR‘oVr¼`.ב})˜¨Ñö^Ž«—´€Õleùk+¬wT¦Œ*9ågÄ$´ï†Ùä)™ð©fl;*ÃV¿Ö¿+ÊiŸž…_Óü?›7~òÀYŽ‘UÅé‹3w»v*—Ù¾ Ùp…ãÄdåãþkä!0˜¼HZæ[vjÇbDú÷·òt0bŽŠƒjê² -í-£:_&ùÊ‹_EW›JÍ°ó)¨ ¡ÀÇäÁ+œõ‹Q6Kçà’YÖYã@€/ìŒÃháš…k‹ï‘ŠA‘ªÃ*¼#ÆVvñJ[f)Ž?Y-¶z*‚ŒRŠîlNÂYç?¬º³ŽjC¶7†œö°å¼æ‡©ä—ÃeÀƒë'œ‘YÅaß”¯z춈êÂ/u2j_p2äÓˆì:?èL°™ôéo±$<ŸÝ¯|Ädz[vÓ ˜®/_QªéûóL[0¦\Óíe¾~{ôÇ÷s#ùHc….êsêÎÃç·YS‡ätï+ðÄÁh{ìUÊ U¸^Èü2VµÏÓ/âÒ@?ÑKË!xÂMfþ2îLgÝ`ÐgüÇãÜUY섨\b&ÉiCd'~ÅcÖy¡ÿ‘Hî@b7¡º'ÄÎ’ä±ÔÂ5_”;tp£.Gõ™Ø¤S¬™-·¨Jós¤ ±ã\/ª„n\xJ'¾‚…0î©G§íNFŽqÅ(¨‚U“ŸòwæՙѓQ)º|ºho,Ÿjd ÍI}"3ñ’65V‹è­Ë4ˆ ‘Š­›ü´ ßUPçTø´tˆÊž¾ÊhfèG|“fõ¡}õ¦Ÿ˜‰v‚Ð^¸O,¢°-iîÇ&UV%F)Þ·4‚¤ª(ëæÀZYÀRZ.}«æáÌKƒÉœz»Ír¨n`ÔÚ»`i¬nSÛK‚­€ˆàŒkµFmÌulæRokRùªû‘º_NÑ 6#¦X vŠë8<ÏvDjds #Ÿ~r¤–ËÂ@;}Ô–‰‚n²7™äª67âïÚý«‰ÌðP~Ò8/¡ø´}ï]Z¥Ðä³Ëi^kM$磎â?¯P;YÉ{Jvô÷ÿl&9Á€€¸Ç*Š;†ž„Å÷ï"‚_WÛ DŒ:¹uˆ±EcÙrTjxêÝŽh´ç»· °R™d ŒÈCIÛêzÙ"Ø¡ Õ‹U¸á ¾%$.Uv\­ÁÔ~à .éDj¿pÄ“¨6èOVØë] F4B"i.ǦYiÖ7Ì1.pna«ùem²×¬¿rrÂV®¹ÍÔZH(8<#P¹Ï` (8•jÇdlá"L„¨r½Hƒ@;Óùi—“ðªêYJàòÉ¡„cöGFy…Þ~ô»Tòø‘ßû˜òð'ì`°Š&hIc˜w•Ó‘–Ò†«m0”)ö Júê î iâþ£ È)àÉ1ðG<ôs¢âf–[O–ÝŽ±píÜB¸ðþç6 Ùùoú+4@°:C»ö@éUòõUhæjõQsxA«Ë0e8Uîºç‘mûl<ˆ }¬çgš£Bã]hE¯¹(‘2 •ln)ªeR¦O©rƒ;ŸwtP ŽçÁÔ…˜$‰²ü_PJi¡y:£Ñ˜×n´Ol2‘NÎp 9N¶'ߪÒÄ.‡wNí]È€ (TØC•<òm·$Ýic2•£W%*HJêÜY6øbô<DCøõ 9æ8ݹê ,G¼1z 'ÌioŠi‘€„öµ—ÓqX•OÆ‘J¦þH)Ý°ÙªˆHp'¼S´êê#TFâ½I˜ë–vB>·»'¯²~ø~}hïFÙ¥²u‡õKiC8D®sÎõ ´OÅþŸy8ß¼ü8˜üæDÅFoÕ]wKì t|ëœ)x€Ðc'Ú e‡µö«EçnZ"`ÔµóâÙgŒn3¦ó9ûTHxk9lÉç{C»}J”8á»1Ò¯yãÿÅvÈ 7Õo>“!¤tz©£öŒ²W `÷ˆ²tgø¿r)“n ÇhûØ/G‡t|[ËÄgƒƒ….û+)dÞ²€3#.\²:BNÚigvÅ’³>Žòöë«¡>ñš‹%äÁï”áŸ[µ¯R± K2ori‡¹A5n¼ÞÇž„Õ‡ær¹Ù€¬á 4æÌ 6¿-GÞÛÝ$ÔcÞ ŒŽ4+¡1ˆcµ½#:àd|¨‰Ê•CÙ-ÔTƒz• ü²6$ús®0Γ¤ú2gªîMƽé(•æú·>nÕ7ƒnkËŸ°‘’Û¥K”>r 6A©fßæ<±9ßñ÷_ÕßÒbáÃõÙPjAѯêpÙú‘Ei”ûªÅÈGšàÑÁ ühqÓ£–ï÷ãùòü iV7$eY¢¨µÍxœß9ŠúÑ áPœÅ¸×y¾úá6UÃŽ|&8t"γÛDbwe¦’,M˜#![nûPíÞâE‡YJ°7oE“äÇZú“hGÂñ‚JÓªÖÿ„šHÆ??àìxFîØöÿÁö¤Zîù0w¼÷ƒöú¬©Î\×T3ŽrøÕhZƒÎÅ@çLÕ–“¹Oø:ÝÍ¿ŠïmÏ%¬Wª²ÔnžDÛ!¾öžÈÐ…¨lf8;œžwÑåôVurrŒLÀ¤’V#”œ~¦Žô`‡®Õ;Û¼˜&4õ•&y©™ǃ÷êÓÊŽ]ÂË)3.‡lFPÕóÇ=ᑸ :ÑÐ{Œ*Æ°A––°¾FÚ·ZÛsF–€%ÛÆ3¨ó»Ó*¤9#DZï»>„ »ÓåÞ˜ÐÝpû­°Ï{^³G–/ W’é¥q÷·+Ü"…]ƒªÑõj‘•E5Žß;>÷ýÈ çxŸÿ @¢AÑŒXDÁÂÈÞÁí^Û¦¤ÙcÍ `d¾ɳØsÝ8Ò†·ÕÈ:¤¤éØŠ$PÔÙ¸¢¯@ýÔÃ?Ù ƒTbŽÑ(<½#[óQ4í†.!Ô;ßv/Š’:Ê®Ùàô°Ï<ç†ú^™â8u) ]ãÌ_Èýf}[•2CîØ!_©&Ä,:;egKõè]fÙõ ¾¨Î)\»Ø›q¨Ø …2ÏÐËÛôØMt1{éÑ^b®ý†uËô·Ä†óÕ ö3Çj™ÈBdG O•‹WÑ·ïÏßÂ3.BmsUoYæŸ ñU‘ ²ž”$žp<Ü +WŽðé@2z¸B9²ÛI>*¡N¿Å”Ñ6 (Á:¬Yn9±äG›´Ò Æ@ ™÷Ó­ÂJ'wž /ÌËuºÁÎá"ûÞÁ+ø¡7ÐàJ½S¦{ˤËþÒÚå Vî¨Ç[$Ü÷B`œN0Ø8ØFSäj‹2ŒÈ^›;3,c V¤m‹?mõ=ÓLŠ¹Š‹™š‰ÖÛžEjbòoi;9ãÉä<õ%ì=éE¦a'­2 4/‚à¡Žrö|¦ÑõñÛ/ ÁHl¿ý8ä;Å£è® Ú¯8*G‹ñæÁŠäJè…JK26@YƒÄCŽCñÖë6yå3´‰U¼A †|ÎÛÙÊ Ê›ý¹‡Â_:Xï{Ð-6VìZ8ž…BV{ÊÏH)¸z€:†!¤&¦»¢ÆµõÙ£/ ŒÄÿQáAì.Ð9ÿƲ٬õ°¤‰ÄÜ/wR¡ó\OÃÉ4‹Qó‹%Ïî¢ ÖT‘?j¯…ˆŠïÕ}¾øƒŽŒÂ)«‚3“töÏStˆpU­D£<»*Øøm¢ézYAW±#:³ºâèôJ¦ºbåðvíöŸÌ=¼ ŽíóÒòÿÁò3ĺÚ)F¾£³Ì©ÅUÙ:$–Õ!åZÙºÔÙ‘õNX ‡$iì£á9¾2È:£”@ôàu±ÔªÞÙ éc;عP¬Þ©gl…4æ^Î¥Ž.9áÄC¢"éRê åpFxéò-Œ ÁhÛ…žáÝbAíoêŸ84 (SïÀ Û/¶‹U?Ø—î&µª™Â£)ïÖzæß©—òì˜ 7|Ì£ê6Í;W<0?4L5h¨ÉJK Þ<nÁ†YkKöIš€2Uýˆ÷%T¦ØñBÁ“ŒÜ Z èjÄ ×(˜e®4¿±ùóþçjï ߀¡j§b @·£äЧ~0 ”ı~“"†Î4ÎZ7ÎôÛô1,ße#,:hÚ(éªoÔåZL–+°½´,#¯í¤êÁ]‰“¤Ú[&³É²ú.› ŸwiringPi/.git/objects/info/0000755000000000000000000000000012457032556014602 5ustar rootrootwiringPi/.git/HEAD0000644000000000000000000000002712457032563012637 0ustar rootrootref: refs/heads/master wiringPi/.git/hooks/0000755000000000000000000000000012457032555013340 5ustar rootrootwiringPi/.git/hooks/pre-rebase.sample0000777000000000000000000000000012457032555034616 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/pre-rebase.sampleustar rootrootwiringPi/.git/hooks/post-update.sample0000777000000000000000000000000012457032555035256 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/post-update.sampleustar rootrootwiringPi/.git/hooks/prepare-commit-msg.sample0000777000000000000000000000000012457032555037764 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/prepare-commit-msg.sampleustar rootrootwiringPi/.git/hooks/pre-applypatch.sample0000777000000000000000000000000012457032555036426 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/pre-applypatch.sampleustar rootrootwiringPi/.git/hooks/pre-commit.sample0000777000000000000000000000000012457032555034674 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/pre-commit.sampleustar rootrootwiringPi/.git/hooks/commit-msg.sample0000777000000000000000000000000012457032555034674 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/commit-msg.sampleustar rootrootwiringPi/.git/hooks/update.sample0000777000000000000000000000000012457032555033310 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/update.sampleustar rootrootwiringPi/.git/hooks/applypatch-msg.sample0000777000000000000000000000000012457032555036426 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/applypatch-msg.sampleustar rootrootwiringPi/.git/hooks/pre-push.sample0000777000000000000000000000000012457032555034052 2/tmp/tcloop/git/usr/local/share/git-core/templates/hooks/pre-push.sampleustar rootrootwiringPi/.git/ORIG_HEAD0000644000000000000000000000005112457032621013447 0ustar rootrootd42e831089c9d15d229fc475d84dee9456527b42 wiringPi/.git/branches/0000755000000000000000000000000012457032555014002 5ustar rootrootwiringPi/.git/index0000644000000000000000000003112012457032564013244 0ustar rootrootDIRC–T¼5t$ᢘT¼5t$ᢘ³+^¤ãeÅʈ¦|0¾ÎàZˆÙd°8bùCOPYING.LESSERT¼5t$ᢘT¼5t$ᢘ³+_¤®Ž CÏ9”ê°µè8TÊb@X3INSTALLT¼5t%z9T¼5t%z9³+`¤a³9IN·ñç¿ÖÐ’²Ü§xAÌ}ÀàÏ-5ÅdevLib/ds1302.hT¼5t&ϘT¼5t&Ϙ³+¤ÙΙáh€Ñ`µ"HöE0×ÀLSZ devLib/font.hT¼5t&ϘT¼5t&Ϙ³+‚¤Zêï|c|ë•¡H¤äãh§ˆ=|JdevLib/gertboard.cT¼5t&ϘT¼5t&Ϙ³+ƒ¤Ì?¡‘—Bm¸}óÄßàb¸nâÐÍødevLib/gertboard.hT¼5t&«fT¼5t&«f³+„¤-lGIHýí çXàËŒ²'¯ß‰ devLib/lcd.cT¼5t&«fT¼5t&«f³+…¤/ YˆÃ/ xE<^²Ë¾“A5â¬c devLib/lcd.hT¼5t&«fT¼5t&«f³+†¤9ĬÍ\:uþ== ëT¤ ºÔ  rdevLib/lcd128x64.cT¼5t&«fT¼5t&«f³+‡¤´H»È? []>Ø*áäýñC·devLib/lcd128x64.hT¼5t&«fT¼5t&«f³+ˆí#ê¿€¢óX6soÎÔ”…ÅÞ4ùÆdevLib/maxdetect.cT¼5t&«fT¼5t&«f³+‰íò¡ýt.Bô€À—úÀ/ &À‚zŽdevLib/maxdetect.hT¼5t&«fT¼5t&«f³+Š¤ ÖDuÇõ²…éȤ_UÌÎa'XéáLdevLib/piFace.cT¼5t'Cü˜T¼5t'Cü˜³+‹¤‰Ie1Dì(’¸±œ oiîÂÁhðv´devLib/piFace.hT¼5t'Cü˜T¼5t'Cü˜³+Œ¤Z Þ†¨‚ÙÃ,nY" t./devLib/piFaceOld.cT¼5t'Cü˜T¼5t'Cü˜³+¤ ¥DãÛŽV8ãÓí³§â²’¸¿N4%devLib/piGlow.cT¼5t'Cü˜T¼5t'Cü˜³+Ž¤Τغó¡#tÓa¢*ÌÙWMfKdevLib/piGlow.hT¼5t'Cü˜T¼5t'Cü˜³+¤ c¡Š–(¯ô€° ¢²~Ï devLib/piNes.cT¼5t'Cü˜T¼5t'Cü˜³+¤¦‰‘^ƒ·W* æ)±ÊÕ÷kdevLib/piNes.hT¼5t'Cü˜T¼5t'Cü˜³+‘¤ãeÅʈ¦|0¾ÎàZˆÙd°8bùexamples/COPYING.LESSERT¼5t'Ü“T¼5t'Ü“³+’¤‡—ä’üWƒWök“¼,õv›DËÛexamples/Gertboard/7segments.cT¼5t'Ü“T¼5t'Ü“³+“¤œui&U J±Tátxì ¦r­5examples/Gertboard/MakefileT¼5t'Ü“T¼5t'Ü“³+”¤‹_vvA!ÁБˆtà°b“åD¼˜Z·examples/Gertboard/buttons.cT¼5t'Ü“T¼5t'Ü“³+•¤ r®ü±$Oïxjž(½ãS½1´qexamples/Gertboard/gertboard.cT¼5t'Ü“T¼5t'Ü“³+–¤æqØq„櫯L彆T Õ­%‰examples/Gertboard/record.cT¼5t'Ü“T¼5t'Ü“³+—¤€Y…¡"Ï:@g©¼ÖìÇ€ examples/Gertboard/temperature.cT¼5t'Ü“T¼5t'Ü“³+˜¤uÄÒ?§Ìm½êP2‡¦¢ûóXüexamples/Gertboard/voltmeter.cT¼5t'Ü“T¼5t'Ü“³+™¤ î–C¬épâv\ö õq¿C(#íõexamples/Gertboard/vumeter.cT¼5t(u)˜T¼5t(u)˜³+š¤ÓÉ–}Ä¿ [áĈˆ‹4·ºýyexamples/MakefileT¼5t(u)˜T¼5t(u)˜³+›¤~ Þ3Oý·—M #õE Ö86¦Ÿìexamples/PiFace/MakefileT¼5t(u)˜T¼5t(u)˜³+œ¤Çÿ¸¢ãE5¢®ÍÄZ^7y±IqØexamples/PiFace/blink.cT¼5t(u)˜T¼5t(u)˜³+¤ ûzKÛüІÇt‰{ ¶­qõexamples/PiFace/buttons.cT¼5t(u)˜T¼5t(u)˜³+žíÎO¦õZW^®§( *2ux¬Zµexamples/PiFace/ladder.cT¼5t(u)˜T¼5t(u)˜³+Ÿ¤ w¤¨ÁÐ×ÓxðyÒ†}7æݳÚSÜexamples/PiFace/metro.cT¼5t(u)˜T¼5t(u)˜³+ ¤ võS—é’û½‹]}ÏiNdWóexamples/PiFace/motor.cT¼5t(u)˜T¼5t(u)˜³+¡¤ÙP„P€ „T«T°žE¬R_/˜examples/PiFace/reaction.cT¼5t) ÀT¼5t) À³+¢¤@1”Lê5ÁNçÁí´ýVexamples/PiGlow/MakefileT¼5t) ÀT¼5t) À³+£¤ÓþK–—Æû|PÞ4Öô°Î.‘\examples/PiGlow/piGlow0.cT¼5t) ÀT¼5t) À³+¤¤µ  1ã?»˜»UÕÞæÖ†tÎö¹examples/PiGlow/piGlow1.cT¼5t) ÀT¼5t) À³+¥¤]æ¢Û6qg{û®¢,ð¥É Jexamples/PiGlow/piglow.cT¼5t) ÀT¼5t) À³+¦¤a3&;Wÿ6g¥_BX¶eJƒùÐexamples/README.TXTT¼5t) ÀT¼5t) À³+§¤³Âz ãO0‚¬¾l·mÌH¯—¬ªexamples/blink.cT¼5t) ÀT¼5t) À³+¨¤¦ë}&Çw«ÇCo%o…Lnƒµilfexamples/blink.rtbT¼5t) ÀT¼5t) À³+©¤ÚwU86ìz§‘Ñeïè‘ñòes¤Àexamples/blink.shT¼5t)¦V˜T¼5t)¦V˜³+ª¤ >ɳÕï(Q5Þš}ív…ÜB«examples/blink12.cT¼5t)¦V˜T¼5t)¦V˜³+«¤ >náѹç{êâna€±ŽEè,examples/blink12drcs.cT¼5t)¦V˜T¼5t)¦V˜³+¬¤ j2ô’%{#‚p9z…ùÎ\oùþexamples/blink6drcs.cT¼5t)¦V˜T¼5t)¦V˜³+­¤‰`-<–TׂùVñ!ÖK¹bûlexamples/blink8.cT¼5t)¦V˜T¼5t)¦V˜³+®¤¹šS! SG¬è|Æî‡: `¾öykvexamples/clock.cT¼5t)¦V˜T¼5t)¦V˜³+¯¤ FL‹l¤•³b¾$d¾ó_l˜examples/delayTest.cT¼5t)¦V˜T¼5t)¦V˜³+°¤ñéârMñøc1žó@½Q: Ñexamples/ds1302.cT¼5t)¦V˜T¼5t)¦V˜³+±¤ó‚÷#ÓÃfžÉ“N(¶í;Â-)úþexamples/header.hT¼5t*>íT¼5t*>í³+²¤ Ù¨rî:½¶þ¸®-ÝÀ®9œÀÿ§examples/isr-osc.cT¼5t*>íT¼5t*>í³+³¤ ú«Æ®É”üßwOlæ×])–½:examples/isr.cT¼5t*>íT¼5t*>í³+´¤ŽGɹ²\| lïŒQA^JýðÄexamples/lcd-adafruit.cT¼5t*>íT¼5t*>í³+µ¤GQV FŸIànu“à|Ûdúàñexamples/lcd.cT¼5t*>íT¼5t*>í³+¶¤½éçú­ÁoOh1·âü:é¿Àexamples/lowPower.cT¼5t*>íT¼5t*>í³+·¤Ã1ŽŠûåÿ—1š|ÔÍÚ;Ñexamples/nes.cT¼5t*>íT¼5t*>í³+¸¤…“&k\J8xp½˜#‚ðÊú•±§examples/okLed.cT¼5t*>íT¼5t*>í³+¹¤lƒ"ãWÛ/VEŠÔhš¦uÆOexamples/pwm.cT¼5t*׃˜T¼5t*׃˜³+º¤ ‚_jÇíFÍË•ûNÍ‚Tihexamples/q2w/MakefileT¼5t*׃˜T¼5t*׃˜³+»¤e<˜|jÂPnímWÍ l['f­âexamples/q2w/binary.cT¼5t*׃˜T¼5t*׃˜³+¼¤ÇMÔ'epYªGŒ’¥ŽæO4[þn©examples/q2w/blink-io.cT¼5t*׃˜T¼5t*׃˜³+½¤’b¶”§Ï)·ë&ªçוm4ìm=‹examples/q2w/blink.cT¼5t*׃˜T¼5t*׃˜³+¾íæ-îlsgÔØÕœýœÈ;…Fa.!—examples/q2w/blink.shT¼5t*׃˜T¼5t*׃˜³+¿¤4#ƒAjbÐœß1XÚ{yjšmexamples/q2w/bright.cT¼5t*׃˜T¼5t*׃˜³+À¤ð/ÚÔálÜr°€(žm]h‰oexamples/q2w/button.cT¼5t+pT¼5t+p³+Á¤Éà‘ 3þʘY®x©ã¨þ€examples/q2w/volts.cT¼5t+pT¼5t+p³+¤3Vn•LJÃûèázØF¹5ñÈeÿexamples/rht03.cT¼5t+pT¼5t+p³+ä°žá“Œ·¡¡kd1žkµô§examples/serialRead.cT¼5t+pT¼5t+p³+ĤË m¥ðŒu,ðž#y*ÿßÂêúRëexamples/serialTest.cT¼5t+pT¼5t+p³+Ťuª°RE):%H2¾ö:ùW‹examples/servo.cT¼5t+pT¼5t+p³+Ƥµ÷­ …St#¶”re©ö`ä —Sexamples/softPwm.cT¼5t+pT¼5t+p³+Ǥ÷/Fx>šÉäQ²h3ÚÝ examples/softTone.cT¼5t+pT¼5t+p³+Ȥ q B³b‘G9±3Àæyg 8êÚexamples/speed.cT¼5t,°˜T¼5t,°˜³+ɤ I𢻦ê˜Æ7µ>„ÉEM”ÈÜexamples/spiSpeed.cT¼5t,°˜T¼5t,°˜³+ʤ²k¶‰'íÔP;ýPWµzÝü˜Ÿ´šexamples/wfi.cT¼5t,°˜T¼5t,°˜³+ˤãeÅʈ¦|0¾ÎàZˆÙd°8bùgpio/COPYING.LESSERT¼5t,°˜T¼5t,°˜³+̤ó7´ˆ}Ë¢„á<ÈììÊ”^ mp gpio/MakefileT¼5t,°˜T¼5t,°˜³+ͤ;á–Ö%_y0õç]ªð£×zÞ[©Í\gpio/extensions.cT¼5t,°˜T¼5t,°˜³+Τ“]'4Œ¥?E–”o,‚#¹ †ÿ¨!gpio/extensions.hT¼5t,¡GT¼5t,¡G³+Ϥ%Wç8 Ó Yp¸¸oê9dãQ gpio/gpio.1T¼5t,¡GT¼5t,¡G³+ФxÆTfØsÑ“yUòµáÄež2„ gpio/gpio.cT¼5t,¡GT¼5t,¡G³+ѤäüÁ¯’•ƒE7~s*ÍV×ÈFP gpio/pins.cT¼5t,¡GT¼5t,¡G³+ÒíÿƒÊ¥8SÔçuo”÷•{ gpio/pintestT¼5t,¡GT¼5t,¡G³+Ó¤"…«¨ÞŒ¤‰×ÊF ¾6µ»Øógpio/readall.cT¼5t-9ݘT¼5t-9ݘ³+Ôíî§Â»"e…ÖJÞL°-‘—@ÑŤÀ gpio/test.shT¼5t-9ݘT¼5t-9ݘ³+Õ¤Óý4î“ Èüs e›e-* × | pins/MakefileT¼5t-9ݘT¼5t-9ݘ³+Ö¤&i½–)Ö DšU2¦Š°Û׳¬-Ñ pins/pins.pdfT¼5t-9ݘT¼5t-9ݘ³+פÝÃu>ž`““_wæj^sóÞ™d pins/pins.texT¼5t-9ݘT¼5t-9ݘ³+ؤãeÅʈ¦|0¾ÎàZˆÙd°8bùwiringPi/COPYING.LESSERT¼5t-9ݘT¼5t-9ݘ³+Ù¤NN3Bà<£TÅ1ü?hx…£`Êz”2wiringPi/MakefileT¼5t-ÒtT¼5t-Òt³+Ú¤Ùd‘©Œ:Ôý†ãîž!],ŠŒšÙwiringPi/drcSerial.cT¼5t-ÒtT¼5t-Òt³+Û¤Ì)éˆáû«'çõáh¯§âéØ쉚wiringPi/drcSerial.hT¼5t-ÒtT¼5t-Òt³+ܤ Ú!…ƒ‘´ç1VV•¥²›»ÁœwiringPi/max31855.cT¼5t-ÒtT¼5t-Òt³+ݤ8\KÓa¡Z%)¢ßáGo&?¾dxwiringPi/max31855.hT¼5t-ÒtT¼5t-Òt³+Þ¤ @·Íj”—ËãýEûí½¶‰Õ^‡wiringPi/max5322.cT¼5t-ÒtT¼5t-Òt³+ߤ¢¢ψò¼–†’ª“½Þ`CYDD¦wiringPi/max5322.hT¼5t-ÒtT¼5t-Òt³+उÒ#xjÜÄ•·»O¸Áé¡åøÃwiringPi/mcp23008.cT¼5t.k ˜T¼5t.k ˜³+ᤡé)šŒû_ƒg9¾†1~¤O,ù§wiringPi/mcp23008.hT¼5t.k ˜T¼5t.k ˜³+â¤åÌc(ëÜؼKL+kôRñwH}wiringPi/mcp23016.cT¼5t.k ˜T¼5t.k ˜³+㤤ùµÌTžÖº‡ôO£)õ"¸¤’(ŒwiringPi/mcp23016.hT¼5t.k ˜T¼5t.k ˜³+ä¤ šê’Õ¦…&ͳì߸–ªÊñ)…»wiringPi/mcp23016reg.hT¼5t.k ˜T¼5t.k ˜³+å¤*QtTµæ7Ú ƒrqÖk­‰ZwiringPi/mcp23017.cT¼5t.k ˜T¼5t.k ˜³+椡y´×³Ì÷(õ×!ÑÙß0¹IwiringPi/mcp23017.hT¼5t.k ˜T¼5t.k ˜³+ç¤:Ьµî_¥Atd_›Ó†þ·d§0UwiringPi/mcp23s08.cT¼5t.k ˜T¼5t.k ˜³+褯ëù=Æœ‹‚ÄÝÉÜnhaÏ3wiringPi/mcp23s08.hT¼5t.k ˜T¼5t.k ˜³+é¤8ÂѾ:–nÁ·Í1õ·wÓÓ9ziû‰wiringPi/mcp23s17.cT¼5t/¡T¼5t/¡³+ê¤;*€ˆ8e5ÈÛÎ+/Œ{|·ÿÚå0wiringPi/mcp23s17.hT¼5t/¡T¼5t/¡³+ë¤êÄæ²rÊmˆš,QRË)T˜Œ7°ÌPZr«ó›ìúIwiringPi/wiringPi.hT¼5t0Íd˜T¼5t0Íd˜³,¤éLJ¼ê'ÒòO„ŒN„£êâ/yàtwiringPi/wiringPiI2C.cT¼5t1eûT¼5t1eû³,¤+m¸Æˆä•u󑚸Aøv%vîûûwiringPi/wiringPiI2C.hT¼5t1eûT¼5t1eû³, ¤!ZwD }ÏŸŽ8ïдRwiringPi/wiringPiSPI.cT¼5t1eûT¼5t1eû³, ¤âõ6—Ñ­RÌùûd;–]‡m=]wiringPi/wiringPiSPI.hT¼5t1eûT¼5t1eû³, ¤cÊ—j™oûÈ”sÝâl;m°Ó„ÀwiringPi/wiringSerial.cT¼5t1eûT¼5t1eû³, ¤ØC Ç1£l3ºÄ´ÿ}zôfÃlwiringPi/wiringSerial.hT¼5t1eûT¼5t1eû³, ¤ë=ùNŠà0òæùCýƱ\ùj·ÓwiringPi/wiringShift.cT¼5t1eûT¼5t1eû³,¤WAšÞA@‹ é¤Qß°è)"ªBuwiringPi/wiringShift.h%é­ Yà3ý# z½'p b|!wiringPi/.git/refs/0000755000000000000000000000000012457032563013153 5ustar rootrootwiringPi/.git/refs/heads/0000755000000000000000000000000012457032563014237 5ustar rootrootwiringPi/.git/refs/heads/master0000644000000000000000000000005112457032563015451 0ustar rootrootd42e831089c9d15d229fc475d84dee9456527b42 wiringPi/.git/refs/remotes/0000755000000000000000000000000012457032563014631 5ustar rootrootwiringPi/.git/refs/remotes/origin/0000755000000000000000000000000012457032563016120 5ustar rootrootwiringPi/.git/refs/remotes/origin/HEAD0000644000000000000000000000004012457032563016536 0ustar rootrootref: refs/remotes/origin/master wiringPi/.git/refs/tags/0000755000000000000000000000000012457032555014112 5ustar rootrootwiringPi/.git/config0000644000000000000000000000037612457032563013412 0ustar rootroot[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = git://git.drogon.net/wiringPi fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master wiringPi/.git/info/0000755000000000000000000000000012457032555013150 5ustar rootrootwiringPi/.git/info/exclude0000777000000000000000000000000012457032555030506 2/tmp/tcloop/git/usr/local/share/git-core/templates/info/excludeustar rootrootwiringPi/.git/logs/0000755000000000000000000000000012457032563013160 5ustar rootrootwiringPi/.git/logs/HEAD0000644000000000000000000000025512457032563013606 0ustar rootroot0000000000000000000000000000000000000000 d42e831089c9d15d229fc475d84dee9456527b42 Bela Markus 1421620595 +0000 clone: from git://git.drogon.net/wiringPi wiringPi/.git/logs/refs/0000755000000000000000000000000012457032563014117 5ustar rootrootwiringPi/.git/logs/refs/heads/0000755000000000000000000000000012457032563015203 5ustar rootrootwiringPi/.git/logs/refs/heads/master0000644000000000000000000000025512457032563016423 0ustar rootroot0000000000000000000000000000000000000000 d42e831089c9d15d229fc475d84dee9456527b42 Bela Markus 1421620595 +0000 clone: from git://git.drogon.net/wiringPi wiringPi/.git/logs/refs/remotes/0000755000000000000000000000000012457032563015575 5ustar rootrootwiringPi/.git/logs/refs/remotes/origin/0000755000000000000000000000000012457032563017064 5ustar rootrootwiringPi/.git/logs/refs/remotes/origin/HEAD0000644000000000000000000000025512457032563017512 0ustar rootroot0000000000000000000000000000000000000000 d42e831089c9d15d229fc475d84dee9456527b42 Bela Markus 1421620595 +0000 clone: from git://git.drogon.net/wiringPi wiringPi/People0000644000000000000000000000154112457032564012524 0ustar rootroot Just a quick note to some people who've provided help, suggestions, bug-fixes, etc. along the way... Nick Lott: (And others) Hints about making it work with C++ Philipp Stefan Neininger: Minor bug in the Makefile to do with cross compiling Chris McSweeny Hints and tips about the use of arithmetic in gettimeofday() inside the dealyMicrosecondsHard() function. And spotting a couple of schoolboy errors in the (experimental) softServo code, prompting me to completely re-write it. Armin (Via projects website) Some pointers about the i2c-dev.h files. Arno Wagner Suggestions for the mmap calls in wiringPiSetup() CHARLES Thibaut: A small issue in softTone Xian Stannard Fixing some typos in the man page! Andre Crone Suggested the __WIRING_PI.H__ round wiringPi.h Rik Teerling Pointing out some silly mistooks in the I2C code... wiringPi/build0000755000000000000000000000374212457032564012407 0ustar rootroot#!/bin/sh check_make_ok() { if [ $? != 0 ]; then echo "" echo "Make Failed..." echo "Please check the messages and fix any problems. If you're still stuck," echo "then please email all the output and as many details as you can to" echo " projects@drogon.net" echo "" exit 1 fi } if [ x$1 = "xclean" ]; then cd wiringPi echo -n "wiringPi: " ; make clean cd ../devLib echo -n "DevLib: " ; make clean cd ../gpio echo -n "gpio: " ; make clean cd ../examples echo -n "Examples: " ; make clean cd Gertboard echo -n "Gertboard: " ; make clean cd ../PiFace echo -n "PiFace: " ; make clean cd ../q2w echo -n "Quick2Wire: " ; make clean cd ../PiGlow echo -n "PiGlow: " ; make clean exit fi if [ x$1 = "xuninstall" ]; then cd wiringPi echo -n "wiringPi: " ; sudo make uninstall cd ../devLib echo -n "DevLib: " ; sudo make uninstall cd ../gpio echo -n "gpio: " ; sudo make uninstall exit fi echo "wiringPi Build script" echo "=====================" echo echo echo "WiringPi Library" cd wiringPi sudo make uninstall if [ x$1 = "xstatic" ]; then make static check_make_ok sudo make install-static else make check_make_ok sudo make install fi check_make_ok echo echo "WiringPi Devices Library" cd ../devLib sudo make uninstall if [ x$1 = "xstatic" ]; then make static check_make_ok sudo make install-static else make check_make_ok sudo make install fi check_make_ok echo echo "GPIO Utility" cd ../gpio make check_make_ok sudo make install check_make_ok # echo # echo "Examples" # cd ../examples # make # cd .. echo echo All Done. echo "" echo "NOTE: To compile programs with wiringPi, you need to add:" echo " -lwiringPi" echo " to your compile line(s) To use the Gertboard, MaxDetect, etc." echo " code (the devLib), you need to also add:" echo " -lwiringPiDev" echo " to your compile line(s)." echo "" wiringPi/gpio/0000755000000000000000000000000012457032564012312 5ustar rootrootwiringPi/gpio/test.sh0000755000000000000000000000235612457032564013636 0ustar rootroot#!/bin/bash # # test.sh: # Simple test: Assumes LEDs on Pins 0-7 and lights them # in-turn. ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# # Simple test - assumes LEDs on Pins 0-7. for i in `seq 0 7`; do gpio mode $i out done while true; do for i in `seq 0 7`; do gpio write $i 1 sleep 0.1 done for i in `seq 0 7`; do gpio write $i 0 sleep 0.1 done done wiringPi/gpio/COPYING.LESSER0000644000000000000000000001674312457032564014354 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. wiringPi/gpio/readall.c0000644000000000000000000002120512457032564014062 0ustar rootroot/* * readall.c: * The readall functions - getting a bit big, so split them out. * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #include extern int wpMode ; #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif /* * doReadallExternal: * A relatively crude way to read the pins on an external device. * We don't know the input/output mode of pins, but we can tell * if it's an analog pin or a digital one... ********************************************************************************* */ static void doReadallExternal (void) { int pin ; printf ("+------+---------+--------+\n") ; printf ("| Pin | Digital | Analog |\n") ; printf ("+------+---------+--------+\n") ; for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; printf ("+------+---------+--------+\n") ; } /* * doReadall: * Read all the GPIO pins * We also want to use this to read the state of pins on an externally * connected device, so we need to do some fiddling with the internal * wiringPi node structures - since the gpio command can only use * one external device at a time, we'll use that to our advantage... ********************************************************************************* */ static char *alts [] = { "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" } ; static int physToWpi [64] = { -1, // 0 -1, -1, // 1, 2 8, -1, 9, -1, 7, 15, -1, 16, 0, 1, 2, -1, 3, 4, -1, 5, 12, -1, 13, 6, 14, 10, -1, 11, // 25, 26 30, 31, // Actually I2C, but not used 21, -1, 22, 26, 23, -1, 24, 27, 25, 28, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1 } ; static char *physNames [64] = { NULL, " 3.3v", "5v ", " SDA.1", "5V ", " SCL.1", "0v ", "GPIO. 7", "TxD ", " 0v", "RxD ", "GPIO. 0", "GPIO. 1", "GPIO. 2", "0v ", "GPIO. 3", "GPIO. 4", " 3.3v", "GPIO. 5", " MOSI", "0v ", " MISO", "GPIO. 6", " SCLK", "CE0 ", " 0v", "CE1 ", " SDA.0", "SCL.0 ", "GPIO.21", "0v ", "GPIO.22", "GPIO.26", "GPIO.23", "0v ", "GPIO.24", "GPIO.27", "GPIO.25", "GPIO.28", " 0v", "GPIO.29", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "GPIO.17", "GPIO.18", "GPIO.19", "GPIO.20", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, } ; /* * readallPhys: * Given a physical pin output the data on it and the next pin: *| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM | ********************************************************************************* */ static void readallPhys (int physPin) { int pin ; if (physPinToGpio (physPin) == -1) printf (" | | ") ; else printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; printf (" | %s", physNames [physPin]) ; if (physToWpi [physPin] == -1) printf (" | | ") ; else { /**/ if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin] ; printf (" | %4s", alts [getAlt (pin)]) ; printf (" | %d", digitalRead (pin)) ; } // Pin numbers: printf (" | %2d", physPin) ; ++physPin ; printf (" || %-2d", physPin) ; // Same, reversed if (physToWpi [physPin] == -1) printf (" | | ") ; else { /**/ if (wpMode == WPI_MODE_GPIO) pin = physPinToGpio (physPin) ; else if (wpMode == WPI_MODE_PHYS) pin = physPin ; else pin = physToWpi [physPin] ; printf (" | %d", digitalRead (pin)) ; printf (" | %-4s", alts [getAlt (pin)]) ; } printf (" | %-5s", physNames [physPin]) ; if (physToWpi [physPin] == -1) printf (" | | ") ; else printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; printf (" |\n") ; } void cmReadall (void) { int pin ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; printf ("+-----+------+-------+ +-----+------+-------+\n") ; for (pin = 0 ; pin < 28 ; ++pin) { printf ("| %3d ", pin) ; printf ("| %-4s ", alts [getAlt (pin)]) ; printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; printf ("| ") ; printf ("| %3d ", pin + 28) ; printf ("| %-4s ", alts [getAlt (pin + 28)]) ; printf ("| %s ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ; printf ("|\n") ; } printf ("+-----+------+-------+ +-----+------+-------+\n") ; } /* * abReadall: * Read all the pins on the model A or B. ********************************************************************************* */ void abReadall (int model, int rev) { int pin ; char *type ; if (model == PI_MODEL_A) type = " A" ; else if (rev == PI_VERSION_2) type = "B2" ; else type = "B1" ; printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 1 ; pin <= 26 ; pin += 2) readallPhys (pin) ; if (rev == PI_VERSION_2) // B version 2 { printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 51 ; pin <= 54 ; pin += 2) readallPhys (pin) ; } printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; } /* * piPlusReadall: * Read all the pins on the model A+ or the B+ ********************************************************************************* */ void piPlusReadall (int model) { int pin ; if (model == PI_MODEL_AP) printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; else printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; for (pin = 1 ; pin <= 40 ; pin += 2) readallPhys (pin) ; printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; if (model == PI_MODEL_AP) printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; else printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; } void doReadall (void) { int model, rev, mem, maker, overVolted ; if (wiringPiNodes != NULL) // External readall { doReadallExternal () ; return ; } piBoardId (&model, &rev, &mem, &maker, &overVolted) ; /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) abReadall (model, rev) ; else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP)) piPlusReadall (model) ; else if (model == PI_MODEL_CM) cmReadall () ; else printf ("Oops - unable to determine board type... model: %d\n", model) ; } wiringPi/gpio/extensions.c0000644000000000000000000003574112457032564014667 0ustar rootroot/* * extensions.c: * Part of the GPIO program to test, peek, poke and otherwise * noodle with the GPIO hardware on the Raspberry Pi. * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "extensions.h" extern int wiringPiDebug ; #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif // Local structure to hold details struct extensionFunctionStruct { const char *name ; int (*function)(char *progName, int pinBase, char *params) ; } ; /* * extractInt: * Check & return an integer at the given location (prefixed by a :) ********************************************************************************* */ static char *extractInt (char *progName, char *p, int *num) { if (*p != ':') { fprintf (stderr, "%s: colon expected\n", progName) ; return NULL ; } ++p ; if (!isdigit (*p)) { fprintf (stderr, "%s: digit expected\n", progName) ; return NULL ; } *num = strtol (p, NULL, 0) ; while (isdigit (*p)) ++p ; return p ; } /* * extractStr: * Check & return a string at the given location (prefixed by a :) ********************************************************************************* */ static char *extractStr (char *progName, char *p, char **str) { char *q, *r ; if (*p != ':') { fprintf (stderr, "%s: colon expected\n", progName) ; return NULL ; } ++p ; if (!isprint (*p)) { fprintf (stderr, "%s: character expected\n", progName) ; return NULL ; } q = p ; while ((*q != 0) && (*q != ':')) ++q ; *str = r = calloc (q - p + 2, 1) ; // Zeros it while (p != q) *r++ = *p++ ; return p ; } /* * doExtensionMcp23008: * MCP23008 - 8-bit I2C GPIO expansion chip * mcp23002:base:i2cAddr ********************************************************************************* */ static int doExtensionMcp23008 (char *progName, int pinBase, char *params) { int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } mcp23008Setup (pinBase, i2c) ; return TRUE ; } /* * doExtensionMcp23016: * MCP230016- 16-bit I2C GPIO expansion chip * mcp23016:base:i2cAddr ********************************************************************************* */ static int doExtensionMcp23016 (char *progName, int pinBase, char *params) { int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } mcp23016Setup (pinBase, i2c) ; return TRUE ; } /* * doExtensionMcp23017: * MCP230017- 16-bit I2C GPIO expansion chip * mcp23017:base:i2cAddr ********************************************************************************* */ static int doExtensionMcp23017 (char *progName, int pinBase, char *params) { int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } mcp23017Setup (pinBase, i2c) ; return TRUE ; } /* * doExtensionMcp23s08: * MCP23s08 - 8-bit SPI GPIO expansion chip * mcp23s08:base:spi:port ********************************************************************************* */ static int doExtensionMcp23s08 (char *progName, int pinBase, char *params) { int spi, port ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ; return FALSE ; } if ((params = extractInt (progName, params, &port)) == NULL) return FALSE ; if ((port < 0) || (port > 7)) { fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ; return FALSE ; } mcp23s08Setup (pinBase, spi, port) ; return TRUE ; } /* * doExtensionMcp23s17: * MCP23s17 - 16-bit SPI GPIO expansion chip * mcp23s17:base:spi:port ********************************************************************************* */ static int doExtensionMcp23s17 (char *progName, int pinBase, char *params) { int spi, port ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ; return FALSE ; } if ((params = extractInt (progName, params, &port)) == NULL) return FALSE ; if ((port < 0) || (port > 7)) { fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ; return FALSE ; } mcp23s17Setup (pinBase, spi, port) ; return TRUE ; } /* * doExtensionSr595: * Shift Register 74x595 * sr595:base:pins:data:clock:latch ********************************************************************************* */ static int doExtensionSr595 (char *progName, int pinBase, char *params) { int pins, data, clock, latch ; // Extract pins if ((params = extractInt (progName, params, &pins)) == NULL) return FALSE ; if ((pins < 8) || (pins > 32)) { fprintf (stderr, "%s: pin count (%d) out of range - 8-32 expected.\n", progName, pins) ; return FALSE ; } if ((params = extractInt (progName, params, &data)) == NULL) return FALSE ; if ((params = extractInt (progName, params, &clock)) == NULL) return FALSE ; if ((params = extractInt (progName, params, &latch)) == NULL) return FALSE ; sr595Setup (pinBase, pins, data, clock, latch) ; return TRUE ; } /* * doExtensionPcf8574: * Digital IO (Crude!) * pcf8574:base:i2cAddr ********************************************************************************* */ static int doExtensionPcf8574 (char *progName, int pinBase, char *params) { int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } pcf8574Setup (pinBase, i2c) ; return TRUE ; } /* * doExtensionPcf8591: * Analog IO * pcf8591:base:i2cAddr ********************************************************************************* */ static int doExtensionPcf8591 (char *progName, int pinBase, char *params) { int i2c ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } pcf8591Setup (pinBase, i2c) ; return TRUE ; } /* * doExtensionMax31855: * Analog IO * max31855:base:spiChan ********************************************************************************* */ static int doExtensionMax31855 (char *progName, int pinBase, char *params) { int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; return FALSE ; } max31855Setup (pinBase, spi) ; return TRUE ; } /* * doExtensionMcp3002: * Analog IO * mcp3002:base:spiChan ********************************************************************************* */ static int doExtensionMcp3002 (char *progName, int pinBase, char *params) { int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; return FALSE ; } mcp3002Setup (pinBase, spi) ; return TRUE ; } /* * doExtensionMcp3004: * Analog IO * mcp3004:base:spiChan ********************************************************************************* */ static int doExtensionMcp3004 (char *progName, int pinBase, char *params) { int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; return FALSE ; } mcp3004Setup (pinBase, spi) ; return TRUE ; } /* * doExtensionMax5322: * Analog O * max5322:base:spiChan ********************************************************************************* */ static int doExtensionMax5322 (char *progName, int pinBase, char *params) { int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; return FALSE ; } max5322Setup (pinBase, spi) ; return TRUE ; } /* * doExtensionMcp4802: * Analog IO * mcp4802:base:spiChan ********************************************************************************* */ static int doExtensionMcp4802 (char *progName, int pinBase, char *params) { int spi ; if ((params = extractInt (progName, params, &spi)) == NULL) return FALSE ; if ((spi < 0) || (spi > 1)) { fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; return FALSE ; } mcp4802Setup (pinBase, spi) ; return TRUE ; } /* * doExtensionSn3218: * Analog Output (LED Driver) * sn3218:base ********************************************************************************* */ static int doExtensionSn3218 (char *progName, int pinBase, char *params) { sn3218Setup (pinBase) ; return TRUE ; } /* * doExtensionMcp3422: * Analog IO * mcp3422:base:i2cAddr ********************************************************************************* */ static int doExtensionMcp3422 (char *progName, int pinBase, char *params) { int i2c, sampleRate, gain ; if ((params = extractInt (progName, params, &i2c)) == NULL) return FALSE ; if ((i2c < 0x03) || (i2c > 0x77)) { fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; return FALSE ; } if ((params = extractInt (progName, params, &sampleRate)) == NULL) return FALSE ; if ((sampleRate < 0) || (sampleRate > 3)) { fprintf (stderr, "%s: sample rate (%d) out of range\n", progName, sampleRate) ; return FALSE ; } if ((params = extractInt (progName, params, &gain)) == NULL) return FALSE ; if ((gain < 0) || (gain > 3)) { fprintf (stderr, "%s: gain (%d) out of range\n", progName, gain) ; return FALSE ; } mcp3422Setup (pinBase, i2c, sampleRate, gain) ; return TRUE ; } /* * doExtensionDrcS: * Interface to a DRC Serial system * drcs:base:pins:serialPort:baud ********************************************************************************* */ static int doExtensionDrcS (char *progName, int pinBase, char *params) { char *port ; int pins, baud ; if ((params = extractInt (progName, params, &pins)) == NULL) return FALSE ; if ((pins < 1) || (pins > 100)) { fprintf (stderr, "%s: pins (%d) out of range (2-100)\n", progName, pins) ; return FALSE ; } if ((params = extractStr (progName, params, &port)) == NULL) return FALSE ; if (strlen (port) == 0) { fprintf (stderr, "%s: serial port device name required\n", progName) ; return FALSE ; } if ((params = extractInt (progName, params, &baud)) == NULL) return FALSE ; if ((baud < 1) || (baud > 4000000)) { fprintf (stderr, "%s: baud rate (%d) out of range\n", progName, baud) ; return FALSE ; } drcSetupSerial (pinBase, pins, port, baud) ; return TRUE ; } /* * Function list ********************************************************************************* */ struct extensionFunctionStruct extensionFunctions [] = { { "mcp23008", &doExtensionMcp23008 }, { "mcp23016", &doExtensionMcp23016 }, { "mcp23017", &doExtensionMcp23017 }, { "mcp23s08", &doExtensionMcp23s08 }, { "mcp23s17", &doExtensionMcp23s17 }, { "sr595", &doExtensionSr595 }, { "pcf8574", &doExtensionPcf8574 }, { "pcf8591", &doExtensionPcf8591 }, { "mcp3002", &doExtensionMcp3002 }, { "mcp3004", &doExtensionMcp3004 }, { "mcp4802", &doExtensionMcp4802 }, { "mcp3422", &doExtensionMcp3422 }, { "max31855", &doExtensionMax31855 }, { "max5322", &doExtensionMax5322 }, { "sn3218", &doExtensionSn3218 }, { "drcs", &doExtensionDrcS }, { NULL, NULL }, } ; /* * doExtension: * Load in a wiringPi extension ********************************************************************************* */ int doExtension (char *progName, char *extensionData) { char *p ; char *extension = extensionData ; struct extensionFunctionStruct *extensionFn ; int pinBase = 0 ; // Get the extension extension name by finding the first colon p = extension ; while (*p != ':') { if (!*p) // ran out of characters { fprintf (stderr, "%s: extension name not terminated by a colon\n", progName) ; return FALSE ; } ++p ; } *p++ = 0 ; if (!isdigit (*p)) { fprintf (stderr, "%s: pinBase number expected after extension name\n", progName) ; return FALSE ; } while (isdigit (*p)) { if (pinBase > 1000000000) { fprintf (stderr, "%s: pinBase too large\n", progName) ; return FALSE ; } pinBase = pinBase * 10 + (*p - '0') ; ++p ; } if (pinBase < 64) { fprintf (stderr, "%s: pinBase (%d) too small. Minimum is 64.\n", progName, pinBase) ; return FALSE ; } // Search for extensions: for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn) { if (strcmp (extensionFn->name, extension) == 0) return extensionFn->function (progName, pinBase, p) ; } fprintf (stderr, "%s: extension %s not found\n", progName, extension) ; return FALSE ; } wiringPi/gpio/pintest0000755000000000000000000000777712457032564013750 0ustar rootroot#!/bin/bash # # pintest # Test the Pi's GPIO port # Copyright (c) 2013 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# # logErr pin, expected got ################################################################################ logErr () { if [ $errs = 0 ]; then echo "" fi echo " --> Pin $1 failure. Expected $2, got $3" let errs+=1 } # printErrorCount ################################################################################ printErrCount() { if [ $errs = 0 ]; then echo "No faults detected." elif [ $errs = 1 ]; then echo "One fault detected." else echo "$errs faults detected" fi } # testPins start end ################################################################################ testPins() { start=$1 end=$2 errs=0 printf "%30s %2d:%2d: " "$3" $1 $2 # Set range to inputs for i in `seq $start $end`; do gpio mode $i in done # Enable internal pull-ups and expect to read high for i in `seq $start $end`; do gpio mode $i up if [ `gpio read $i` = 0 ]; then logErr $i 1 0 fi done # Enable internal pull-downs and expect to read low for i in `seq $start $end`; do gpio mode $i down if [ `gpio read $i` = 1 ]; then echo "Pin $i failure - expected 0, got 1" let errs+=1 fi done # Remove the internal pull up/downs for i in `seq $start $end`; do gpio mode $i tri done if [ $errs = 0 ]; then echo " OK" else printErrCount fi let totErrs+=errs } intro() { revision=`gpio -V` cat <. *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "extensions.h" extern int wiringPiDebug ; // External functions I can't be bothered creating a separate .h file for: extern void doReadall (void) ; extern void doPins (void) ; #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif #define VERSION "2.22" #define PI_USB_POWER_CONTROL 38 #define I2CDETECT "/usr/sbin/i2cdetect" int wpMode ; char *usage = "Usage: gpio -v\n" " gpio -h\n" " gpio [-g|-1] [-x extension:params] ...\n" " gpio [-p] ...\n" " gpio ...\n" " gpio readall/reset\n" " gpio unexportall/exports\n" " gpio export/edge/unexport ...\n" " gpio wfi \n" " gpio drive \n" " gpio pwm-bal/pwm-ms \n" " gpio pwmr \n" " gpio pwmc \n" " gpio load spi/i2c\n" " gpio i2cd/i2cdetect\n" " gpio usbp high/low\n" " gpio gbr \n" " gpio gbw " ; // No trailing newline needed here. #ifdef NOT_FOR_NOW /* * decodePin: * Decode a pin "number" which can actually be a pin name to represent * one of the Pi's on-board pins. ********************************************************************************* */ static int decodePin (const char *str) { // The first case - see if it's a number: if (isdigit (str [0])) return atoi (str) ; return 0 ; } #endif /* * changeOwner: * Change the ownership of the file to the real userId of the calling * program so we can access it. ********************************************************************************* */ static void changeOwner (char *cmd, char *file) { uid_t uid = getuid () ; uid_t gid = getgid () ; if (chown (file, uid, gid) != 0) { if (errno == ENOENT) // Warn that it's not there fprintf (stderr, "%s: Warning: File not present: %s\n", cmd, file) ; else { fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; exit (1) ; } } } /* * moduleLoaded: * Return true/false if the supplied module is loaded ********************************************************************************* */ static int moduleLoaded (char *modName) { int len = strlen (modName) ; int found = FALSE ; FILE *fd = fopen ("/proc/modules", "r") ; char line [80] ; if (fd == NULL) { fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ; exit (1) ; } while (fgets (line, 80, fd) != NULL) { if (strncmp (line, modName, len) != 0) continue ; found = TRUE ; break ; } fclose (fd) ; return found ; } /* * doLoad: * Load either the spi or i2c modules and change device ownerships, etc. ********************************************************************************* */ static void _doLoadUsage (char *argv []) { fprintf (stderr, "Usage: %s load [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ; exit (1) ; } static void doLoad (int argc, char *argv []) { char *module1, *module2 ; char cmd [80] ; char *file1, *file2 ; char args1 [32], args2 [32] ; if (argc < 3) _doLoadUsage (argv) ; args1 [0] = args2 [0] = 0 ; /**/ if (strcasecmp (argv [2], "spi") == 0) { module1 = "spidev" ; module2 = "spi_bcm2708" ; file1 = "/dev/spidev0.0" ; file2 = "/dev/spidev0.1" ; if (argc == 4) sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ; else if (argc > 4) _doLoadUsage (argv) ; } else if (strcasecmp (argv [2], "i2c") == 0) { module1 = "i2c_dev" ; module2 = "i2c_bcm2708" ; file1 = "/dev/i2c-0" ; file2 = "/dev/i2c-1" ; if (argc == 4) sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; else if (argc > 4) _doLoadUsage (argv) ; } else _doLoadUsage (argv) ; if (!moduleLoaded (module1)) { sprintf (cmd, "modprobe %s%s", module1, args1) ; system (cmd) ; } if (!moduleLoaded (module2)) { sprintf (cmd, "modprobe %s%s", module2, args2) ; system (cmd) ; } if (!moduleLoaded (module2)) { fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; exit (1) ; } sleep (1) ; // To let things get settled changeOwner (argv [0], file1) ; changeOwner (argv [0], file2) ; } /* * doI2Cdetect: * Run the i2cdetect command with the right runes for this Pi revision ********************************************************************************* */ static void doI2Cdetect (int argc, char *argv []) { int port = piBoardRev () == 1 ? 0 : 1 ; char command [128] ; struct stat statBuf ; if (stat (I2CDETECT, &statBuf) < 0) { fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; return ; } if (!moduleLoaded ("i2c_dev")) { fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; return ; } sprintf (command, "%s -y %d", I2CDETECT, port) ; if (system (command) < 0) fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; } /* * doExports: * List all GPIO exports ********************************************************************************* */ static void doExports (int argc, char *argv []) { int fd ; int i, l, first ; char fName [128] ; char buf [16] ; for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective { // Try to read the direction sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; if ((fd = open (fName, O_RDONLY)) == -1) continue ; if (first == 0) { ++first ; printf ("GPIO Pins exported:\n") ; } printf ("%4d: ", i) ; if ((l = read (fd, buf, 16)) == 0) sprintf (buf, "%s", "?") ; buf [l] = 0 ; if ((buf [strlen (buf) - 1]) == '\n') buf [strlen (buf) - 1] = 0 ; printf ("%-3s", buf) ; close (fd) ; // Try to Read the value sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; if ((fd = open (fName, O_RDONLY)) == -1) { printf ("No Value file (huh?)\n") ; continue ; } if ((l = read (fd, buf, 16)) == 0) sprintf (buf, "%s", "?") ; buf [l] = 0 ; if ((buf [strlen (buf) - 1]) == '\n') buf [strlen (buf) - 1] = 0 ; printf (" %s", buf) ; // Read any edge trigger file sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; if ((fd = open (fName, O_RDONLY)) == -1) { printf ("\n") ; continue ; } if ((l = read (fd, buf, 16)) == 0) sprintf (buf, "%s", "?") ; buf [l] = 0 ; if ((buf [strlen (buf) - 1]) == '\n') buf [strlen (buf) - 1] = 0 ; printf (" %-8s\n", buf) ; close (fd) ; } } /* * doExport: * gpio export pin mode * This uses the /sys/class/gpio device interface. ********************************************************************************* */ void doExport (int argc, char *argv []) { FILE *fd ; int pin ; char *mode ; char fName [128] ; if (argc != 4) { fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; mode = argv [3] ; if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; exit (1) ; } fprintf (fd, "%d\n", pin) ; fclose (fd) ; sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; if ((fd = fopen (fName, "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; exit (1) ; } /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) fprintf (fd, "in\n") ; else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) fprintf (fd, "out\n") ; else { fprintf (stderr, "%s: Invalid mode: %s. Should be in or out\n", argv [1], mode) ; exit (1) ; } fclose (fd) ; // Change ownership so the current user can actually use it! sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; changeOwner (argv [0], fName) ; sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; changeOwner (argv [0], fName) ; } /* * doWfi: * gpio wfi pin mode * Wait for Interrupt on a given pin. * Slight cheat here - it's easier to actually use ISR now (which calls * gpio to set the pin modes!) then we simply sleep, and expect the thread * to exit the program. Crude but effective. ********************************************************************************* */ static void wfi (void) { exit (0) ; } void doWfi (int argc, char *argv []) { int pin, mode ; if (argc != 4) { fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; else { fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; exit (1) ; } if (wiringPiISR (pin, mode, &wfi) < 0) { fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; exit (1) ; } for (;;) delay (9999) ; } /* * doEdge: * gpio edge pin mode * Easy access to changing the edge trigger on a GPIO pin * This uses the /sys/class/gpio device interface. ********************************************************************************* */ void doEdge (int argc, char *argv []) { FILE *fd ; int pin ; char *mode ; char fName [128] ; if (argc != 4) { fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; mode = argv [3] ; // Export the pin and set direction to input if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; exit (1) ; } fprintf (fd, "%d\n", pin) ; fclose (fd) ; sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; if ((fd = fopen (fName, "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; exit (1) ; } fprintf (fd, "in\n") ; fclose (fd) ; sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; if ((fd = fopen (fName, "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; exit (1) ; } /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; else { fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; exit (1) ; } // Change ownership of the value and edge files, so the current user can actually use it! sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; changeOwner (argv [0], fName) ; sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; changeOwner (argv [0], fName) ; fclose (fd) ; } /* * doUnexport: * gpio unexport pin * This uses the /sys/class/gpio device interface. ********************************************************************************* */ void doUnexport (int argc, char *argv []) { FILE *fd ; int pin ; if (argc != 3) { fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; exit (1) ; } fprintf (fd, "%d\n", pin) ; fclose (fd) ; } /* * doUnexportAll: * gpio unexportall * Un-Export all the GPIO pins. * This uses the /sys/class/gpio device interface. ********************************************************************************* */ void doUnexportall (char *progName) { FILE *fd ; int pin ; for (pin = 0 ; pin < 63 ; ++pin) { if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) { fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; exit (1) ; } fprintf (fd, "%d\n", pin) ; fclose (fd) ; } } /* * doResetExternal: * Load readallExternal, we try to do this with an external device. ********************************************************************************* */ static void doResetExternal (void) { int pin ; for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) { pinMode (pin, INPUT) ; pullUpDnControl (pin, PUD_OFF) ; } } /* * doReset: * Reset the GPIO pins - as much as we can do ********************************************************************************* */ static void doReset (char *progName) { int model, rev, mem, maker, overVolted ; int pin, endPin ; printf ("GPIO Reset is dangerous!\n") ; printf (" - Do Not rely on this to do anything sensible!\n") ; if (wiringPiNodes != NULL) // External { doResetExternal () ; return ; } piBoardId (&model, &rev, &mem, &maker, &overVolted) ; /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) endPin = 16 ; else if (model == PI_MODEL_BP) endPin = 39 ; else if (model == PI_MODEL_CM) { printf (" - Don't know how to reset a comput module:\n") ; printf (" Write a shell-script to reset the pins to the state you need.\n") ; return ; } else { printf ("Oops - unable to determine board type... model: %d\n", model) ; return ; } for (pin = 0 ; pin <= endPin ; ++pin) { if (wpiPinToGpio (pin) == -1) continue ; digitalWrite (pin, LOW) ; pinMode (pin, INPUT) ; pullUpDnControl (pin, PUD_OFF) ; } } /* * doMode: * gpio mode pin mode ... ********************************************************************************* */ void doMode (int argc, char *argv []) { int pin ; char *mode ; if (argc != 4) { fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; mode = argv [3] ; /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; // Undocumented else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; else { fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; exit (1) ; } } /* * doPadDrive: * gpio drive group value ********************************************************************************* */ static void doPadDrive (int argc, char *argv []) { int group, val ; if (argc != 4) { fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ; exit (1) ; } group = atoi (argv [2]) ; val = atoi (argv [3]) ; if ((group < 0) || (group > 2)) { fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; exit (1) ; } if ((val < 0) || (val > 7)) { fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; exit (1) ; } setPadDrive (group, val) ; } /* * doUsbP: * Control USB Power - High (1.2A) or Low (600mA) * gpio usbp high/low ********************************************************************************* */ static void doUsbP (int argc, char *argv []) { int model, rev, mem, maker, overVolted ; if (argc != 3) { fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; exit (1) ; } // Make sure we're on a B+ piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model != PI_MODEL_BP) { fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ; exit (1) ; } // Need to force BCM_GPIO mode: wiringPiSetupGpio () ; if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) { digitalWrite (PI_USB_POWER_CONTROL, 1) ; pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; printf ("Switched to HIGH current USB (1.2A)\n") ; return ; } if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) { digitalWrite (PI_USB_POWER_CONTROL, 0) ; pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; printf ("Switched to LOW current USB (600mA)\n") ; return ; } fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; exit (1) ; } /* * doGbw: * gpio gbw channel value * Gertboard Write - To the Analog output ********************************************************************************* */ static void doGbw (int argc, char *argv []) { int channel, value ; if (argc != 4) { fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; exit (1) ; } channel = atoi (argv [2]) ; value = atoi (argv [3]) ; if ((channel < 0) || (channel > 1)) { fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; exit (1) ; } if ((value < 0) || (value > 255)) { fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; exit (1) ; } if (gertboardAnalogSetup (64) < 0) { fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; exit (1) ; } analogWrite (64 + channel, value) ; } /* * doGbr: * gpio gbr channel * From the analog input ********************************************************************************* */ static void doGbr (int argc, char *argv []) { int channel ; if (argc != 3) { fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; exit (1) ; } channel = atoi (argv [2]) ; if ((channel < 0) || (channel > 1)) { fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; exit (1) ; } if (gertboardAnalogSetup (64) < 0) { fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; exit (1) ; } printf ("%d\n", analogRead (64 + channel)) ; } /* * doWrite: * gpio write pin value ********************************************************************************* */ static void doWrite (int argc, char *argv []) { int pin, val ; if (argc != 4) { fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) val = 1 ; else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) val = 0 ; else val = atoi (argv [3]) ; /**/ if (val == 0) digitalWrite (pin, LOW) ; else digitalWrite (pin, HIGH) ; } /* * doAwriterite: * gpio awrite pin value ********************************************************************************* */ static void doAwrite (int argc, char *argv []) { int pin, val ; if (argc != 4) { fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; val = atoi (argv [3]) ; analogWrite (pin, val) ; } /* * doWriteByte: * gpio write value ********************************************************************************* */ static void doWriteByte (int argc, char *argv []) { int val ; if (argc != 3) { fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; exit (1) ; } val = (int)strtol (argv [2], NULL, 0) ; digitalWriteByte (val) ; } /* * doRead: * Read a pin and return the value ********************************************************************************* */ void doRead (int argc, char *argv []) { int pin, val ; if (argc != 3) { fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; val = digitalRead (pin) ; printf ("%s\n", val == 0 ? "0" : "1") ; } /* * doAread: * Read an analog pin and return the value ********************************************************************************* */ void doAread (int argc, char *argv []) { if (argc != 3) { fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; exit (1) ; } printf ("%d\n", analogRead (atoi (argv [2]))) ; } /* * doToggle: * Toggle an IO pin ********************************************************************************* */ void doToggle (int argc, char *argv []) { int pin ; if (argc != 3) { fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; digitalWrite (pin, !digitalRead (pin)) ; } /* * doPwmTone: * Output a tone in a PWM pin ********************************************************************************* */ void doPwmTone (int argc, char *argv []) { int pin, freq ; if (argc != 4) { fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; freq = atoi (argv [3]) ; pwmToneWrite (pin, freq) ; } /* * doClock: * Output a clock on a pin ********************************************************************************* */ void doClock (int argc, char *argv []) { int pin, freq ; if (argc != 4) { fprintf (stderr, "Usage: %s clock \n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; freq = atoi (argv [3]) ; gpioClockSet (pin, freq) ; } /* * doPwm: * Output a PWM value on a pin ********************************************************************************* */ void doPwm (int argc, char *argv []) { int pin, val ; if (argc != 4) { fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; exit (1) ; } pin = atoi (argv [2]) ; val = atoi (argv [3]) ; pwmWrite (pin, val) ; } /* * doPwmMode: doPwmRange: doPwmClock: * Change the PWM mode, range and clock divider values ********************************************************************************* */ static void doPwmMode (int mode) { pwmSetMode (mode) ; } static void doPwmRange (int argc, char *argv []) { unsigned int range ; if (argc != 3) { fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; exit (1) ; } range = (unsigned int)strtoul (argv [2], NULL, 10) ; if (range == 0) { fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; exit (1) ; } pwmSetRange (range) ; } static void doPwmClock (int argc, char *argv []) { unsigned int clock ; if (argc != 3) { fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; exit (1) ; } clock = (unsigned int)strtoul (argv [2], NULL, 10) ; if ((clock < 1) || (clock > 4095)) { fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; exit (1) ; } pwmSetClock (clock) ; } /* * main: * Start here ********************************************************************************* */ int main (int argc, char *argv []) { int i ; int model, rev, mem, maker, overVolted ; if (getenv ("WIRINGPI_DEBUG") != NULL) { printf ("gpio: wiringPi debug mode enabled\n") ; wiringPiDebug = TRUE ; } if (argc == 1) { fprintf (stderr, "%s\n", usage) ; return 1 ; } // Help if (strcasecmp (argv [1], "-h") == 0) { printf ("%s: %s\n", argv [0], usage) ; return 0 ; } // Sort of a special: if (strcmp (argv [1], "-R") == 0) { printf ("%d\n", piBoardRev ()) ; return 0 ; } // Version & Warranty if (strcmp (argv [1], "-V") == 0) { printf ("%d\n", piBoardRev ()) ; return 0 ; } if (strcmp (argv [1], "-v") == 0) { printf ("gpio version: %s\n", VERSION) ; printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; printf ("For details type: %s -warranty\n", argv [0]) ; printf ("\n") ; piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model == PI_MODEL_UNKNOWN) { printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ; printf (" projects@drogon.net\n") ; printf ("with a copy of your /proc/cpuinfo if possible\n") ; } else { printf ("Raspberry Pi Details:\n") ; printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ; } return 0 ; } if (strcasecmp (argv [1], "-warranty") == 0) { printf ("gpio version: %s\n", VERSION) ; printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; printf ("\n") ; printf (" This program is free software; you can redistribute it and/or modify\n") ; printf (" it under the terms of the GNU Leser General Public License as published\n") ; printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; printf (" (at your option) any later version.\n") ; printf ("\n") ; printf (" This program is distributed in the hope that it will be useful,\n") ; printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; printf (" GNU Lesser General Public License for more details.\n") ; printf ("\n") ; printf (" You should have received a copy of the GNU Lesser General Public License\n") ; printf (" along with this program. If not, see .\n") ; printf ("\n") ; return 0 ; } if (geteuid () != 0) { fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; return 1 ; } // Initial test for /sys/class/gpio operations: /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } // Check for load command: if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } // Gertboard commands if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } // Check for -g argument /**/ if (strcasecmp (argv [1], "-g") == 0) { wiringPiSetupGpio () ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; wpMode = WPI_MODE_GPIO ; } // Check for -1 argument else if (strcasecmp (argv [1], "-1") == 0) { wiringPiSetupPhys () ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; wpMode = WPI_MODE_PHYS ; } // Check for -p argument for PiFace else if (strcasecmp (argv [1], "-p") == 0) { piFaceSetup (200) ; for (i = 2 ; i < argc ; ++i) argv [i - 1] = argv [i] ; --argc ; wpMode = WPI_MODE_PIFACE ; } // Default to wiringPi mode else { wiringPiSetup () ; wpMode = WPI_MODE_PINS ; } // Check for -x argument to load in a new extension if (strcasecmp (argv [1], "-x") == 0) { if (argc < 3) { fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ; exit (EXIT_FAILURE) ; } if (!doExtension (argv [0], argv [2])) // Prints its own error messages exit (EXIT_FAILURE) ; for (i = 3 ; i < argc ; ++i) argv [i - 2] = argv [i] ; argc -= 2 ; } if (argc <= 1) { fprintf (stderr, "%s: no command given\n", argv [0]) ; exit (EXIT_FAILURE) ; } // Core wiringPi functions /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; // GPIO Nicies else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; // Pi Specifics else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ; else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ; else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ; else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ; else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; else { fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; exit (EXIT_FAILURE) ; } return 0 ; } wiringPi/gpio/extensions.h0000644000000000000000000000222312457032564014661 0ustar rootroot/* * extensions.h: * Part of the GPIO program to test, peek, poke and otherwise * noodle with the GPIO hardware on the Raspberry Pi. * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ extern int doExtension (char *progName, char *extensionData) ; wiringPi/gpio/gpio.10000644000000000000000000002252712457032564013342 0ustar rootroot.TH "GPIO" "March 2013" "Command-Line access to Raspberry Pi's GPIO" .SH NAME gpio \- Command-line access to Raspberry Pi's GPIO .SH SYNOPSIS .B gpio .B \-v .PP .B gpio .B [ \-g | \-1 ] .B mode/read/write/aread/awrite/wb/pwm/clock ... .PP .B gpio .B [ \-x extension:params ] .B mode/read/write/aread/awrite/pwm/pwmTone ... .PP .B gpio .B [ \-p ] .B read/write/toggle/wb .B ... .PP .B gpio .B readall/reset .PP .B gpio .B unexportall/exports .PP .B gpio .B export/edge/unexport .B ... .PP .B gpio .B wfi .B ... .PP .B gpio .B drive group value .PP .B gpio .B usbp high | low .PP .B gpio .B pwm-bal/pwm-ms .PP .B gpio .B pwmr range .PP .B gpio .B load \ i2c/spi ... .PP .B gpio .B gbr channel .PP .B gpio .B gbw channel value .SH DESCRIPTION .B GPIO is a swiss army knife of a command line tool to allow the user easy access to the GPIO pins on the Raspberry Pi and the SPI A/D and D/A converters on the Gertboard. It's designed for simple testing and diagnostic purposes, but can be used in shell scripts for general if somewhat slow control of the GPIO pins. It can also control the IO's on the PiFace IO board and load the SPI and I2C kernel modules if required. Additionally, it can be used to set the exports in the \fI/sys/class/gpio\fR system directory to allow subsequent programs to use the \fR/sys/class/gpio\fR interface without needing to be run as root. .SH OPTIONS .TP .B \-v Output the current version including the board revision of the Raspberry Pi. .TP .B \-g Use the BCM_GPIO pins numbers rather than wiringPi pin numbers. \fINote:\fR The BCM_GPIO pin numbers are always used with the export and edge commands. .TP .B \-1 Use the physical pin numbers rather than wiringPi pin numbers. \fINote:\fR that this applies to the P1 connector only. It is not possible to use pins on the Revision 2 P5 connector this way, and as with \-g the BCM_GPIO pin numbers are always used with the export and edge commands. .TP .B \-x extension This causes the named extension to be initialised. Extensions comprise of a name (e.g. mcp23017) followed by a colon, then the pin-base, then more optional parameters depending on the extension type. See the web page on http://wiringpi.com/the-gpio-utility/ .TP .B \-p Use the PiFace interface board and its corresponding pin numbers. The PiFace will always appear at pin number 200 in the gpio command. You can assign any pin numbers you like in your own programs though. .TP .B read Read the digital value of the given pin and print 0 or 1 to represent the respective logic levels. .TP .B write Write the given value (0 or 1) to the pin. You need to set the pin to output mode first. .TP .B aread Read the analog value of the given pin. This needs to be uses in conjunction with a -x flag to add in an extension that handles analog inputs. respective logic levels. e.g. gpio -x mcp3002:200:0 aread 200 will read the first analog input on an mcp3002 SPI ADC chip. .TP .B awrite Write the analog value to the given pin. This needs to be used in conjunction with a -x flag to add in an extension that handles analog inputs. respective logic levels. e.g. gpio -x mcp4802:200:0 awrite 200 128 will write the value 128 to the first DAC port on an mcp4802 chip on the Pi's SPI bus 0. .TP .B wb Write the given byte to the 8 main GPIO pins. You can prefix it with 0x to specify a hexadecimal number. You need to set pins to output mode first. .TP .B readall Output a table of all GPIO pins values. The values represent the actual values read if the pin is in input mode, or the last value written if the pin is in output mode. The readall command is usable with an extension module (via the -x parameter), but it's unable to determine pin modes or states, so will perform both a digital and analog read on each pin in-turn. .TP .B reset Resets the GPIO - As much as it's possible to do. All pins are set to input mode and all the internal pull-up/down resistors are disconnected (tristate mode). The reset command is usable with an extension module (via the -x parameter), but it's limited to turning the pin into input mode (if applicable) and removing any pull up/down resistor. .TP .B pwm Write a PWM value (0-1023) to the given pin. The pin needs to be put into PWM mode first. .TP .B clock Set the output frequency on the given pin. The pin needs to be put into clock mode first. .TP .B mode Set a pin into \fIinput\fR, \fIoutput\fR or \fIpwm\fR mode. Can also use the literals \fIup\fR, \fIdown\fR or \fItri\fR to set the internal pull-up, pull-down or tristate (off) controls. .TP .B unexportall Un-Export all the GPIO pins in the /sys/class/gpio directory. .TP .B exports Print a list (if any) of all the exported GPIO pins and their current values. .TP .B export Export a GPIO pin in the \fI/sys/class/gpio\fR directory. Use like the mode command above however only \fIin\fR and \fIout\fR are supported at this time. Note that the pin number is the \fBBCM_GPIO\fR number and not the wiringPi number. Once a GPIO pin has been exported, the \fBgpio\fR program changes the ownership of the \fI/sys/class/gpio/gpioX/value\fR and if present in later kernels, the \fI/sys/class/gpio/gpioX/edge\fR pseudo files to that of the user running the \fBgpio\fR program. This means that you can have a small script of gpio exports to setup the gpio pins as your program requires without the need to run anything as root, or with the sudo command. .TP .B edge This exports a GPIO pin in the \fI/sys/class/gpio\fR directory, set the direction to input and set the edge interrupt method to \fInone\fR, \fIrising\fR, \fIfalling\fR or \fIboth\fR. Use like the export command above and note that \fBBCM_GPIO\fR pin number is used not not wiringPi pin numbering. Like the export commands above, ownership is set to that of the calling user, allowing subsequent access from user programs without requiring root/sudo. .TP .B unexport Un-Export a GPIO pin in the /sys/class/gpio directory. .TP .B wfi This set the given pin to the supplied interrupt mode: rising, falling or both then waits for the interrupt to happen. It's a non-busy wait, so does not consume and CPU while it's waiting. .TP .B drive group value Change the pad driver value for the given pad group to the supplied drive value. Group is 0, 1 or 2 and value is 0-7. Do not use unless you are absolutely sure you know what you're doing. .TP .B usbp high | low Change the USB current limiter to high (1.2 amps) or low (the default, 600mA) This is only applicable to the model B+ .TP .B pwm-bal/pwm-ms Change the PWM mode to balanced (the default) or mark:space ratio (traditional) .TP .B pwmr Change the PWM range register. The default is 1024. .TP .B load i2c [baudrate] This loads the i2c or drivers into the kernel and changes the permissions on the associated /dev/ entries so that the current user has access to them. Optionally it will set the I2C baudrate to that supplied in Kb/sec (or as close as the Pi can manage) The default speed is 100Kb/sec. .TP .B load spi [buffer size in KB] This loads the spi drivers into the kernel and changes the permissions on the associated /dev/ entries so that the current user has access to them. Optionally it will set the SPI buffer size to that supplied. The default is 4KB. .TP .B gbr channel This reads the analog to digital converter on the Gertboard on the given channel. The board jumpers need to be in-place to do this operation. .TP .B gbw channel value This writes the supplied value to the output channel on the Gertboards SPI digital to analogue converter. The board jumpers need to be in-place to do this operation. .SH "WiringPi vs. BCM_GPIO Pin numbering" .PP .TS c c c c l. WiringPi GPIO-r1 GPIO-r2 P1-Phys Function _ 0 17 17 11 1 18 18 12 (PWM) 2 21 27 13 3 22 22 15 4 23 23 16 5 24 24 18 6 25 25 22 7 4 4 7 8 0 2 3 I2C: SDA0 9 1 3 5 I2C: SCL0 10 8 8 24 SPI: CE0 11 7 7 26 SPI: CE1 12 10 10 19 SPI: MOSI 13 9 9 21 SPI: MISO 14 11 11 23 SPI: SCLK 15 14 14 8 TxD 16 15 16 10 RxD 17 - 28 18 - 29 19 - 30 20 - 31 .TE Note that "r1" and "r2" above refers to the board revision. Normally wiringPi detects the correct board revision with use for it's own numbering scheme, but if you are using a Revision 2 board with some of the pins which change numbers between revisions you will need to alter your software. .SH FILES .TP 2.2i .I gpio executable .SH EXAMPLES .TP 2.2i gpio mode 4 output # Set pin 4 to output .PP gpio -g mode 23 output # Set GPIO pin 23 to output (same as WiringPi pin 4) .PP gpio mode 1 pwm # Set pin 1 to PWM mode .PP gpio pwm 1 512 # Set pin 1 to PWM value 512 - half brightness .PP gpio export 17 out # Set GPIO Pin 17 to output .PP gpio export 0 in # Set GPIO Pin 0 (SDA0) to input. .PP gpio -g read 0 # Read GPIO Pin 0 (SDA0) .SH "NOTES" When using the \fIexport\fR, \fIedge\fR or \fIunexport\fR commands, the pin numbers are \fBalways\fR native BCM_GPIO numbers and never wiringPi pin numbers. .SH "SEE ALSO" .LP WiringPi's home page .IP http://wiringpi.com/ .SH AUTHOR Gordon Henderson .SH "REPORTING BUGS" Please report bugs to .SH COPYRIGHT Copyright (c) 2012-2013 Gordon Henderson This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH TRADEMARKS AND ACKNOWLEDGEMENTS Raspberry Pi is a trademark of the Raspberry Pi Foundation. See http://raspberrypi.org/ for full details. wiringPi/gpio/pins.c0000644000000000000000000000234412457032564013432 0ustar rootroot/* * pins.c: * Just display a handy Pi pinnout diagram. * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include void doPins (void) { printf ("The pins command has been deprecated - sorry. Please use the\n") ; printf (" gpio readall\n") ; printf ("command to get a list of the pinnouts for your Pi.\n") ; } wiringPi/gpio/Makefile0000644000000000000000000000436312457032564013760 0ustar rootroot# # Makefile: # The gpio command: # A swiss-army knige of GPIO shenanigans. # https://projects.drogon.net/wiring-pi # # Copyright (c) 2012-2013 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# DESTDIR=/usr PREFIX=/local #DEBUG = -g -O0 DEBUG = -O2 CC = gcc INCLUDE = -I$(DESTDIR)$(PREFIX)/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib LIBS = -lwiringPi -lwiringPiDev -lpthread -lm # May not need to alter anything below this line ############################################################################### SRC = gpio.c extensions.c readall.c pins.c OBJ = $(SRC:.c=.o) all: gpio gpio: $(OBJ) @echo [Link] @$(CC) -o $@ $(OBJ) $(LDFLAGS) $(LIBS) .c.o: @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ .PHONY: clean clean: @echo "[Clean]" @rm -f $(OBJ) gpio *~ core tags *.bak .PHONY: tags tags: $(SRC) @echo [ctags] @ctags $(SRC) .PHONY: install install: @echo "[Install]" @cp gpio $(DESTDIR)$(PREFIX)/bin @chown root.root $(DESTDIR)$(PREFIX)/bin/gpio @chmod 4755 $(DESTDIR)$(PREFIX)/bin/gpio @mkdir -p $(DESTDIR)$(PREFIX)/man/man1 @cp gpio.1 $(DESTDIR)$(PREFIX)/man/man1 .PHONY: uninstall uninstall: @echo "[UnInstall]" @rm -f $(DESTDIR)$(PREFIX)/bin/gpio @rm -f $(DESTDIR)$(PREFIX)/man/man1/gpio.1 .PHONY: depend depend: makedepend -Y $(SRC) # DO NOT DELETE gpio.o: extensions.h extensions.o: extensions.h wiringPi/INSTALL0000644000000000000000000000125612457032564012411 0ustar rootroot How to install wiringPi ======================= The easiest way is to use the supplied 'build' script: ./build that should do a complete install or upgrade of wiringPi for you. That will install a dynamic library. Some distributions do not have /usr/local/lib in the default LD_LIBRARY_PATH. To fix this, you need to edit /etc/ld.so.conf and add in a single line: /usr/local/lib then run the ldconfig command. sudo ldconfig If you want to install a static library, you may need to do this manually: cd wiringPi make static sudo make install-static To un-install wiringPi: ./build uninstall Gordon Henderson projects@drogon.net https://projects.drogon.net/ wiringPi/pins/0000755000000000000000000000000012457032564012325 5ustar rootrootwiringPi/pins/pins.pdf0000644000000000000000000002315112457032564013773 0ustar rootroot%PDF-1.4 %Çì¢ 5 0 obj <> stream xœÅ]³µ†«ry~ÅÞeOU<Œ¾%îòAòIlWå"É`cR±Cÿ>-ÔýjW;‡Y R„¡Ý;z%u?Ó£ÕÊ_æIæü¿úïÏÞܽ÷4^½»+Öƒ:ü‘¯þs÷Õªÿ1WïÃožÓâA©)9§Ï?¿SÕ]%5éäÁ«i¶öðüÍÝ?Žÿ÷ýø°˜gü g§fGJ¾…&ßäë9§ÂñShþe¾6:†øC•ëà'çÍñù}H“Ós:~÷øô>M–<ÍñµÜy'×ÿzþ䄃l]štx¢ìd­3‡ç/ht¿ÈŸIÚÍ1¿Y®Íl}».ö/áú}¸~üßûwpýoðùúÜ^®àúøyÁŸÏÀþ®ßŒuæqùàùÝßî,Måá»» çCP:N^ÞÜ9ïÔ [^ß=Ë‹áàSÔäÕ,äå'_œ®Šrm,Eµ2ëɵ(ÿXÁDÖ`s$H<}Áòr‰JE!òçòAoܬºp9áÿà‘à×J-#ZïñšÇX}¸æøÙoòÝ)ZI"Þ2'£Œ{L0ÆÍcœ§Š;8UÍ"žno:ÅÒMfT™0™>¹8™ÕÉTj4›4®)P¬øè¦@1Õ˜•™gE—»L9¢óÇÎþ£õj¹¦Þ¸ŒŸ2_ªhù€÷Öâxì”MšfºÄ–­]R>N6žK¿ùmÁŸžƒu9æJø¹t9 š™•jÜä(eËV¥Ú¹)†^(bóá äÉËÁ@ê'>¢¼fyy‚&ï;§j9qráÔÉíˆ2Cwš£é{ú{è)f!öúÅríƒÕ'¤œŽþ€Àø`hú@6[D¶ñ‰LÏbØÜ3 t¯õmæЪ•Ø¶lÕg5Ý)éa2Û(§[2ø+rÁÆt’ lÙ,4Þ¨1ˆ(¥© ¢ü¬jb̵o *à R‘I´ÜéA¼Î)Î}®sŸ £#É£«…=U‚Ñ¢Gµt÷TÓ˜€1MI/Æ {±¼AìżWã§Ö‹¯_]Ë)‰SYKœ"Á¢ÌÀž$ZÐü_2+3û$Y*E6ãI¤7 v°ñ ¼ª¼/Ø/doxûŽ©Af – ,ƒ- ãÊÆ Ui^õëQãcÒx³@ãdà´pœ&×B¡]^ &B¯îe»:ë 4–ÉÐÉ4¯f/ÎOöb x•„ôTÚ.e«¥KH›<•¶˜Þ*§=!¦f®,ÉQÍ®+×¢”Kç•«4×VBçû¶ŸB!´L• HÜû’Îs}:s|²Ð4¿'>…œL7/ÞcÓŒ)î- LÆœúP‚µ\\Ï-—¦Óûÿìw÷†‚ÃÒ3ø×÷k\eBª¦Œ!N ª½!ÃTBÙfJ¬8µ-dJض]ƒ’´-˜jm7OƒÒ-‘„¢¯G«H5™ÌqF5'Æ;¢šSá‘M6SxT-Œ¥7™ŽG¶ºì¦¥€Šõå=­Ñˆ5Ÿ¶½•UaË×±HÝ€E£4bòp_Næ6$"‚¨¨úÞ?û-HÿÓ@ØJ"Q0uòn. ©}QÃ@Bõn H¬µéõªá[ök8’–Pý»x4:áð”IÞ‡!;_!Ö`2=„ÄE°dz± @ ÞPŒõ“ëV¢ª¥žóÄ#€Œµ¹½›0H[zk«ÃÖÄ2€J,ãÊÆi¼æàúÆí qF7˜À1(­%hÊå†*ÅLye»“ôè»x±Ç€!ò!,Ÿ ^L‘ÝÍØLô,@²q¢™Øx\#‡4.,áÆ+À©Ñ„}ò“¡¾f«müГŸOÆ —Ðÿ'·ßÉ ÎKX.Ðe÷¼Z¦ù4`,¼XY9_2IB³sì4UÚ\âB˜‡,˜ÉB $U*c¬–’ôŸ\IEåßœúeöb x1ZØ‹-àµ÷ù¤=Ý’ÚHS~\÷tbzˆÂfÁ~4z€WµœõcO°i',ƒ- c#O°qüÖk^c‹iÒPN‹ãh7[Èfu/KçëÙÂrÙrƒ9f¶ †ùbJ3IDR³lžofË%!~-,„- ¤°e¶iò[ªÙâÒl&e‘-ô9ë6T>µìrô¢é©ÐÃü–]Ò¸@lsãIMô’×7Ž¯y£² 1P„'EÈ-K°NÞã%Ø(åÏ‘ ò¢"¿½D»NnC¦2“U~8î…Zk‹Ý"I€º5>/ Y[ø! TRi‰N•§· C±§“º6HÔ€ç4õÂ×ýÓßh:õ±¸BSÄ|Ý:ýŽ*´híE!g•Æ…©Òx&(y¨ BÐféœ]¾¬c UÒ“{ÒgÝ}a3&(7Ζí;Š>*W»Æ¯[?©¼–¦ÜMÖõ¿»¹d~ó0°†á¦üÆÁy<5GÌð[ä7 Èg~ƒWµôÜÇoìbsík‘Ä–ÍáÇü¾$dí;Ò, ¤ñœÃÙøí_šëä_½4'Ù™›âÕ,àÅ€c/¶€W\pz થœŸý²c 7Oa_Ü1ê|Þ짺¯ Æ¨c?–±±XÄÆ^k_(ŠÀŽÇí`ƒò‡Í(S°ù‚–Ïh/ÆÏîIgØ`Ç0Ç×–üEàgc0l. Yû„~XHc 85úÜ4H¸X¼.HF+g±z Óîéçbqv¥X4kÅ¢H nœ~.Qˆ]+¹q +7^XJÕã„ß·VCGRëè³IêgB™ïòÄ ÐÇ^Ìö.ɽÚÓlç~,çÊæá›nÇå‚$é_à x1’Øk7€ _ê¼Èó‡‘XÑFþ\бö5è ±ŽFpj<ÂÑ»~ Óg´¶6 ‹íž{¦(Fø¬}§ŠGçžá:Ü{¸m ·]Øcó6ï„ð©–Ž>&/4*¤¥B#mÚ÷EïÎ)g®q¹ <[l[}ge@¼­:Z!wAÇhýŒyÉ:€©¬£&ý#YBÿl¨å<Õr¾Sˆ¿HY’ƒÆ3Ÿ}Ô~ȵFOQ-Xÿfž¡Ø´ 7÷Ï´¥GSrÄÅœ˜ƒ¬‚Q¹uv—M+z˜Ì…ÐóʦÖ!Ô…‘³*?FV 2ÒFoóN€ä?ôL8½ S¬úÎœ“ ±åqmïÝû[¸9äzîë“ÖÙå¸<›–>ë3¡/YÞ-@ðδ©ûÁò§2¯qr¿_Œ)ôN/Îã¹ÜéaœÝg!©Õ-¨Ò”¢1UAõ~YÏó9rE¨TZdQWmp¢‰*ƒ¤S ¢“GëÉ©…r/Ïæ£+‡.yPülº ÿ¼nÁ öˆ‚IÄ'ÞïÛ ™z6®u®NJÖE¢êàí_/ù”W_é9ÐåÓÒû%/’q°e Ëú™'4a.ÕCkÂXº÷YŸm˜4Í_•9_åìx`ì5ÞöÑVîíÊwK3¦ÛOýIÇn¾ã—`pB¥<$NL <ëóîÓåLMæ¡Â÷(+î!ÅSî±vXž]wXý†¿jZ£íPÍëÜ,"ä¾r#pŽãýÒ½úi>IˆI¢9÷õ½¥T7”?¿¢UÞ¬Ü40¹b¨YÌDܤ§©ð‘Üáô3ÁìÝP½[ìt¨”jDz ÓÿÉ-¾Y\m³·õ¾&žçùò$‚,Z¦ö©?ö´æ½›éqóÉÙtËkå‚¿PŽç\ðѪY«Æhbõr’/Ãb íû ÕÓ’ 4>ïw`(•f."Kª¾è»|Шb ¾è“~Û½èzÚ>V_Ïì¥'v ¹½KšŸ]:,´žzv¸è ¸Æy¢q (¦'–ZžG®ŸìûãnšµªEþy”Ç]_ÔåW ­rµò¾KåCņ6ødjï.Ž„–ë×ù!‘ïÿ=äÒ?﹓7 Nf 0ë%x¬Õy×'Oµˆ‡¦ÿNÇbéÂ+? n• ¯™æhÇB’1ôgþç[H’>±esŸÚo‘º>­¯$ñæ|IÏ)ÿ B„²e³Pmò‰ 'B7¯$ås½µCÍ©Û*ïEF¯j9õRöÔKí™ò/æbßÙ[/&åeˆ€ÂÐm,I ®óª–ͽ3ùü”n3•v¶ù½ ²e³@«¨´=¸E‰Ø‘"Ai³lWu.AÆHúI–”¿¹S‚xéTáµv2]9P-âá¨2ê=KGt5SmÚ];¢_JŠ—PS¼Gì%ȯ[œg§mž üe®<ÎŽ¡$2\Й%ðjà‚Îlü®ÊÌyó´é:0ܦt.‘A[@ŵkê‘ ßµ=ÜÖÀ%m3ܤmx5¸Aµ)ßøƒ*å'oûñÚûƒ&+ê‰r¦‰x1qÄ‹Ó“½$…Å«¤#Á¸î£jéX-˜Ž:9zÿïÒQÍåï4¸Å^Ô}ùÇ‹—™n©I@–t¥¢¼uº‚?`ÿÚ`"B886ûÀhHV°½¼Ç·Ž~õrŽ/ bù 2èÅ ÚŒìØpcU¥ŒÈmœtæ6>ÜMU1 Š¸ñ†ôbÝ4è-Šò=^£ŸœÓGävO´54Ö¬Ô#©_ïJ)$ðÛ8éŽxxp¯ÑÐ):¯¬#ÔümwãŠ4Îè‘Æ,àÕØs»97$Öë´qάQ¨"9Å‹3]¼8ËØKQ¼JÞy_vÓAÞU‹xØy ±óX,]fæCòñ¨íMl­ÎÖl ôù»Âà~¾zîœF:·m}¾ëÒ­ÖçY§0n«Î¶<ßéÜ»> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 12 0 obj <> endobj 13 0 obj <> endobj 11 0 obj <> endobj 15 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 14 0 obj <>stream xœ¥”{LSwÇ—¶·Weàc7‹ÓÝÛlF!@ÍP̦TÄ‚¦…¬´…>¼ÞRŠ"á]ûC^U …Y™¢Ù$˜¹¨õº-tC|ĘlC³M‰Nã–èï’ß–¬€ˆÎíeÉMîýýrÎç|ÏÉ÷\HAòØÄää G>犳qv€ø–ÄmbÕðZ ”À@é±ÙdãtT6 é‚QÊT !“¥$Öd¶qºL-¯ÉU,ˆŽ^<_±022ZñAÃé2ÔFE¢š×j jÞÈV$™2tÞ¦yOËóæ¥V«5\mØnâ2—…ÎWXu¼V¡ÔìÖp9šŠÕ&#¯X§6hcêÂÇ^±&ƒÙÂk8E¢i‡†3‚Œ&3Ç[32µ:ÃÒðÖƒ `#H›ÀV°¬ñ`-Xf`0ûRÀƒÏ‰9D9ñs€%`@¥„t«ô‰,B¶Af‰‡¡€nÄJöIÄ(ÔK?TõFÇ¥iró˜nXŸÁÄ“ù» ÑØëÙÏpúÄ Í#ëÛ`GÇ.˜Ï¦£xò×þ3„:½’Á{ÒåÿEúë• èG|¨É_o;ʦѴÈG`‚§áé÷ž>½÷Mgð6¼„ŽM¼y¨ïÛ¾øð°Ä±¬€9-]å“ TÌÑ/(Ñ“­æn£RO†î£(xñÃwbTi…Elt½ÜΟ¾ÐÎq/}Éëõ]b„ÅÅ­\±óö9fl>ýÂ|(á–e£4š2xõvu tT3•™Gíµjihl>£nHY£4$©ØÓòÎÒC:fîû&î_þÂà#yûÙHn¿»G‹,ò7”-N¢QÔDŽúü¶dé!oc¢£äùæg¤;¸š ïÓ]»ð¨ý77lÖgAKãX¯,ä!õ><×:2®²&4,.1W"nös[=~¨y*%G9í~ÎY2 2YÞ¶Ç[xÜæ³×éa,/°}h+1Úm”ƒÜ‚ÙY²¾ýoÙØÊ~…‡j´ ö8ó4<àt_9x¢ábe;UAVì«65-s¯9Pt 6B7¬í¦žà†åÞ1A·q°˜//Î/c,É•î†TTìÕ¡/;½ÑÞ´ßq­Ý_á€e•éŽH5qµ_™ Óðòd¬XŒƒ†æ¡@ôæ‰G £Þ°yÑj¯àEé^¢ß‡’|§/Iòkº@/©¬ªr²îü®}'!uwàúOigNÛVßZ骨ÉîpT@ªÎã>stream 2013-03-04T16:40:14Z 2013-03-04T16:40:14Z dvips()5.98 Copyright 2009 Radical Eye Software pins.dvi endstream endobj 2 0 obj <>endobj xref 0 17 0000000000 65535 f 0000005295 00000 n 0000009138 00000 n 0000005236 00000 n 0000005076 00000 n 0000000015 00000 n 0000005056 00000 n 0000005360 00000 n 0000005943 00000 n 0000005616 00000 n 0000006012 00000 n 0000005481 00000 n 0000005401 00000 n 0000005431 00000 n 0000006305 00000 n 0000005562 00000 n 0000007723 00000 n trailer << /Size 17 /Root 1 0 R /Info 2 0 R /ID [<6ECA4E15E91E2650FFA2CF17C0A2D4B8><6ECA4E15E91E2650FFA2CF17C0A2D4B8>] >> startxref 9340 %%EOF wiringPi/pins/pins.tex0000644000000000000000000001033512457032564014022 0ustar rootroot\documentclass[12pt,a4paper]{article} \parskip 1ex \parindent 0em \thispagestyle{empty} \pagestyle{plain} \pagenumbering{arabic} \setlength{\topmargin}{0pt} \setlength{\headheight}{0pt} \setlength{\headsep}{0pt} \setlength{\topskip}{0pt} \setlength{\textheight}{240mm} \setlength{\footskip}{5ex} \setlength{\oddsidemargin}{0pt} \setlength{\evensidemargin}{0pt} \setlength{\textwidth}{160mm} \usepackage[dvips]{graphics,color} \usepackage{helvet} \renewcommand{\familydefault}{\sfdefault} \begin{document} \begin{sffamily} \definecolor{rtb-black}{rgb} {0.0, 0.0, 0.0} \definecolor{rtb-navy}{rgb} {0.0, 0.0, 0.5} \definecolor{rtb-green}{rgb} {0.0, 0.5, 0.0} \definecolor{rtb-teal}{rgb} {0.0, 0.5, 0.5} \definecolor{rtb-maroon}{rgb} {0.5, 0.0, 0.0} \definecolor{rtb-purple}{rgb} {0.5, 0.0, 0.5} \definecolor{rtb-olive}{rgb} {0.5, 0.5, 0.0} \definecolor{rtb-silver}{rgb} {0.7, 0.7, 0.7} \definecolor{rtb-grey}{rgb} {0.5, 0.5, 0.5} \definecolor{rtb-blue}{rgb} {0.0, 0.0, 1.0} \definecolor{rtb-lime}{rgb} {0.0, 1.0, 0.0} \definecolor{rtb-aqua}{rgb} {0.0, 1.0, 1.0} \definecolor{rtb-red}{rgb} {1.0, 0.0, 0.0} \definecolor{rtb-fuchsia}{rgb}{1.0, 0.0, 1.0} \definecolor{rtb-yellow}{rgb} {1.0, 1.0, 0.0} \definecolor{rtb-white}{rgb} {1.0, 1.0, 1.0} \begin{center} \bfseries{WiringPi: GPIO Pin Numbering Tables}\\ \tt{http://wiringpi.com/} \end{center} \begin{center} \begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} \hline \multicolumn{8}{|c|}{\bfseries{P1: The Main GPIO connector}}\\ \hline \hline WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ \hline \hline & & \textcolor{rtb-red}{3.3v} & \raggedleft{1} & 2 & \textcolor{rtb-maroon}{5v} & & \\ \hline 8 & Rv1:0 - Rv2:2 & \textcolor{rtb-aqua}{SDA} & \raggedleft{3} & 4 & \textcolor{rtb-maroon}{5v} & & \\ \hline 9 & Rv1:1 - Rv2:3 & \textcolor{rtb-aqua}{SCL} & \raggedleft{5} & 6 & \textcolor{rtb-black}{0v} & & \\ \hline 7 & 4 & \textcolor{rtb-green}{GPIO7} & \raggedleft{7} & 8 & \textcolor{rtb-yellow}{TxD} & 14 & 15\\ \hline & & \textcolor{rtb-black}{0v} & \raggedleft{9} & 10 & \textcolor{rtb-yellow}{RxD} & 15 & 16\\ \hline 0 & 17 & \textcolor{rtb-green}{GPIO0} & \raggedleft{11} & 12 & \textcolor{rtb-green}{GPIO1} & 18 & 1\\ \hline 2 & Rv1:21 - Rv2:27 & \textcolor{rtb-green}{GPIO2} & \raggedleft{13} & 14 & \textcolor{rtb-black}{0v} & & \\ \hline 3 & 22 & \textcolor{rtb-green}{GPIO3} & \raggedleft{15} & 16 & \textcolor{rtb-green}{GPIO4} & 23 & 4\\ \hline & & \textcolor{rtb-red}{3.3v} & \raggedleft{17} & 18 & \textcolor{rtb-green}{GPIO5} & 24 & 5\\ \hline 12 & 10 & \textcolor{rtb-teal}{MOSI} & \raggedleft{19} & 20 & \textcolor{rtb-black}{0v} & & \\ \hline 13 & 9 & \textcolor{rtb-teal}{MISO} & \raggedleft{21} & 22 & \textcolor{rtb-green}{GPIO6} & 25 & 6\\ \hline 14 & 11 & \textcolor{rtb-teal}{SCLK} & \raggedleft{23} & 24 & \textcolor{rtb-teal}{CE0} & 8 & 10\\ \hline & & \textcolor{rtb-black}{0v} & \raggedleft{25} & 26 & \textcolor{rtb-teal}{CE1} & 7 & 11\\ \hline \hline WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ \hline \end{tabular} \end{center} Note the differences between Revision 1 and Revision 2 Raspberry Pi's. The Revision 2 is readily identifiable by the presence of the 2 mounting holes. The revision 2 Raspberry Pi has an additional GPIO connector, P5, which is next to the main P1 GPIO connector: \begin{center} \begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} \hline \multicolumn{8}{|c|}{\bfseries{P5: Secondary GPIO connector (Rev. 2 Pi only)}}\\ \hline \hline WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ \hline \hline & & \textcolor{rtb-maroon}{5v} & \raggedleft{1} & 2 & \textcolor{rtb-red}{3.3v} & & \\ \hline 17 & 28 & \textcolor{rtb-green}{GPIO8} & \raggedleft{3} & 4 & \textcolor{rtb-green}{GPIO9} & 29 & 18 \\ \hline 19 & 30 & \textcolor{rtb-green}{GPIO10} & \raggedleft{5} & 6 & \textcolor{rtb-green}{GPIO11} & 31 & 20 \\ \hline & & \textcolor{rtb-black}{0v} & \raggedleft{7} & 8 & \textcolor{rtb-black}{0v} & & \\ \hline \hline WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ \hline \end{tabular} \end{center} \end{sffamily} \end{document} wiringPi/pins/Makefile0000644000000000000000000000032312457032564013763 0ustar rootroot SRC = pins.tex all: ${SRC} @echo Generating DVI @latex pins.tex pins.dvi: pins.tex @latex pins.tex pdf: pins.dvi @dvipdf pins.dvi .PHONY: clean clean: @rm -f *.dvi *.aux *.log *.ps *.toc *.bak *~ wiringPi/wiringPi/0000755000000000000000000000000012457032564013144 5ustar rootrootwiringPi/wiringPi/max31855.c0000644000000000000000000000473212457032564014511 0ustar rootroot/* * max31855.c: * Extend wiringPi with the max31855 SPI Analog to Digital convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "max31855.h" /* * myAnalogRead: * Return the analog value of the given pin * Note: The chip really only has one read "channel", but we're faking it * here so we can read the error registers. Channel 0 will be the data * channel, and 1 is the error register code. * Note: Temperature returned is temp in C * 4, so divide result by 4 ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { unsigned int spiData ; int temp ; int chan = pin - node->pinBase ; wiringPiSPIDataRW (node->fd, (unsigned char *)&spiData, 4) ; if (chan == 0) // Read temp in C { spiData >>= 18 ; temp = spiData & 0x3FFF ; // Bottom 13 bits if ((spiData & 0x2000) != 0) // Negative temp = -temp ; return temp ; } else // Return error bits return spiData & 0x7 ; } /* * max31855Setup: * Create a new wiringPi device node for an max31855 on the Pi's * SPI interface. ********************************************************************************* */ int max31855Setup (const int pinBase, int spiChannel) { struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 5000000) < 0) // 5MHz - prob 4 on the Pi return -1 ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; return 0 ; } wiringPi/wiringPi/softTone.h0000644000000000000000000000262412457032564015122 0ustar rootroot/* * softTone.c: * For that authentic retro sound... * Er... A little experiment to produce tones out of a Pi using * one (or 2) GPIO pins and a piezeo "speaker" element. * (Or a high impedance speaker, but don'y blame me if you blow-up * the GPIO pins!) * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int softToneCreate (int pin) ; extern void softToneStop (int pin) ; extern void softToneWrite (int pin, int freq) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23s08.h0000644000000000000000000000225712457032564014602 0ustar rootroot/* * 23s08.h: * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23017.c0000644000000000000000000001045212457032564014466 0ustar rootroot/* * mcp23017.c: * Extend wiringPi with the MCP 23017 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiI2C.h" #include "mcp23x0817.h" #include "mcp23017.h" /* * myPinMode: ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; pin -= node->pinBase ; if (pin < 8) // Bank A reg = MCP23x17_IODIRA ; else { reg = MCP23x17_IODIRB ; pin &= 0x07 ; } mask = 1 << pin ; old = wiringPiI2CReadReg8 (node->fd, reg) ; if (mode == OUTPUT) old &= (~mask) ; else old |= mask ; wiringPiI2CWriteReg8 (node->fd, reg, old) ; } /* * myPullUpDnControl: ********************************************************************************* */ static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; pin -= node->pinBase ; if (pin < 8) // Bank A reg = MCP23x17_GPPUA ; else { reg = MCP23x17_GPPUB ; pin &= 0x07 ; } mask = 1 << pin ; old = wiringPiI2CReadReg8 (node->fd, reg) ; if (mode == PUD_UP) old |= mask ; else old &= (~mask) ; wiringPiI2CWriteReg8 (node->fd, reg, old) ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; pin -= node->pinBase ; // Pin now 0-15 bit = 1 << (pin & 7) ; if (pin < 8) // Bank A { old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOA, old) ; node->data2 = old ; } else // Bank B { old = node->data3 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOB, old) ; node->data3 = old ; } } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value, gpio ; pin -= node->pinBase ; if (pin < 8) // Bank A gpio = MCP23x17_GPIOA ; else { gpio = MCP23x17_GPIOB ; pin &= 0x07 ; } mask = 1 << pin ; value = wiringPiI2CReadReg8 (node->fd, gpio) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * mcp23017Setup: * Create a new instance of an MCP23017 I2C GPIO interface. We know it * has 16 pins, so all we need to know here is the I2C address and the * user-defined pin base. ********************************************************************************* */ int mcp23017Setup (const int pinBase, const int i2cAddress) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; wiringPiI2CWriteReg8 (fd, MCP23x17_IOCON, IOCON_INIT) ; node = wiringPiNewNode (pinBase, 16) ; node->fd = fd ; node->pinMode = myPinMode ; node->pullUpDnControl = myPullUpDnControl ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATA) ; node->data3 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATB) ; return 0 ; } wiringPi/wiringPi/wiringPiSPI.h0000644000000000000000000000234212457032564015462 0ustar rootroot/* * wiringPiSPI.h: * Simplified SPI access routines * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif int wiringPiSPIGetFd (int channel) ; int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; int wiringPiSPISetup (int channel, int speed) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp3422.h0000644000000000000000000000250712457032564014413 0ustar rootroot/* * mcp3422.c: * Extend wiringPi with the MCP3422 I2C ADC chip *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #define MCP3422_SR_3_75 0 #define MCP3422_SR_15 1 #define MCP3422_SR_60 2 #define MCP3422_SR_240 3 #define MCP3422_GAIN_1 0 #define MCP3422_GAIN_2 1 #define MCP3422_GAIN_4 2 #define MCP3422_GAIN_8 3 #ifdef __cplusplus extern "C" { #endif extern int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23s17.h0000644000000000000000000000223512457032564014576 0ustar rootroot/* * 23s17.h: * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp23s17Setup (int pinBase, int spiPort, int devId) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23016.h0000644000000000000000000000224412457032564014472 0ustar rootroot/* * mcp23016.h: * Extend wiringPi with the MCP 23016 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp23016Setup (const int pinBase, const int i2cAddress) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/COPYING.LESSER0000644000000000000000000001674312457032564015206 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. wiringPi/wiringPi/mcp23017.h0000644000000000000000000000224112457032564014470 0ustar rootroot/* * 23017.h: * Extend wiringPi with the MCP 23017 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp23017Setup (const int pinBase, const int i2cAddress) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp3002.h0000644000000000000000000000224212457032564014401 0ustar rootroot/* * mcp3002.c: * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp3002Setup (int pinBase, int spiChannel) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp3004.h0000644000000000000000000000224212457032564014403 0ustar rootroot/* * mcp3004.c: * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp3004Setup (int pinBase, int spiChannel) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/sr595.c0000644000000000000000000000621512457032564014203 0ustar rootroot/* * sr595.c: * Extend wiringPi with the 74x595 shift register as a GPIO * expander chip. * Note that the code can cope with a number of 595's * daisy-chained together - up to 4 for now as we're storing * the output "register" in a single unsigned int. * * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "sr595.h" /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { unsigned int mask ; int dataPin, clockPin, latchPin ; int bit, bits, output ; pin -= node->pinBase ; // Normalise pin number bits = node->pinMax - node->pinBase + 1 ; // ie. number of clock pulses dataPin = node->data0 ; clockPin = node->data1 ; latchPin = node->data2 ; output = node->data3 ; mask = 1 << pin ; if (value == LOW) output &= (~mask) ; else output |= mask ; node->data3 = output ; // A low -> high latch transition copies the latch to the output pins digitalWrite (latchPin, LOW) ; delayMicroseconds (1) ; for (bit = bits - 1 ; bit >= 0 ; --bit) { digitalWrite (dataPin, output & (1 << bit)) ; digitalWrite (clockPin, HIGH) ; delayMicroseconds (1) ; digitalWrite (clockPin, LOW) ; delayMicroseconds (1) ; } digitalWrite (latchPin, HIGH) ; delayMicroseconds (1) ; } /* * sr595Setup: * Create a new instance of a 74x595 shift register GPIO expander. ********************************************************************************* */ int sr595Setup (const int pinBase, const int numPins, const int dataPin, const int clockPin, const int latchPin) { struct wiringPiNodeStruct *node ; node = wiringPiNewNode (pinBase, numPins) ; node->data0 = dataPin ; node->data1 = clockPin ; node->data2 = latchPin ; node->data3 = 0 ; // Output register node->digitalWrite = myDigitalWrite ; // Initialise the underlying hardware digitalWrite (dataPin, LOW) ; digitalWrite (clockPin, LOW) ; digitalWrite (latchPin, HIGH) ; pinMode (dataPin, OUTPUT) ; pinMode (clockPin, OUTPUT) ; pinMode (latchPin, OUTPUT) ; return 0 ; } wiringPi/wiringPi/mcp23008.c0000644000000000000000000000721112457032564014465 0ustar rootroot/* * mcp23008.c: * Extend wiringPi with the MCP 23008 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiI2C.h" #include "mcp23x0817.h" #include "mcp23008.h" /* * myPinMode: ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; reg = MCP23x08_IODIR ; mask = 1 << (pin - node->pinBase) ; old = wiringPiI2CReadReg8 (node->fd, reg) ; if (mode == OUTPUT) old &= (~mask) ; else old |= mask ; wiringPiI2CWriteReg8 (node->fd, reg, old) ; } /* * myPullUpDnControl: ********************************************************************************* */ static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; reg = MCP23x08_GPPU ; mask = 1 << (pin - node->pinBase) ; old = wiringPiI2CReadReg8 (node->fd, reg) ; if (mode == PUD_UP) old |= mask ; else old &= (~mask) ; wiringPiI2CWriteReg8 (node->fd, reg, old) ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; bit = 1 << ((pin - node->pinBase) & 7) ; old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWriteReg8 (node->fd, MCP23x08_GPIO, old) ; node->data2 = old ; } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value ; mask = 1 << ((pin - node->pinBase) & 7) ; value = wiringPiI2CReadReg8 (node->fd, MCP23x08_GPIO) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * mcp23008Setup: * Create a new instance of an MCP23008 I2C GPIO interface. We know it * has 8 pins, so all we need to know here is the I2C address and the * user-defined pin base. ********************************************************************************* */ int mcp23008Setup (const int pinBase, const int i2cAddress) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; wiringPiI2CWriteReg8 (fd, MCP23x08_IOCON, IOCON_INIT) ; node = wiringPiNewNode (pinBase, 8) ; node->fd = fd ; node->pinMode = myPinMode ; node->pullUpDnControl = myPullUpDnControl ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CReadReg8 (fd, MCP23x08_OLAT) ; return 0 ; } wiringPi/wiringPi/mcp23x0817.h0000644000000000000000000000503412457032564014753 0ustar rootroot/* * mcp23xxx: * Copyright (c) 2012-2013 Gordon Henderson * * Header file for code using the MCP23x08 and 17 GPIO expander * chips. * This comes in 2 flavours: MCP230xx (08/17) which has an I2C * interface, and the MXP23Sxx (08/17) which has an SPI interface. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ // MCP23x08 Registers #define MCP23x08_IODIR 0x00 #define MCP23x08_IPOL 0x01 #define MCP23x08_GPINTEN 0x02 #define MCP23x08_DEFVAL 0x03 #define MCP23x08_INTCON 0x04 #define MCP23x08_IOCON 0x05 #define MCP23x08_GPPU 0x06 #define MCP23x08_INTF 0x07 #define MCP23x08_INTCAP 0x08 #define MCP23x08_GPIO 0x09 #define MCP23x08_OLAT 0x0A // MCP23x17 Registers #define MCP23x17_IODIRA 0x00 #define MCP23x17_IPOLA 0x02 #define MCP23x17_GPINTENA 0x04 #define MCP23x17_DEFVALA 0x06 #define MCP23x17_INTCONA 0x08 #define MCP23x17_IOCON 0x0A #define MCP23x17_GPPUA 0x0C #define MCP23x17_INTFA 0x0E #define MCP23x17_INTCAPA 0x10 #define MCP23x17_GPIOA 0x12 #define MCP23x17_OLATA 0x14 #define MCP23x17_IODIRB 0x01 #define MCP23x17_IPOLB 0x03 #define MCP23x17_GPINTENB 0x05 #define MCP23x17_DEFVALB 0x07 #define MCP23x17_INTCONB 0x09 #define MCP23x17_IOCONB 0x0B #define MCP23x17_GPPUB 0x0D #define MCP23x17_INTFB 0x0F #define MCP23x17_INTCAPB 0x11 #define MCP23x17_GPIOB 0x13 #define MCP23x17_OLATB 0x15 // Bits in the IOCON register #define IOCON_UNUSED 0x01 #define IOCON_INTPOL 0x02 #define IOCON_ODR 0x04 #define IOCON_HAEN 0x08 #define IOCON_DISSLW 0x10 #define IOCON_SEQOP 0x20 #define IOCON_MIRROR 0x40 #define IOCON_BANK_MODE 0x80 // Default initialisation mode #define IOCON_INIT (IOCON_SEQOP) // SPI Command codes #define CMD_WRITE 0x40 #define CMD_READ 0x41 wiringPi/wiringPi/wiringShift.c0000644000000000000000000000435312457032564015612 0ustar rootroot/* * wiringShift.c: * Emulate some of the Arduino wiring functionality. * * Copyright (c) 2009-2012 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include "wiringPi.h" #include "wiringShift.h" /* * shiftIn: * Shift data in from a clocked source ********************************************************************************* */ uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) { uint8_t value = 0 ; int8_t i ; if (order == MSBFIRST) for (i = 7 ; i >= 0 ; --i) { digitalWrite (cPin, HIGH) ; value |= digitalRead (dPin) << i ; digitalWrite (cPin, LOW) ; } else for (i = 0 ; i < 8 ; ++i) { digitalWrite (cPin, HIGH) ; value |= digitalRead (dPin) << i ; digitalWrite (cPin, LOW) ; } return value; } /* * shiftOut: * Shift data out to a clocked source ********************************************************************************* */ void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) { int8_t i; if (order == MSBFIRST) for (i = 7 ; i >= 0 ; --i) { digitalWrite (dPin, val & (1 << i)) ; digitalWrite (cPin, HIGH) ; digitalWrite (cPin, LOW) ; } else for (i = 0 ; i < 8 ; ++i) { digitalWrite (dPin, val & (1 << i)) ; digitalWrite (cPin, HIGH) ; digitalWrite (cPin, LOW) ; } } wiringPi/wiringPi/mcp23s08.c0000644000000000000000000001107212457032564014570 0ustar rootroot/* * mcp23s08.c: * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiSPI.h" #include "mcp23x0817.h" #include "mcp23s08.h" #define MCP_SPEED 4000000 /* * writeByte: * Write a byte to a register on the MCP23s08 on the SPI bus. ********************************************************************************* */ static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) { uint8_t spiData [4] ; spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; spiData [1] = reg ; spiData [2] = data ; wiringPiSPIDataRW (spiPort, spiData, 3) ; } /* * readByte: * Read a byte from a register on the MCP23s08 on the SPI bus. ********************************************************************************* */ static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) { uint8_t spiData [4] ; spiData [0] = CMD_READ | ((devId & 7) << 1) ; spiData [1] = reg ; wiringPiSPIDataRW (spiPort, spiData, 3) ; return spiData [2] ; } /* * myPinMode: ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; reg = MCP23x08_IODIR ; mask = 1 << (pin - node->pinBase) ; old = readByte (node->data0, node->data1, reg) ; if (mode == OUTPUT) old &= (~mask) ; else old |= mask ; writeByte (node->data0, node->data1, reg, old) ; } /* * myPullUpDnControl: ********************************************************************************* */ static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; reg = MCP23x08_GPPU ; mask = 1 << (pin - node->pinBase) ; old = readByte (node->data0, node->data1, reg) ; if (mode == PUD_UP) old |= mask ; else old &= (~mask) ; writeByte (node->data0, node->data1, reg, old) ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; bit = 1 << ((pin - node->pinBase) & 7) ; old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; writeByte (node->data0, node->data1, MCP23x08_GPIO, old) ; node->data2 = old ; } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value ; mask = 1 << ((pin - node->pinBase) & 7) ; value = readByte (node->data0, node->data1, MCP23x08_GPIO) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * mcp23s08Setup: * Create a new instance of an MCP23s08 SPI GPIO interface. We know it * has 8 pins, so all we need to know here is the SPI address and the * user-defined pin base. ********************************************************************************* */ int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) { int x ; struct wiringPiNodeStruct *node ; if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0) return x ; writeByte (spiPort, devId, MCP23x08_IOCON, IOCON_INIT) ; node = wiringPiNewNode (pinBase, 8) ; node->data0 = spiPort ; node->data1 = devId ; node->pinMode = myPinMode ; node->pullUpDnControl = myPullUpDnControl ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = readByte (spiPort, devId, MCP23x08_OLAT) ; return 0 ; } wiringPi/wiringPi/piHiPri.c0000644000000000000000000000312312457032564014653 0ustar rootroot/* * piHiPri: * Simple way to get your program running at high priority * with realtime schedulling. * * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" /* * piHiPri: * Attempt to set a high priority schedulling for the running program ********************************************************************************* */ int piHiPri (const int pri) { struct sched_param sched ; memset (&sched, 0, sizeof(sched)) ; if (pri > sched_get_priority_max (SCHED_RR)) sched.sched_priority = sched_get_priority_max (SCHED_RR) ; else sched.sched_priority = pri ; return sched_setscheduler (0, SCHED_RR, &sched) ; } wiringPi/wiringPi/mcp4802.h0000644000000000000000000000224212457032564014412 0ustar rootroot/* * mcp4802.c: * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp4802Setup (int pinBase, int spiChannel) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/wiringPiI2C.h0000644000000000000000000000305312457032564015404 0ustar rootroot/* * wiringPiI2C.h: * Simplified I2C access routines * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int wiringPiI2CRead (int fd) ; extern int wiringPiI2CReadReg8 (int fd, int reg) ; extern int wiringPiI2CReadReg16 (int fd, int reg) ; extern int wiringPiI2CWrite (int fd, int data) ; extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; extern int wiringPiI2CSetupInterface (const char *device, int devId) ; extern int wiringPiI2CSetup (const int devId) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/pcf8591.h0000644000000000000000000000224712457032564014421 0ustar rootroot/* * pcf8591.h: * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int pcf8591Setup (const int pinBase, const int i2cAddress) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/wiringPi.h0000644000000000000000000001450012457032564015105 0ustar rootroot/* * wiringPi: * Arduino compatable (ish) Wiring library for the Raspberry Pi * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #ifndef __WIRING_PI_H__ #define __WIRING_PI_H__ // Handy defines // Deprecated #define NUM_PINS 17 #define WPI_MODE_PINS 0 #define WPI_MODE_GPIO 1 #define WPI_MODE_GPIO_SYS 2 #define WPI_MODE_PHYS 3 #define WPI_MODE_PIFACE 4 #define WPI_MODE_UNINITIALISED -1 // Pin modes #define INPUT 0 #define OUTPUT 1 #define PWM_OUTPUT 2 #define GPIO_CLOCK 3 #define SOFT_PWM_OUTPUT 4 #define SOFT_TONE_OUTPUT 5 #define PWM_TONE_OUTPUT 6 #define LOW 0 #define HIGH 1 // Pull up/down/none #define PUD_OFF 0 #define PUD_DOWN 1 #define PUD_UP 2 // PWM #define PWM_MODE_MS 0 #define PWM_MODE_BAL 1 // Interrupt levels #define INT_EDGE_SETUP 0 #define INT_EDGE_FALLING 1 #define INT_EDGE_RISING 2 #define INT_EDGE_BOTH 3 // Pi model types and version numbers // Intended for the GPIO program Use at your own risk. #define PI_MODEL_UNKNOWN 0 #define PI_MODEL_A 1 #define PI_MODEL_B 2 #define PI_MODEL_BP 3 #define PI_MODEL_CM 4 #define PI_MODEL_AP 5 #define PI_VERSION_UNKNOWN 0 #define PI_VERSION_1 1 #define PI_VERSION_1_1 2 #define PI_VERSION_1_2 3 #define PI_VERSION_2 4 #define PI_MAKER_UNKNOWN 0 #define PI_MAKER_EGOMAN 1 #define PI_MAKER_SONY 2 #define PI_MAKER_QISDA 3 #define PI_MAKER_MBEST 4 extern const char *piModelNames [6] ; extern const char *piRevisionNames [5] ; extern const char *piMakerNames [5] ; // Intended for the GPIO program Use at your own risk. // Threads #define PI_THREAD(X) void *X (void *dummy) // Failure modes #define WPI_FATAL (1==1) #define WPI_ALMOST (1==2) // wiringPiNodeStruct: // This describes additional device nodes in the extended wiringPi // 2.0 scheme of things. // It's a simple linked list for now, but will hopefully migrate to // a binary tree for efficiency reasons - but then again, the chances // of more than 1 or 2 devices being added are fairly slim, so who // knows.... struct wiringPiNodeStruct { int pinBase ; int pinMax ; int fd ; // Node specific unsigned int data0 ; // ditto unsigned int data1 ; // ditto unsigned int data2 ; // ditto unsigned int data3 ; // ditto void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ; void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ; int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ; void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ; void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; struct wiringPiNodeStruct *next ; } ; extern struct wiringPiNodeStruct *wiringPiNodes ; // Function prototypes // c++ wrappers thanks to a comment by Nick Lott // (and others on the Raspberry Pi forums) #ifdef __cplusplus extern "C" { #endif // Data //extern const char *piModelNames [] ; //extern const char *piRevisionNames[] ; // Internal extern int wiringPiFailure (int fatal, const char *message, ...) ; // Core wiringPi functions extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; extern int wiringPiSetup (void) ; extern int wiringPiSetupSys (void) ; extern int wiringPiSetupGpio (void) ; extern int wiringPiSetupPhys (void) ; extern void pinModeAlt (int pin, int mode) ; extern void pinMode (int pin, int mode) ; extern void pullUpDnControl (int pin, int pud) ; extern int digitalRead (int pin) ; extern void digitalWrite (int pin, int value) ; extern void pwmWrite (int pin, int value) ; extern int analogRead (int pin) ; extern void analogWrite (int pin, int value) ; // PiFace specifics // (Deprecated) extern int wiringPiSetupPiFace (void) ; extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only // On-Board Raspberry Pi hardware specific stuff extern int piBoardRev (void) ; extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ; extern int wpiPinToGpio (int wpiPin) ; extern int physPinToGpio (int physPin) ; extern void setPadDrive (int group, int value) ; extern int getAlt (int pin) ; extern void pwmToneWrite (int pin, int freq) ; extern void digitalWriteByte (int value) ; extern void pwmSetMode (int mode) ; extern void pwmSetRange (unsigned int range) ; extern void pwmSetClock (int divisor) ; extern void gpioClockSet (int pin, int freq) ; // Interrupts // (Also Pi hardware specific) extern int waitForInterrupt (int pin, int mS) ; extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; // Threads extern int piThreadCreate (void *(*fn)(void *)) ; extern void piLock (int key) ; extern void piUnlock (int key) ; // Schedulling priority extern int piHiPri (const int pri) ; // Extras from arduino land extern void delay (unsigned int howLong) ; extern void delayMicroseconds (unsigned int howLong) ; extern unsigned int millis (void) ; extern unsigned int micros (void) ; #ifdef __cplusplus } #endif #endif wiringPi/wiringPi/sn3218.h0000644000000000000000000000220512457032564014252 0ustar rootroot/* * sn3218.c: * Extend wiringPi with the SN3218 I2C LED driver board. * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int sn3218Setup (int pinBase) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/softTone.c0000644000000000000000000000645112457032564015117 0ustar rootroot/* * softTone.c: * For that authentic retro sound... * Er... A little experiment to produce tones out of a Pi using * one (or 2) GPIO pins and a piezeo "speaker" element. * (Or a high impedance speaker, but don'y blame me if you blow-up * the GPIO pins!) * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "softTone.h" #define MAX_PINS 64 #define PULSE_TIME 100 static int freqs [MAX_PINS] ; static pthread_t threads [MAX_PINS] ; static int newPin = -1 ; /* * softToneThread: * Thread to do the actual PWM output ********************************************************************************* */ static PI_THREAD (softToneThread) { int pin, freq, halfPeriod ; struct sched_param param ; param.sched_priority = sched_get_priority_max (SCHED_RR) ; pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; pin = newPin ; newPin = -1 ; piHiPri (50) ; for (;;) { freq = freqs [pin] ; if (freq == 0) delay (1) ; else { halfPeriod = 500000 / freq ; digitalWrite (pin, HIGH) ; delayMicroseconds (halfPeriod) ; digitalWrite (pin, LOW) ; delayMicroseconds (halfPeriod) ; } } return NULL ; } /* * softToneWrite: * Write a frequency value to the given pin ********************************************************************************* */ void softToneWrite (int pin, int freq) { pin &= 63 ; /**/ if (freq < 0) freq = 0 ; else if (freq > 5000) // Max 5KHz freq = 5000 ; freqs [pin] = freq ; } /* * softToneCreate: * Create a new tone thread. ********************************************************************************* */ int softToneCreate (int pin) { int res ; pthread_t myThread ; pinMode (pin, OUTPUT) ; digitalWrite (pin, LOW) ; if (threads [pin] != 0) return -1 ; freqs [pin] = 0 ; newPin = pin ; res = pthread_create (&myThread, NULL, softToneThread, NULL) ; while (newPin != -1) delay (1) ; threads [pin] = myThread ; return res ; } /* * softToneStop: * Stop an existing softTone thread ********************************************************************************* */ void softToneStop (int pin) { if (threads [pin] != 0) { pthread_cancel (threads [pin]) ; pthread_join (threads [pin], NULL) ; threads [pin] = 0 ; digitalWrite (pin, LOW) ; } } wiringPi/wiringPi/mcp4802.c0000644000000000000000000000422012457032564014403 0ustar rootroot/* * mcp4802.c: * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "mcp4802.h" /* * myAnalogWrite: * Write analog value on the given pin ********************************************************************************* */ static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) { unsigned char spiData [2] ; unsigned char chanBits, dataBits ; int chan = pin - node->pinBase ; if (chan == 0) chanBits = 0x30 ; else chanBits = 0xB0 ; chanBits |= ((value >> 4) & 0x0F) ; dataBits = ((value << 4) & 0xF0) ; spiData [0] = chanBits ; spiData [1] = dataBits ; wiringPiSPIDataRW (node->fd, spiData, 2) ; } /* * mcp4802Setup: * Create a new wiringPi device node for an mcp4802 on the Pi's * SPI interface. ********************************************************************************* */ int mcp4802Setup (const int pinBase, int spiChannel) { struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) return -1 ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogWrite = myAnalogWrite ; return 0 ; } wiringPi/wiringPi/wiringShift.h0000644000000000000000000000252712457032564015620 0ustar rootroot/* * wiringShift.h: * Emulate some of the Arduino wiring functionality. * * Copyright (c) 2009-2012 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #define LSBFIRST 0 #define MSBFIRST 1 #ifndef _STDINT_H # include #endif #ifdef __cplusplus extern "C" { #endif extern uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) ; extern void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/softServo.c0000644000000000000000000001431612457032564015307 0ustar rootroot/* * softServo.c: * Provide N channels of software driven PWM suitable for RC * servo motors. * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ //#include #include #include #include #include #include "wiringPi.h" #include "softServo.h" // RC Servo motors are a bit of an oddity - designed in the days when // radio control was experimental and people were tryin to make // things as simple as possible as it was all very expensive... // // So... To drive an RC Servo motor, you need to send it a modified PWM // signal - it needs anything from 1ms to 2ms - with 1ms meaning // to move the server fully left, and 2ms meaning to move it fully // right. Then you need a long gap before sending the next pulse. // The reason for this is that you send a multiplexed stream of these // pulses up the radio signal into the reciever which de-multiplexes // them into the signals for each individual servo. Typically there // might be 8 channels, so you need at least 8 "slots" of 2mS pulses // meaning the entire frame must fit into a 16mS slot - which would // then be repeated... // // In practice we have a total slot width of about 20mS - so we're sending 50 // updates per second to each servo. // // In this code, we don't need to be too fussy about the gap as we're not doing // the multipexing, but it does need to be at least 10mS, and preferably 16 // from what I've been able to determine. // WARNING: // This code is really experimental. It was written in response to some people // asking for a servo driver, however while it works, there is too much // jitter to successfully drive a small servo - I have tried it with a micro // servo and it worked, but the servo ran hot due to the jitter in the signal // being sent to it. // // If you want servo control for the Pi, then use the servoblaster kernel // module. #define MAX_SERVOS 8 static int pinMap [MAX_SERVOS] ; // Keep track of our pins static int pulseWidth [MAX_SERVOS] ; // microseconds /* * softServoThread: * Thread to do the actual Servo PWM output ********************************************************************************* */ static PI_THREAD (softServoThread) { register int i, j, k, m, tmp ; int lastDelay, pin, servo ; int myDelays [MAX_SERVOS] ; int myPins [MAX_SERVOS] ; struct timeval tNow, tStart, tPeriod, tGap, tTotal ; struct timespec tNs ; tTotal.tv_sec = 0 ; tTotal.tv_usec = 8000 ; piHiPri (50) ; for (;;) { gettimeofday (&tStart, NULL) ; memcpy (myDelays, pulseWidth, sizeof (myDelays)) ; memcpy (myPins, pinMap, sizeof (myPins)) ; // Sort the delays (& pins), shortest first for (m = MAX_SERVOS / 2 ; m > 0 ; m /= 2 ) for (j = m ; j < MAX_SERVOS ; ++j) for (i = j - m ; i >= 0 ; i -= m) { k = i + m ; if (myDelays [k] >= myDelays [i]) break ; else // Swap { tmp = myDelays [i] ; myDelays [i] = myDelays [k] ; myDelays [k] = tmp ; tmp = myPins [i] ; myPins [i] = myPins [k] ; myPins [k] = tmp ; } } // All on lastDelay = 0 ; for (servo = 0 ; servo < MAX_SERVOS ; ++servo) { if ((pin = myPins [servo]) == -1) continue ; digitalWrite (pin, HIGH) ; myDelays [servo] = myDelays [servo] - lastDelay ; lastDelay += myDelays [servo] ; } // Now loop, turning them all off as required for (servo = 0 ; servo < MAX_SERVOS ; ++servo) { if ((pin = myPins [servo]) == -1) continue ; delayMicroseconds (myDelays [servo]) ; digitalWrite (pin, LOW) ; } // Wait until the end of an 8mS time-slot gettimeofday (&tNow, NULL) ; timersub (&tNow, &tStart, &tPeriod) ; timersub (&tTotal, &tPeriod, &tGap) ; tNs.tv_sec = tGap.tv_sec ; tNs.tv_nsec = tGap.tv_usec * 1000 ; nanosleep (&tNs, NULL) ; } return NULL ; } /* * softServoWrite: * Write a Servo value to the given pin ********************************************************************************* */ void softServoWrite (int servoPin, int value) { int servo ; servoPin &= 63 ; /**/ if (value < -250) value = -250 ; else if (value > 1250) value = 1250 ; for (servo = 0 ; servo < MAX_SERVOS ; ++servo) if (pinMap [servo] == servoPin) pulseWidth [servo] = value + 1000 ; // uS } /* * softServoSetup: * Setup the software servo system ********************************************************************************* */ int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) { int servo ; if (p0 != -1) { pinMode (p0, OUTPUT) ; digitalWrite (p0, LOW) ; } if (p1 != -1) { pinMode (p1, OUTPUT) ; digitalWrite (p1, LOW) ; } if (p2 != -1) { pinMode (p2, OUTPUT) ; digitalWrite (p2, LOW) ; } if (p3 != -1) { pinMode (p3, OUTPUT) ; digitalWrite (p3, LOW) ; } if (p4 != -1) { pinMode (p4, OUTPUT) ; digitalWrite (p4, LOW) ; } if (p5 != -1) { pinMode (p5, OUTPUT) ; digitalWrite (p5, LOW) ; } if (p6 != -1) { pinMode (p6, OUTPUT) ; digitalWrite (p6, LOW) ; } if (p7 != -1) { pinMode (p7, OUTPUT) ; digitalWrite (p7, LOW) ; } pinMap [0] = p0 ; pinMap [1] = p1 ; pinMap [2] = p2 ; pinMap [3] = p3 ; pinMap [4] = p4 ; pinMap [5] = p5 ; pinMap [6] = p6 ; pinMap [7] = p7 ; for (servo = 0 ; servo < MAX_SERVOS ; ++servo) pulseWidth [servo] = 1500 ; // Mid point return piThreadCreate (softServoThread) ; } wiringPi/wiringPi/pcf8574.h0000644000000000000000000000224012457032564014413 0ustar rootroot/* * pcf8574.h: * Extend wiringPi with the PCF8574 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int pcf8574Setup (const int pinBase, const int i2cAddress) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/wiringSerial.c0000644000000000000000000001214312457032564015750 0ustar rootroot/* * wiringSerial.c: * Handle a serial port *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #include #include "wiringSerial.h" /* * serialOpen: * Open and initialise the serial port, setting all the right * port parameters - or as many as are required - hopefully! ********************************************************************************* */ int serialOpen (const char *device, const int baud) { struct termios options ; speed_t myBaud ; int status, fd ; switch (baud) { case 50: myBaud = B50 ; break ; case 75: myBaud = B75 ; break ; case 110: myBaud = B110 ; break ; case 134: myBaud = B134 ; break ; case 150: myBaud = B150 ; break ; case 200: myBaud = B200 ; break ; case 300: myBaud = B300 ; break ; case 600: myBaud = B600 ; break ; case 1200: myBaud = B1200 ; break ; case 1800: myBaud = B1800 ; break ; case 2400: myBaud = B2400 ; break ; case 4800: myBaud = B4800 ; break ; case 9600: myBaud = B9600 ; break ; case 19200: myBaud = B19200 ; break ; case 38400: myBaud = B38400 ; break ; case 57600: myBaud = B57600 ; break ; case 115200: myBaud = B115200 ; break ; case 230400: myBaud = B230400 ; break ; default: return -2 ; } if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1) return -1 ; fcntl (fd, F_SETFL, O_RDWR) ; // Get and modify current options: tcgetattr (fd, &options) ; cfmakeraw (&options) ; cfsetispeed (&options, myBaud) ; cfsetospeed (&options, myBaud) ; options.c_cflag |= (CLOCAL | CREAD) ; options.c_cflag &= ~PARENB ; options.c_cflag &= ~CSTOPB ; options.c_cflag &= ~CSIZE ; options.c_cflag |= CS8 ; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ; options.c_oflag &= ~OPOST ; options.c_cc [VMIN] = 0 ; options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds) tcsetattr (fd, TCSANOW | TCSAFLUSH, &options) ; ioctl (fd, TIOCMGET, &status); status |= TIOCM_DTR ; status |= TIOCM_RTS ; ioctl (fd, TIOCMSET, &status); usleep (10000) ; // 10mS return fd ; } /* * serialFlush: * Flush the serial buffers (both tx & rx) ********************************************************************************* */ void serialFlush (const int fd) { tcflush (fd, TCIOFLUSH) ; } /* * serialClose: * Release the serial port ********************************************************************************* */ void serialClose (const int fd) { close (fd) ; } /* * serialPutchar: * Send a single character to the serial port ********************************************************************************* */ void serialPutchar (const int fd, const unsigned char c) { write (fd, &c, 1) ; } /* * serialPuts: * Send a string to the serial port ********************************************************************************* */ void serialPuts (const int fd, const char *s) { write (fd, s, strlen (s)) ; } /* * serialPrintf: * Printf over Serial ********************************************************************************* */ void serialPrintf (const int fd, const char *message, ...) { va_list argp ; char buffer [1024] ; va_start (argp, message) ; vsnprintf (buffer, 1023, message, argp) ; va_end (argp) ; serialPuts (fd, buffer) ; } /* * serialDataAvail: * Return the number of bytes of data avalable to be read in the serial port ********************************************************************************* */ int serialDataAvail (const int fd) { int result ; if (ioctl (fd, FIONREAD, &result) == -1) return -1 ; return result ; } /* * serialGetchar: * Get a single character from the serial device. * Note: Zero is a valid character and this function will time-out after * 10 seconds. ********************************************************************************* */ int serialGetchar (const int fd) { uint8_t x ; if (read (fd, &x, 1) != 1) return -1 ; return ((int)x) & 0xFF ; } wiringPi/wiringPi/wiringPiSPI.c0000644000000000000000000000703012457032564015454 0ustar rootroot/* * wiringPiSPI.c: * Simplified SPI access routines * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include #include #include "wiringPi.h" #include "wiringPiSPI.h" // The SPI bus parameters // Variables as they need to be passed as pointers later on const static char *spiDev0 = "/dev/spidev0.0" ; const static char *spiDev1 = "/dev/spidev0.1" ; const static uint8_t spiMode = 0 ; const static uint8_t spiBPW = 8 ; const static uint16_t spiDelay = 0 ; static uint32_t spiSpeeds [2] ; static int spiFds [2] ; /* * wiringPiSPIGetFd: * Return the file-descriptor for the given channel ********************************************************************************* */ int wiringPiSPIGetFd (int channel) { return spiFds [channel & 1] ; } /* * wiringPiSPIDataRW: * Write and Read a block of data over the SPI bus. * Note the data ia being read into the transmit buffer, so will * overwrite it! * This is also a full-duplex operation. ********************************************************************************* */ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) { struct spi_ioc_transfer spi ; channel &= 1 ; spi.tx_buf = (unsigned long)data ; spi.rx_buf = (unsigned long)data ; spi.len = len ; spi.delay_usecs = spiDelay ; spi.speed_hz = spiSpeeds [channel] ; spi.bits_per_word = spiBPW ; return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; } /* * wiringPiSPISetup: * Open the SPI device, and set it up, etc. ********************************************************************************* */ int wiringPiSPISetup (int channel, int speed) { int fd ; channel &= 1 ; if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; spiSpeeds [channel] = speed ; spiFds [channel] = fd ; // Set SPI parameters. // Why are we reading it afterwriting it? I've no idea, but for now I'm blindly // copying example code I've seen online... if (ioctl (fd, SPI_IOC_WR_MODE, &spiMode) < 0) return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; return fd ; } wiringPi/wiringPi/max5322.c0000644000000000000000000000450012457032564014410 0ustar rootroot/* * max5322.c: * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "max5322.h" /* * myAnalogWrite: * Write analog value on the given pin ********************************************************************************* */ static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) { unsigned char spiData [2] ; unsigned char chanBits, dataBits ; int chan = pin - node->pinBase ; if (chan == 0) chanBits = 0b01000000 ; else chanBits = 0b01010000 ; chanBits |= ((value >> 12) & 0x0F) ; dataBits = ((value ) & 0xFF) ; spiData [0] = chanBits ; spiData [1] = dataBits ; wiringPiSPIDataRW (node->fd, spiData, 2) ; } /* * max5322Setup: * Create a new wiringPi device node for an max5322 on the Pi's * SPI interface. ********************************************************************************* */ int max5322Setup (const int pinBase, int spiChannel) { struct wiringPiNodeStruct *node ; unsigned char spiData [2] ; if (wiringPiSPISetup (spiChannel, 8000000) < 0) // 10MHz Max return -1 ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogWrite = myAnalogWrite ; // Enable both DACs spiData [0] = 0b11100000 ; spiData [1] = 0 ; wiringPiSPIDataRW (node->fd, spiData, 2) ; return 0 ; } wiringPi/wiringPi/mcp23008.h0000644000000000000000000000224112457032564014470 0ustar rootroot/* * 23008.h: * Extend wiringPi with the MCP 23008 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int mcp23008Setup (const int pinBase, const int i2cAddress) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/wiringPi.c0000644000000000000000000015365112457032564015113 0ustar rootroot/* * wiringPi: * Arduino compatable (ish) Wiring library for the Raspberry Pi * Copyright (c) 2012 Gordon Henderson * Additional code for pwmSetClock by Chris Hall * * Thanks to code samples from Gert Jan van Loo and the * BCM2835 ARM Peripherals manual, however it's missing * the clock section /grr/mutter/ *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ // Revisions: // 19 Jul 2012: // Moved to the LGPL // Added an abstraction layer to the main routines to save a tiny // bit of run-time and make the clode a little cleaner (if a little // larger) // Added waitForInterrupt code // Added piHiPri code // // 9 Jul 2012: // Added in support to use the /sys/class/gpio interface. // 2 Jul 2012: // Fixed a few more bugs to do with range-checking when in GPIO mode. // 11 Jun 2012: // Fixed some typos. // Added c++ support for the .h file // Added a new function to allow for using my "pin" numbers, or native // GPIO pin numbers. // Removed my busy-loop delay and replaced it with a call to delayMicroseconds // // 02 May 2012: // Added in the 2 UART pins // Change maxPins to numPins to more accurately reflect purpose #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "softPwm.h" #include "softTone.h" #include "wiringPi.h" #ifndef TRUE #define TRUE (1==1) #define FALSE (1==2) #endif // Environment Variables #define ENV_DEBUG "WIRINGPI_DEBUG" #define ENV_CODES "WIRINGPI_CODES" // Mask for the bottom 64 pins which belong to the Raspberry Pi // The others are available for the other devices #define PI_GPIO_MASK (0xFFFFFFC0) struct wiringPiNodeStruct *wiringPiNodes = NULL ; // BCM Magic #define BCM_PASSWORD 0x5A000000 // The BCM2835 has 54 GPIO pins. // BCM2835 data sheet, Page 90 onwards. // There are 6 control registers, each control the functions of a block // of 10 pins. // Each control register has 10 sets of 3 bits per GPIO pin - the ALT values // // 000 = GPIO Pin X is an input // 001 = GPIO Pin X is an output // 100 = GPIO Pin X takes alternate function 0 // 101 = GPIO Pin X takes alternate function 1 // 110 = GPIO Pin X takes alternate function 2 // 111 = GPIO Pin X takes alternate function 3 // 011 = GPIO Pin X takes alternate function 4 // 010 = GPIO Pin X takes alternate function 5 // // So the 3 bits for port X are: // X / 10 + ((X % 10) * 3) // Port function select bits #define FSEL_INPT 0b000 #define FSEL_OUTP 0b001 #define FSEL_ALT0 0b100 #define FSEL_ALT1 0b101 #define FSEL_ALT2 0b110 #define FSEL_ALT3 0b111 #define FSEL_ALT4 0b011 #define FSEL_ALT5 0b010 // Access from ARM Running Linux // Taken from Gert/Doms code. Some of this is not in the manual // that I can find )-: #define BCM2708_PERI_BASE 0x20000000 #define GPIO_PADS (BCM2708_PERI_BASE + 0x00100000) #define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000) #define GPIO_BASE (BCM2708_PERI_BASE + 0x00200000) #define GPIO_TIMER (BCM2708_PERI_BASE + 0x0000B000) #define GPIO_PWM (BCM2708_PERI_BASE + 0x0020C000) #define PAGE_SIZE (4*1024) #define BLOCK_SIZE (4*1024) // PWM // Word offsets into the PWM control region #define PWM_CONTROL 0 #define PWM_STATUS 1 #define PWM0_RANGE 4 #define PWM0_DATA 5 #define PWM1_RANGE 8 #define PWM1_DATA 9 // Clock regsiter offsets #define PWMCLK_CNTL 40 #define PWMCLK_DIV 41 #define PWM0_MS_MODE 0x0080 // Run in MS mode #define PWM0_USEFIFO 0x0020 // Data from FIFO #define PWM0_REVPOLAR 0x0010 // Reverse polarity #define PWM0_OFFSTATE 0x0008 // Ouput Off state #define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty #define PWM0_SERIAL 0x0002 // Run in serial mode #define PWM0_ENABLE 0x0001 // Channel Enable #define PWM1_MS_MODE 0x8000 // Run in MS mode #define PWM1_USEFIFO 0x2000 // Data from FIFO #define PWM1_REVPOLAR 0x1000 // Reverse polarity #define PWM1_OFFSTATE 0x0800 // Ouput Off state #define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty #define PWM1_SERIAL 0x0200 // Run in serial mode #define PWM1_ENABLE 0x0100 // Channel Enable // Timer // Word offsets #define TIMER_LOAD (0x400 >> 2) #define TIMER_VALUE (0x404 >> 2) #define TIMER_CONTROL (0x408 >> 2) #define TIMER_IRQ_CLR (0x40C >> 2) #define TIMER_IRQ_RAW (0x410 >> 2) #define TIMER_IRQ_MASK (0x414 >> 2) #define TIMER_RELOAD (0x418 >> 2) #define TIMER_PRE_DIV (0x41C >> 2) #define TIMER_COUNTER (0x420 >> 2) // Locals to hold pointers to the hardware static volatile uint32_t *gpio ; static volatile uint32_t *pwm ; static volatile uint32_t *clk ; static volatile uint32_t *pads ; #ifdef USE_TIMER static volatile uint32_t *timer ; static volatile uint32_t *timerIrqRaw ; #endif // Data for use with the boardId functions. // The order of entries here to correspond with the PI_MODEL_X // and PI_VERSION_X defines in wiringPi.h // Only intended for the gpio command - use at your own risk! const char *piModelNames [6] = { "Unknown", "Model A", "Model B", "Model B+", "Compute Module", "Model A+", } ; const char *piRevisionNames [5] = { "Unknown", "1", "1.1", "1.2", "2", } ; const char *piMakerNames [5] = { "Unknown", "Egoman", "Sony", "Qusda", "MBest", } ; // Time for easy calculations static uint64_t epochMilli, epochMicro ; // Misc static int wiringPiMode = WPI_MODE_UNINITIALISED ; static volatile int pinPass = -1 ; static pthread_mutex_t pinMutex ; // Debugging & Return codes int wiringPiDebug = FALSE ; int wiringPiReturnCodes = FALSE ; // sysFds: // Map a file descriptor from the /sys/class/gpio/gpioX/value static int sysFds [64] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, } ; // ISR Data static void (*isrFunctions [64])(void) ; // Doing it the Arduino way with lookup tables... // Yes, it's probably more innefficient than all the bit-twidling, but it // does tend to make it all a bit clearer. At least to me! // pinToGpio: // Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin // Cope for 3 different board revisions here. static int *pinToGpio ; // Revision 1, 1.1: static int pinToGpioR1 [64] = { 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9 8, 7, // SPI - CE1, CE0 wpi 10 - 11 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 14, 15, // UART - Tx, Rx wpi 15 - 16 // Padding: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 } ; // Revision 2: static int pinToGpioR2 [64] = { 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9 8, 7, // SPI - CE1, CE0 wpi 10 - 11 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 14, 15, // UART - Tx, Rx wpi 15 - 16 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29 0, 1, // B+ wpi 30, 31 // Padding: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 } ; // physToGpio: // Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin // Cope for 2 different board revisions here. // Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 static int *physToGpio ; static int physToGpioR1 [64] = { -1, // 0 -1, -1, // 1, 2 0, -1, 1, -1, 4, 14, -1, 15, 17, 18, 21, -1, 22, 23, -1, 24, 10, -1, 9, 25, 11, 8, -1, 7, // 25, 26 -1, -1, -1, -1, -1, // ... 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 } ; static int physToGpioR2 [64] = { -1, // 0 -1, -1, // 1, 2 2, -1, 3, -1, 4, 14, -1, 15, 17, 18, 27, -1, 22, 23, -1, 24, 10, -1, 9, 25, 11, 8, -1, 7, // 25, 26 // B+ 0, 1, 5, -1, 6, 12, 13, -1, 19, 16, 26, 20, -1, 21, // the P5 connector on the Rev 2 boards: -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, -1, -1, -1, -1, -1, -1, -1, -1, } ; // gpioToGPFSEL: // Map a BCM_GPIO pin to it's Function Selection // control port. (GPFSEL 0-5) // Groups of 10 - 3 bits per Function - 30 bits per port static uint8_t gpioToGPFSEL [] = { 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5, } ; // gpioToShift // Define the shift up for the 3 bits per pin in each GPFSEL port static uint8_t gpioToShift [] = { 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, 0,3,6,9,12,15,18,21,24,27, } ; // gpioToGPSET: // (Word) offset to the GPIO Set registers for each GPIO pin static uint8_t gpioToGPSET [] = { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, } ; // gpioToGPCLR: // (Word) offset to the GPIO Clear registers for each GPIO pin static uint8_t gpioToGPCLR [] = { 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, } ; // gpioToGPLEV: // (Word) offset to the GPIO Input level registers for each GPIO pin static uint8_t gpioToGPLEV [] = { 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, } ; #ifdef notYetReady // gpioToEDS // (Word) offset to the Event Detect Status static uint8_t gpioToEDS [] = { 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, } ; // gpioToREN // (Word) offset to the Rising edge ENable register static uint8_t gpioToREN [] = { 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, } ; // gpioToFEN // (Word) offset to the Falling edgde ENable register static uint8_t gpioToFEN [] = { 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, } ; #endif // GPPUD: // GPIO Pin pull up/down register #define GPPUD 37 // gpioToPUDCLK // (Word) offset to the Pull Up Down Clock regsiter static uint8_t gpioToPUDCLK [] = { 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, } ; // gpioToPwmALT // the ALT value to put a GPIO pin into PWM mode static uint8_t gpioToPwmALT [] = { 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 } ; // gpioToPwmPort // The port value to put a GPIO pin into PWM mode static uint8_t gpioToPwmPort [] = { 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 } ; // gpioToGpClkALT: // ALT value to put a GPIO pin into GP Clock mode. // On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 // for clocks 0 and 1 respectively, however I'll include the full // list for completeness - maybe one day... #define GPIO_CLOCK_SOURCE 1 // gpioToGpClkALT0: static uint8_t gpioToGpClkALT0 [] = { 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 } ; // gpioToClk: // (word) Offsets to the clock Control and Divisor register static uint8_t gpioToClkCon [] = { -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 } ; static uint8_t gpioToClkDiv [] = { -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 } ; /* * Functions ********************************************************************************* */ /* * wiringPiFailure: * Fail. Or not. ********************************************************************************* */ int wiringPiFailure (int fatal, const char *message, ...) { va_list argp ; char buffer [1024] ; if (!fatal && wiringPiReturnCodes) return -1 ; va_start (argp, message) ; vsnprintf (buffer, 1023, message, argp) ; va_end (argp) ; fprintf (stderr, "%s", buffer) ; exit (EXIT_FAILURE) ; return 0 ; } /* * piBoardRev: * Return a number representing the hardware revision of the board. * * Revision 1 really means the early Model B's. * Revision 2 is everything else - it covers the B, B+ and CM. * * Seems there are some boards with 0000 in them (mistake in manufacture) * So the distinction between boards that I can see is: * 0000 - Error * 0001 - Not used * 0002 - Model B, Rev 1, 256MB, Egoman * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed. * 0004 - Model B, Rev 2, 256MB, Sony * 0005 - Model B, Rev 2, 256MB, Qisda * 0006 - Model B, Rev 2, 256MB, Egoman * 0007 - Model A, Rev 2, 256MB, Egoman * 0008 - Model A, Rev 2, 256MB, Sony * 0009 - Model A, Rev 2, 256MB, Qisda * 000d - Model B, Rev 2, 512MB, Egoman * 000e - Model B, Rev 2, 512MB, Sony * 000f - Model B, Rev 2, 512MB, Qisda * 0010 - Model B+, Rev 1.2, 512MB, Sony * 0011 - Pi CM, Rev 1.2, 512MB, Sony * 0012 - Model A+ Rev 1.2, 256MB, Sony * * A small thorn is the olde style overvolting - that will add in * 1000000 * * The Pi compute module has an revision of 0011 - since we only check the * last digit, then it's 1, therefore it'll default to not 2 or 3 for a * Rev 1, so will appear as a Rev 2. This is fine for the most part, but * we'll properly detect the Compute Module later and adjust accordingly. * ********************************************************************************* */ static void piBoardRevOops (const char *why) { fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ; fprintf (stderr, " -> %s\n", why) ; fprintf (stderr, " -> You may want to check:\n") ; fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; exit (EXIT_FAILURE) ; } int piBoardRev (void) { FILE *cpuFd ; char line [120] ; char *c ; static int boardRev = -1 ; if (boardRev != -1) // No point checking twice return boardRev ; if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) piBoardRevOops ("Unable to open /proc/cpuinfo") ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) break ; fclose (cpuFd) ; if (strncmp (line, "Revision", 8) != 0) piBoardRevOops ("No \"Revision\" line") ; // Chomp trailing CR/NL for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) *c = 0 ; if (wiringPiDebug) printf ("piboardRev: Revision string: %s\n", line) ; // Scan to first digit for (c = line ; *c ; ++c) if (isdigit (*c)) break ; if (!isdigit (*c)) piBoardRevOops ("No numeric revision string") ; // Make sure its long enough if (strlen (c) < 4) piBoardRevOops ("Bogus \"Revision\" line (too small)") ; // If you have overvolted the Pi, then it appears that the revision // has 100000 added to it! // The actual condition for it being set is: // (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0 if (wiringPiDebug) if (strlen (c) != 4) printf ("piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0\n") ; // Isolate last 4 characters: c = c + strlen (c) - 4 ; if (wiringPiDebug) printf ("piboardRev: last4Chars are: \"%s\"\n", c) ; if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0)) boardRev = 1 ; else boardRev = 2 ; if (wiringPiDebug) printf ("piBoardRev: Returning revision: %d\n", boardRev) ; return boardRev ; } /* * piBoardId: * Do more digging into the board revision string as above, but return * as much details as we can. * This is undocumented and really only intended for the GPIO command. * Use at your own risk! ********************************************************************************* */ void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) { FILE *cpuFd ; char line [120] ; char *c ; (void)piBoardRev () ; // Call this first to make sure all's OK. Don't care about the result. if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) piBoardRevOops ("Unable to open /proc/cpuinfo") ; while (fgets (line, 120, cpuFd) != NULL) if (strncmp (line, "Revision", 8) == 0) break ; fclose (cpuFd) ; if (strncmp (line, "Revision", 8) != 0) piBoardRevOops ("No \"Revision\" line") ; // Chomp trailing CR/NL for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) *c = 0 ; if (wiringPiDebug) printf ("piboardId: Revision string: %s\n", line) ; // Scan to first digit for (c = line ; *c ; ++c) if (isdigit (*c)) break ; // Make sure its long enough if (strlen (c) < 4) piBoardRevOops ("Bogus \"Revision\" line") ; // If longer than 4, we'll assume it's been overvolted *overVolted = strlen (c) > 4 ; // Extract last 4 characters: c = c + strlen (c) - 4 ; // Fill out the replys as appropriate /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; } else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_MBEST ; } else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; } } /* * wpiPinToGpio: * Translate a wiringPi Pin number to native GPIO pin number. * Provided for external support. ********************************************************************************* */ int wpiPinToGpio (int wpiPin) { return pinToGpio [wpiPin & 63] ; } /* * physPinToGpio: * Translate a physical Pin number to native GPIO pin number. * Provided for external support. ********************************************************************************* */ int physPinToGpio (int physPin) { return physToGpio [physPin & 63] ; } /* * setPadDrive: * Set the PAD driver value ********************************************************************************* */ void setPadDrive (int group, int value) { uint32_t wrVal ; if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if ((group < 0) || (group > 2)) return ; wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; *(pads + group + 11) = wrVal ; if (wiringPiDebug) { printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; printf ("Read : %08X\n", *(pads + group + 11)) ; } } } /* * getAlt: * Returns the ALT bits for a given port. Only really of-use * for the gpio readall command (I think) ********************************************************************************* */ int getAlt (int pin) { int fSel, shift, alt ; pin &= 63 ; /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return 0 ; fSel = gpioToGPFSEL [pin] ; shift = gpioToShift [pin] ; alt = (*(gpio + fSel) >> shift) & 7 ; return alt ; } /* * pwmSetMode: * Select the native "balanced" mode, or standard mark:space mode ********************************************************************************* */ void pwmSetMode (int mode) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (mode == PWM_MODE_MS) *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; else *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; } } /* * pwmSetRange: * Set the PWM range register. We set both range registers to the same * value. If you want different in your own code, then write your own. ********************************************************************************* */ void pwmSetRange (unsigned int range) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; } } /* * pwmSetClock: * Set/Change the PWM clock. Originally my code, but changed * (for the better!) by Chris Hall, * after further study of the manual and testing with a 'scope ********************************************************************************* */ void pwmSetClock (int divisor) { uint32_t pwm_control ; divisor &= 4095 ; if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (wiringPiDebug) printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL // We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY // stays high. *(pwm + PWM_CONTROL) = 0 ; // Stop PWM // Stop PWM clock before changing divisor. The delay after this does need to // this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY // flag is not working properly in balanced mode. Without the delay when DIV is // adjusted the clock sometimes switches to very slow, once slow further DIV // adjustments do nothing and it's difficult to get out of this mode. *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock delayMicroseconds (110) ; // prevents clock going sloooow while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY delayMicroseconds (1) ; *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL if (wiringPiDebug) printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; } } /* * gpioClockSet: * Set the freuency on a GPIO clock pin ********************************************************************************* */ void gpioClockSet (int pin, int freq) { int divi, divr, divf ; pin &= 63 ; /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; divi = 19200000 / freq ; divr = 19200000 % freq ; divf = (int)((double)divr * 4096.0 / 19200000.0) ; if (divi > 4095) divi = 4095 ; *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait ; *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock } /* * wiringPiFindNode: * Locate our device node ********************************************************************************* */ struct wiringPiNodeStruct *wiringPiFindNode (int pin) { struct wiringPiNodeStruct *node = wiringPiNodes ; while (node != NULL) if ((pin >= node->pinBase) && (pin <= node->pinMax)) return node ; else node = node->next ; return NULL ; } /* * wiringPiNewNode: * Create a new GPIO node into the wiringPi handling system ********************************************************************************* */ static void pinModeDummy (struct wiringPiNodeStruct *node, int pin, int mode) { return ; } static void pullUpDnControlDummy (struct wiringPiNodeStruct *node, int pin, int pud) { return ; } static int digitalReadDummy (struct wiringPiNodeStruct *node, int pin) { return LOW ; } static void digitalWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } static void pwmWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } static int analogReadDummy (struct wiringPiNodeStruct *node, int pin) { return 0 ; } static void analogWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) { int pin ; struct wiringPiNodeStruct *node ; // Minimum pin base is 64 if (pinBase < 64) (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ; // Check all pins in-case there is overlap: for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin) if (wiringPiFindNode (pin) != NULL) (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros if (node == NULL) (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; node->pinBase = pinBase ; node->pinMax = pinBase + numPins - 1 ; node->pinMode = pinModeDummy ; node->pullUpDnControl = pullUpDnControlDummy ; node->digitalRead = digitalReadDummy ; node->digitalWrite = digitalWriteDummy ; node->pwmWrite = pwmWriteDummy ; node->analogRead = analogReadDummy ; node->analogWrite = analogWriteDummy ; node->next = wiringPiNodes ; wiringPiNodes = node ; return node ; } #ifdef notYetReady /* * pinED01: * pinED10: * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0 * Pin must already be in input mode with appropriate pull up/downs set. ********************************************************************************* */ void pinEnableED01Pi (int pin) { pin = pinToGpio [pin & 63] ; } #endif /* ********************************************************************************* * Core Functions ********************************************************************************* */ /* * pinModeAlt: * This is an un-documented special to let you set any pin to any mode ********************************************************************************* */ void pinModeAlt (int pin, int mode) { int fSel, shift ; if ((pin & PI_GPIO_MASK) == 0) // On-board pin { /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; fSel = gpioToGPFSEL [pin] ; shift = gpioToShift [pin] ; *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; } } /* * pinMode: * Sets the mode of a pin to be input, output or PWM output ********************************************************************************* */ void pinMode (int pin, int mode) { int fSel, shift, alt ; struct wiringPiNodeStruct *node = wiringPiNodes ; int origPin = pin ; if ((pin & PI_GPIO_MASK) == 0) // On-board pin { /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; softPwmStop (origPin) ; softToneStop (origPin) ; fSel = gpioToGPFSEL [pin] ; shift = gpioToShift [pin] ; /**/ if (mode == INPUT) *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input else if (mode == OUTPUT) *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; else if (mode == SOFT_PWM_OUTPUT) softPwmCreate (origPin, 0, 100) ; else if (mode == SOFT_TONE_OUTPUT) softToneCreate (origPin) ; else if (mode == PWM_TONE_OUTPUT) { pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode pwmSetMode (PWM_MODE_MS) ; } else if (mode == PWM_OUTPUT) { if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin return ; // Set pin to PWM mode *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; delayMicroseconds (110) ; // See comments in pwmSetClockWPi pwmSetMode (PWM_MODE_BAL) ; // Pi default mode pwmSetRange (1024) ; // Default range of 1024 pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM } else if (mode == GPIO_CLOCK) { if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin return ; // Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; delayMicroseconds (110) ; gpioClockSet (pin, 100000) ; } } else { if ((node = wiringPiFindNode (pin)) != NULL) node->pinMode (node, pin, mode) ; return ; } } /* * pullUpDownCtrl: * Control the internal pull-up/down resistors on a GPIO pin * The Arduino only has pull-ups and these are enabled by writing 1 * to a port when in input mode - this paradigm doesn't quite apply * here though. ********************************************************************************* */ void pullUpDnControl (int pin, int pud) { struct wiringPiNodeStruct *node = wiringPiNodes ; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ; *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ; *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ; *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ; } else // Extension module { if ((node = wiringPiFindNode (pin)) != NULL) node->pullUpDnControl (node, pin, pud) ; return ; } } /* * digitalRead: * Read the value of a given Pin, returning HIGH or LOW ********************************************************************************* */ int digitalRead (int pin) { char c ; struct wiringPiNodeStruct *node = wiringPiNodes ; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode { if (sysFds [pin] == -1) return LOW ; lseek (sysFds [pin], 0L, SEEK_SET) ; read (sysFds [pin], &c, 1) ; return (c == '0') ? LOW : HIGH ; } else if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return LOW ; if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) return HIGH ; else return LOW ; } else { if ((node = wiringPiFindNode (pin)) == NULL) return LOW ; return node->digitalRead (node, pin) ; } } /* * digitalWrite: * Set an output bit ********************************************************************************* */ void digitalWrite (int pin, int value) { struct wiringPiNodeStruct *node = wiringPiNodes ; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode { if (sysFds [pin] != -1) { if (value == LOW) write (sysFds [pin], "0\n", 2) ; else write (sysFds [pin], "1\n", 2) ; } return ; } else if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; if (value == LOW) *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ; else *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ; } else { if ((node = wiringPiFindNode (pin)) != NULL) node->digitalWrite (node, pin, value) ; } } /* * pwmWrite: * Set an output PWM value ********************************************************************************* */ void pwmWrite (int pin, int value) { struct wiringPiNodeStruct *node = wiringPiNodes ; if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin { /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; else if (wiringPiMode != WPI_MODE_GPIO) return ; *(pwm + gpioToPwmPort [pin]) = value ; } else { if ((node = wiringPiFindNode (pin)) != NULL) node->pwmWrite (node, pin, value) ; } } /* * analogRead: * Read the analog value of a given Pin. * There is no on-board Pi analog hardware, * so this needs to go to a new node. ********************************************************************************* */ int analogRead (int pin) { struct wiringPiNodeStruct *node = wiringPiNodes ; if ((node = wiringPiFindNode (pin)) == NULL) return 0 ; else return node->analogRead (node, pin) ; } /* * analogWrite: * Write the analog value to the given Pin. * There is no on-board Pi analog hardware, * so this needs to go to a new node. ********************************************************************************* */ void analogWrite (int pin, int value) { struct wiringPiNodeStruct *node = wiringPiNodes ; if ((node = wiringPiFindNode (pin)) == NULL) return ; node->analogWrite (node, pin, value) ; } /* * pwmToneWrite: * Pi Specific. * Output the given frequency on the Pi's PWM pin ********************************************************************************* */ void pwmToneWrite (int pin, int freq) { int range ; if (freq == 0) pwmWrite (pin, 0) ; // Off else { range = 600000 / freq ; pwmSetRange (range) ; pwmWrite (pin, freq / 2) ; } } /* * digitalWriteByte: * Pi Specific * Write an 8-bit byte to the first 8 GPIO pins - try to do it as * fast as possible. * However it still needs 2 operations to set the bits, so any external * hardware must not rely on seeing a change as there will be a change * to set the outputs bits to zero, then another change to set the 1's ********************************************************************************* */ void digitalWriteByte (int value) { uint32_t pinSet = 0 ; uint32_t pinClr = 0 ; int mask = 1 ; int pin ; /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) { for (pin = 0 ; pin < 8 ; ++pin) { digitalWrite (pin, value & mask) ; mask <<= 1 ; } return ; } else { for (pin = 0 ; pin < 8 ; ++pin) { if ((value & mask) == 0) pinClr |= (1 << pinToGpio [pin]) ; else pinSet |= (1 << pinToGpio [pin]) ; mask <<= 1 ; } *(gpio + gpioToGPCLR [0]) = pinClr ; *(gpio + gpioToGPSET [0]) = pinSet ; } } /* * waitForInterrupt: * Pi Specific. * Wait for Interrupt on a GPIO pin. * This is actually done via the /sys/class/gpio interface regardless of * the wiringPi access mode in-use. Maybe sometime it might get a better * way for a bit more efficiency. ********************************************************************************* */ int waitForInterrupt (int pin, int mS) { int fd, x ; uint8_t c ; struct pollfd polls ; /**/ if (wiringPiMode == WPI_MODE_PINS) pin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) pin = physToGpio [pin] ; if ((fd = sysFds [pin]) == -1) return -2 ; // Setup poll structure polls.fd = fd ; polls.events = POLLPRI ; // Urgent data! // Wait for it ... x = poll (&polls, 1, mS) ; // Do a dummy read to clear the interrupt // A one character read appars to be enough. // Followed by a seek to reset it. (void)read (fd, &c, 1) ; lseek (fd, 0, SEEK_SET) ; return x ; } /* * interruptHandler: * This is a thread and gets started to wait for the interrupt we're * hoping to catch. It will call the user-function when the interrupt * fires. ********************************************************************************* */ static void *interruptHandler (void *arg) { int myPin ; (void)piHiPri (55) ; // Only effective if we run as root myPin = pinPass ; pinPass = -1 ; for (;;) if (waitForInterrupt (myPin, -1) > 0) isrFunctions [myPin] () ; return NULL ; } /* * wiringPiISR: * Pi Specific. * Take the details and create an interrupt handler that will do a call- * back to the user supplied function. ********************************************************************************* */ int wiringPiISR (int pin, int mode, void (*function)(void)) { pthread_t threadId ; const char *modeS ; char fName [64] ; char pinS [8] ; pid_t pid ; int count, i ; char c ; int bcmGpioPin ; if ((pin < 0) || (pin > 63)) return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; else if (wiringPiMode == WPI_MODE_PINS) bcmGpioPin = pinToGpio [pin] ; else if (wiringPiMode == WPI_MODE_PHYS) bcmGpioPin = physToGpio [pin] ; else bcmGpioPin = pin ; // Now export the pin and set the right edge // We're going to use the gpio program to do this, so it assumes // a full installation of wiringPi. It's a bit 'clunky', but it // is a way that will work when we're running in "Sys" mode, as // a non-root user. (without sudo) if (mode != INT_EDGE_SETUP) { /**/ if (mode == INT_EDGE_FALLING) modeS = "falling" ; else if (mode == INT_EDGE_RISING) modeS = "rising" ; else modeS = "both" ; sprintf (pinS, "%d", bcmGpioPin) ; if ((pid = fork ()) < 0) // Fail return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; if (pid == 0) // Child, exec { /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0) { execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; } else if (access ("/usr/bin/gpio", X_OK) == 0) { execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; } else return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ; } else // Parent, wait wait (NULL) ; } // Now pre-open the /sys/class node - but it may already be open if // we are in Sys mode... if (sysFds [bcmGpioPin] == -1) { sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; } // Clear any initial pending interrupt ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ; for (i = 0 ; i < count ; ++i) read (sysFds [bcmGpioPin], &c, 1) ; isrFunctions [pin] = function ; pthread_mutex_lock (&pinMutex) ; pinPass = pin ; pthread_create (&threadId, NULL, interruptHandler, NULL) ; while (pinPass != -1) delay (1) ; pthread_mutex_unlock (&pinMutex) ; return 0 ; } /* * initialiseEpoch: * Initialise our start-of-time variable to be the current unix * time in milliseconds and microseconds. ********************************************************************************* */ static void initialiseEpoch (void) { struct timeval tv ; gettimeofday (&tv, NULL) ; epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; } /* * delay: * Wait for some number of milliseconds ********************************************************************************* */ void delay (unsigned int howLong) { struct timespec sleeper, dummy ; sleeper.tv_sec = (time_t)(howLong / 1000) ; sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; nanosleep (&sleeper, &dummy) ; } /* * delayMicroseconds: * This is somewhat intersting. It seems that on the Pi, a single call * to nanosleep takes some 80 to 130 microseconds anyway, so while * obeying the standards (may take longer), it's not always what we * want! * * So what I'll do now is if the delay is less than 100uS we'll do it * in a hard loop, watching a built-in counter on the ARM chip. This is * somewhat sub-optimal in that it uses 100% CPU, something not an issue * in a microcontroller, but under a multi-tasking, multi-user OS, it's * wastefull, however we've no real choice )-: * * Plan B: It seems all might not be well with that plan, so changing it * to use gettimeofday () and poll on that instead... ********************************************************************************* */ void delayMicrosecondsHard (unsigned int howLong) { struct timeval tNow, tLong, tEnd ; gettimeofday (&tNow, NULL) ; tLong.tv_sec = howLong / 1000000 ; tLong.tv_usec = howLong % 1000000 ; timeradd (&tNow, &tLong, &tEnd) ; while (timercmp (&tNow, &tEnd, <)) gettimeofday (&tNow, NULL) ; } void delayMicroseconds (unsigned int howLong) { struct timespec sleeper ; unsigned int uSecs = howLong % 1000000 ; unsigned int wSecs = howLong / 1000000 ; /**/ if (howLong == 0) return ; else if (howLong < 100) delayMicrosecondsHard (howLong) ; else { sleeper.tv_sec = wSecs ; sleeper.tv_nsec = (long)(uSecs * 1000L) ; nanosleep (&sleeper, NULL) ; } } /* * millis: * Return a number of milliseconds as an unsigned int. ********************************************************************************* */ unsigned int millis (void) { struct timeval tv ; uint64_t now ; gettimeofday (&tv, NULL) ; now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; return (uint32_t)(now - epochMilli) ; } /* * micros: * Return a number of microseconds as an unsigned int. ********************************************************************************* */ unsigned int micros (void) { struct timeval tv ; uint64_t now ; gettimeofday (&tv, NULL) ; now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; return (uint32_t)(now - epochMicro) ; } /* * wiringPiSetup: * Must be called once at the start of your program execution. * * Default setup: Initialises the system into wiringPi Pin mode and uses the * memory mapped hardware directly. * * Changed now to revert to "gpio" mode if we're running on a Compute Module. ********************************************************************************* */ int wiringPiSetup (void) { int fd ; int boardRev ; int model, rev, mem, maker, overVolted ; if (getenv (ENV_DEBUG) != NULL) wiringPiDebug = TRUE ; if (getenv (ENV_CODES) != NULL) wiringPiReturnCodes = TRUE ; if (geteuid () != 0) (void)wiringPiFailure (WPI_FATAL, "wiringPiSetup: Must be root. (Did you forget sudo?)\n") ; if (wiringPiDebug) printf ("wiringPi: wiringPiSetup called\n") ; boardRev = piBoardRev () ; /**/ if (boardRev == 1) // A, B, Rev 1, 1.1 { pinToGpio = pinToGpioR1 ; physToGpio = physToGpioR1 ; } else // A, B, Rev 2, B+, CM { pinToGpio = pinToGpioR2 ; physToGpio = physToGpioR2 ; } // Open the master /dev/memory device if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; // GPIO: gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; if ((int32_t)gpio == -1) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; // PWM pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; if ((int32_t)pwm == -1) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ; // Clock control (needed for PWM) clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ; if ((int32_t)clk == -1) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ; // The drive pads pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; if ((int32_t)pads == -1) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ; #ifdef USE_TIMER // The system timer timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; if ((int32_t)timer == -1) return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ; // Set the timer to free-running, 1MHz. // 0xF9 is 249, the timer divide is base clock / (divide+1) // so base clock is 250MHz / 250 = 1MHz. *(timer + TIMER_CONTROL) = 0x0000280 ; *(timer + TIMER_PRE_DIV) = 0x00000F9 ; timerIrqRaw = timer + TIMER_IRQ_RAW ; #endif initialiseEpoch () ; // If we're running on a compute module, then wiringPi pin numbers don't really many anything... piBoardId (&model, &rev, &mem, &maker, &overVolted) ; if (model == PI_MODEL_CM) wiringPiMode = WPI_MODE_GPIO ; else wiringPiMode = WPI_MODE_PINS ; return 0 ; } /* * wiringPiSetupGpio: * Must be called once at the start of your program execution. * * GPIO setup: Initialises the system into GPIO Pin mode and uses the * memory mapped hardware directly. ********************************************************************************* */ int wiringPiSetupGpio (void) { (void)wiringPiSetup () ; if (wiringPiDebug) printf ("wiringPi: wiringPiSetupGpio called\n") ; wiringPiMode = WPI_MODE_GPIO ; return 0 ; } /* * wiringPiSetupPhys: * Must be called once at the start of your program execution. * * Phys setup: Initialises the system into Physical Pin mode and uses the * memory mapped hardware directly. ********************************************************************************* */ int wiringPiSetupPhys (void) { (void)wiringPiSetup () ; if (wiringPiDebug) printf ("wiringPi: wiringPiSetupPhys called\n") ; wiringPiMode = WPI_MODE_PHYS ; return 0 ; } /* * wiringPiSetupSys: * Must be called once at the start of your program execution. * * Initialisation (again), however this time we are using the /sys/class/gpio * interface to the GPIO systems - slightly slower, but always usable as * a non-root user, assuming the devices are already exported and setup correctly. */ int wiringPiSetupSys (void) { int boardRev ; int pin ; char fName [128] ; if (getenv (ENV_DEBUG) != NULL) wiringPiDebug = TRUE ; if (getenv (ENV_CODES) != NULL) wiringPiReturnCodes = TRUE ; if (wiringPiDebug) printf ("wiringPi: wiringPiSetupSys called\n") ; boardRev = piBoardRev () ; if (boardRev == 1) { pinToGpio = pinToGpioR1 ; physToGpio = physToGpioR1 ; } else { pinToGpio = pinToGpioR2 ; physToGpio = physToGpioR2 ; } // Open and scan the directory, looking for exported GPIOs, and pre-open // the 'value' interface to speed things up for later for (pin = 0 ; pin < 64 ; ++pin) { sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; sysFds [pin] = open (fName, O_RDWR) ; } initialiseEpoch () ; wiringPiMode = WPI_MODE_GPIO_SYS ; return 0 ; } wiringPi/wiringPi/pcf8591.c0000644000000000000000000000474112457032564014415 0ustar rootroot/* * pcf8591.c: * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip * The chip has 1 8-bit DAC and 4 x 8-bit ADCs * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include "wiringPi.h" #include "wiringPiI2C.h" #include "pcf8591.h" /* * myAnalogWrite: ********************************************************************************* */ static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) { unsigned char b [2] ; b [0] = 0x40 ; b [1] = value & 0xFF ; write (node->fd, b, 2) ; } /* * myAnalogRead: ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { int x ; wiringPiI2CWrite (node->fd, 0x40 | ((pin - node->pinBase) & 3)) ; x = wiringPiI2CRead (node->fd) ; // Throw away the first read x = wiringPiI2CRead (node->fd) ; return x ; } /* * pcf8591Setup: * Create a new instance of a PCF8591 I2C GPIO interface. We know it * has 4 pins, (4 analog inputs and 1 analog output which we'll shadow * input 0) so all we need to know here is the I2C address and the * user-defined pin base. ********************************************************************************* */ int pcf8591Setup (const int pinBase, const int i2cAddress) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; node = wiringPiNewNode (pinBase, 4) ; node->fd = fd ; node->analogRead = myAnalogRead ; node->analogWrite = myAnalogWrite ; return 0 ; } wiringPi/wiringPi/mcp23016reg.h0000644000000000000000000000301112457032564015161 0ustar rootroot/* * mcp23016: * Copyright (c) 2012-2013 Gordon Henderson * * Header file for code using the MCP23016 GPIO expander * chip. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ // MCP23016 Registers #define MCP23016_GP0 0x00 #define MCP23016_GP1 0x01 #define MCP23016_OLAT0 0x02 #define MCP23016_OLAT1 0x03 #define MCP23016_IPOL0 0x04 #define MCP23016_IPOL1 0x05 #define MCP23016_IODIR0 0x06 #define MCP23016_IODIR1 0x07 #define MCP23016_INTCAP0 0x08 #define MCP23016_INTCAP1 0x09 #define MCP23016_IOCON0 0x0A #define MCP23016_IOCON1 0x0B // Bits in the IOCON register #define IOCON_IARES 0x01 // Default initialisation mode #define IOCON_INIT 0 wiringPi/wiringPi/softPwm.h0000644000000000000000000000234212457032564014755 0ustar rootroot/* * softPwm.h: * Provide 2 channels of software driven PWM. * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int softPwmCreate (int pin, int value, int range) ; extern void softPwmWrite (int pin, int value) ; extern void softPwmStop (int pin) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/wiringSerial.h0000644000000000000000000000273012457032564015756 0ustar rootroot/* * wiringSerial.h: * Handle a serial port *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int serialOpen (const char *device, const int baud) ; extern void serialClose (const int fd) ; extern void serialFlush (const int fd) ; extern void serialPutchar (const int fd, const unsigned char c) ; extern void serialPuts (const int fd, const char *s) ; extern void serialPrintf (const int fd, const char *message, ...) ; extern int serialDataAvail (const int fd) ; extern int serialGetchar (const int fd) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23s17.c0000644000000000000000000001247012457032564014573 0ustar rootroot/* * mcp23s17.c: * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiSPI.h" #include "mcp23x0817.h" #include "mcp23s17.h" #define MCP_SPEED 4000000 /* * writeByte: * Write a byte to a register on the MCP23s17 on the SPI bus. ********************************************************************************* */ static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) { uint8_t spiData [4] ; spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; spiData [1] = reg ; spiData [2] = data ; wiringPiSPIDataRW (spiPort, spiData, 3) ; } /* * readByte: * Read a byte from a register on the MCP23s17 on the SPI bus. ********************************************************************************* */ static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) { uint8_t spiData [4] ; spiData [0] = CMD_READ | ((devId & 7) << 1) ; spiData [1] = reg ; wiringPiSPIDataRW (spiPort, spiData, 3) ; return spiData [2] ; } /* * myPinMode: ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; pin -= node->pinBase ; if (pin < 8) // Bank A reg = MCP23x17_IODIRA ; else { reg = MCP23x17_IODIRB ; pin &= 0x07 ; } mask = 1 << pin ; old = readByte (node->data0, node->data1, reg) ; if (mode == OUTPUT) old &= (~mask) ; else old |= mask ; writeByte (node->data0, node->data1, reg, old) ; } /* * myPullUpDnControl: ********************************************************************************* */ static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; pin -= node->pinBase ; if (pin < 8) // Bank A reg = MCP23x17_GPPUA ; else { reg = MCP23x17_GPPUB ; pin &= 0x07 ; } mask = 1 << pin ; old = readByte (node->data0, node->data1, reg) ; if (mode == PUD_UP) old |= mask ; else old &= (~mask) ; writeByte (node->data0, node->data1, reg, old) ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; pin -= node->pinBase ; // Pin now 0-15 bit = 1 << (pin & 7) ; if (pin < 8) // Bank A { old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; writeByte (node->data0, node->data1, MCP23x17_GPIOA, old) ; node->data2 = old ; } else // Bank B { old = node->data3 ; if (value == LOW) old &= (~bit) ; else old |= bit ; writeByte (node->data0, node->data1, MCP23x17_GPIOB, old) ; node->data3 = old ; } } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value, gpio ; pin -= node->pinBase ; if (pin < 8) // Bank A gpio = MCP23x17_GPIOA ; else { gpio = MCP23x17_GPIOB ; pin &= 0x07 ; } mask = 1 << pin ; value = readByte (node->data0, node->data1, gpio) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * mcp23s17Setup: * Create a new instance of an MCP23s17 SPI GPIO interface. We know it * has 16 pins, so all we need to know here is the SPI address and the * user-defined pin base. ********************************************************************************* */ int mcp23s17Setup (const int pinBase, const int spiPort, const int devId) { int x ; struct wiringPiNodeStruct *node ; if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0) return x ; writeByte (spiPort, devId, MCP23x17_IOCON, IOCON_INIT | IOCON_HAEN) ; writeByte (spiPort, devId, MCP23x17_IOCONB, IOCON_INIT | IOCON_HAEN) ; node = wiringPiNewNode (pinBase, 16) ; node->data0 = spiPort ; node->data1 = devId ; node->pinMode = myPinMode ; node->pullUpDnControl = myPullUpDnControl ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = readByte (spiPort, devId, MCP23x17_OLATA) ; node->data3 = readByte (spiPort, devId, MCP23x17_OLATB) ; return 0 ; } wiringPi/wiringPi/softPwm.c0000644000000000000000000001024512457032564014751 0ustar rootroot/* * softPwm.c: * Provide 2 channels of software driven PWM. * Copyright (c) 2012-2014 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "softPwm.h" // MAX_PINS: // This is more than the number of Pi pins because we can actually softPwm // pins that are on GPIO expanders. It's not that efficient and more than 1 or // 2 pins on e.g. (SPI) mcp23s17 won't really be that effective, however... #define MAX_PINS 1024 // The PWM Frequency is derived from the "pulse time" below. Essentially, // the frequency is a function of the range and this pulse time. // The total period will be range * pulse time in µS, so a pulse time // of 100 and a range of 100 gives a period of 100 * 100 = 10,000 µS // which is a frequency of 100Hz. // // It's possible to get a higher frequency by lowering the pulse time, // however CPU uage will skyrocket as wiringPi uses a hard-loop to time // periods under 100µS - this is because the Linux timer calls are just // accurate at all, and have an overhead. // // Another way to increase the frequency is to reduce the range - however // that reduces the overall output accuracy... #define PULSE_TIME 100 static int marks [MAX_PINS] ; static int range [MAX_PINS] ; static pthread_t threads [MAX_PINS] ; int newPin = -1 ; /* * softPwmThread: * Thread to do the actual PWM output ********************************************************************************* */ static PI_THREAD (softPwmThread) { int pin, mark, space ; struct sched_param param ; param.sched_priority = sched_get_priority_max (SCHED_RR) ; pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; pin = newPin ; newPin = -1 ; piHiPri (90) ; for (;;) { mark = marks [pin] ; space = range [pin] - mark ; if (mark != 0) digitalWrite (pin, HIGH) ; delayMicroseconds (mark * 100) ; if (space != 0) digitalWrite (pin, LOW) ; delayMicroseconds (space * 100) ; } return NULL ; } /* * softPwmWrite: * Write a PWM value to the given pin ********************************************************************************* */ void softPwmWrite (int pin, int value) { pin &= (MAX_PINS - 1) ; /**/ if (value < 0) value = 0 ; else if (value > range [pin]) value = range [pin] ; marks [pin] = value ; } /* * softPwmCreate: * Create a new softPWM thread. ********************************************************************************* */ int softPwmCreate (int pin, int initialValue, int pwmRange) { int res ; pthread_t myThread ; if (range [pin] != 0) // Already running on this pin return -1 ; if (range <= 0) return -1 ; pinMode (pin, OUTPUT) ; digitalWrite (pin, LOW) ; marks [pin] = initialValue ; range [pin] = pwmRange ; newPin = pin ; res = pthread_create (&myThread, NULL, softPwmThread, NULL) ; while (newPin != -1) delay (1) ; threads [pin] = myThread ; return res ; } /* * softPwmStop: * Stop an existing softPWM thread ********************************************************************************* */ void softPwmStop (int pin) { if (range [pin] != 0) { pthread_cancel (threads [pin]) ; pthread_join (threads [pin], NULL) ; range [pin] = 0 ; digitalWrite (pin, LOW) ; } } wiringPi/wiringPi/mcp23016.c0000644000000000000000000000741012457032564014465 0ustar rootroot/* * mcp23016.c: * Extend wiringPi with the MCP 23016 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiI2C.h" #include "mcp23016.h" #include "mcp23016reg.h" /* * myPinMode: ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int mask, old, reg ; pin -= node->pinBase ; if (pin < 8) // Bank A reg = MCP23016_IODIR0 ; else { reg = MCP23016_IODIR1 ; pin &= 0x07 ; } mask = 1 << pin ; old = wiringPiI2CReadReg8 (node->fd, reg) ; if (mode == OUTPUT) old &= (~mask) ; else old |= mask ; wiringPiI2CWriteReg8 (node->fd, reg, old) ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; pin -= node->pinBase ; // Pin now 0-15 bit = 1 << (pin & 7) ; if (pin < 8) // Bank A { old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ; node->data2 = old ; } else // Bank B { old = node->data3 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ; node->data3 = old ; } } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value, gpio ; pin -= node->pinBase ; if (pin < 8) // Bank A gpio = MCP23016_GP0 ; else { gpio = MCP23016_GP1 ; pin &= 0x07 ; } mask = 1 << pin ; value = wiringPiI2CReadReg8 (node->fd, gpio) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * mcp23016Setup: * Create a new instance of an MCP23016 I2C GPIO interface. We know it * has 16 pins, so all we need to know here is the I2C address and the * user-defined pin base. ********************************************************************************* */ int mcp23016Setup (const int pinBase, const int i2cAddress) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ; wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ; node = wiringPiNewNode (pinBase, 16) ; node->fd = fd ; node->pinMode = myPinMode ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ; node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ; return 0 ; } wiringPi/wiringPi/max31855.h0000644000000000000000000000223512457032564014512 0ustar rootroot/* * max31855.c: * Extend wiringPi with the MAX31855 SPI Thermocouple driver * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int max31855Setup (int pinBase, int spiChannel) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp23x08.h0000644000000000000000000000375212457032564014610 0ustar rootroot/* * mcp23x17: * Copyright (c) 2012-2013 Gordon Henderson * * Header file for code using the MCP23x17 GPIO expander chip. * This comes in 2 flavours: MCP23017 which has an I2C interface, * an the MXP23S17 which has an SPI interface. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ // MCP23x17 Registers #define IODIRA 0x00 #define IPOLA 0x02 #define GPINTENA 0x04 #define DEFVALA 0x06 #define INTCONA 0x08 #define IOCON 0x0A #define GPPUA 0x0C #define INTFA 0x0E #define INTCAPA 0x10 #define GPIOA 0x12 #define OLATA 0x14 #define IODIRB 0x01 #define IPOLB 0x03 #define GPINTENB 0x05 #define DEFVALB 0x07 #define INTCONB 0x09 #define IOCONB 0x0B #define GPPUB 0x0D #define INTFB 0x0F #define INTCAPB 0x11 #define GPIOB 0x13 #define OLATB 0x15 // Bits in the IOCON register #define IOCON_UNUSED 0x01 #define IOCON_INTPOL 0x02 #define IOCON_ODR 0x04 #define IOCON_HAEN 0x08 #define IOCON_DISSLW 0x10 #define IOCON_SEQOP 0x20 #define IOCON_MIRROR 0x40 #define IOCON_BANK_MODE 0x80 // Default initialisation mode #define IOCON_INIT (IOCON_SEQOP) // SPI Command codes #define CMD_WRITE 0x40 #define CMD_READ 0x41 wiringPi/wiringPi/wiringPiI2C.c0000644000000000000000000001435112457032564015402 0ustar rootroot/* * wiringPiI2C.c: * Simplified I2C access routines * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ /* * Notes: * The Linux I2C code is actually the same (almost) as the SMBus code. * SMBus is System Management Bus - and in essentially I2C with some * additional functionality added, and stricter controls on the electrical * specifications, etc. however I2C does work well with it and the * protocols work over both. * * I'm directly including the SMBus functions here as some Linux distros * lack the correct header files, and also some header files are GPLv2 * rather than the LGPL that wiringPi is released under - presumably because * originally no-one expected I2C/SMBus to be used outside the kernel - * however enter the Raspberry Pi with people now taking directly to I2C * devices without going via the kernel... * * This may ultimately reduce the flexibility of this code, but it won't be * hard to maintain it and keep it current, should things change. * * Information here gained from: kernel/Documentation/i2c/dev-interface * as well as other online resources. ********************************************************************************* */ #include #include #include #include #include #include #include #include "wiringPi.h" #include "wiringPiI2C.h" // I2C definitions #define I2C_SLAVE 0x0703 #define I2C_SMBUS 0x0720 /* SMBus-level access */ #define I2C_SMBUS_READ 1 #define I2C_SMBUS_WRITE 0 // SMBus transaction types #define I2C_SMBUS_QUICK 0 #define I2C_SMBUS_BYTE 1 #define I2C_SMBUS_BYTE_DATA 2 #define I2C_SMBUS_WORD_DATA 3 #define I2C_SMBUS_PROC_CALL 4 #define I2C_SMBUS_BLOCK_DATA 5 #define I2C_SMBUS_I2C_BLOCK_BROKEN 6 #define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ #define I2C_SMBUS_I2C_BLOCK_DATA 8 // SMBus messages #define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ #define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ // Structures used in the ioctl() calls union i2c_smbus_data { uint8_t byte ; uint16_t word ; uint8_t block [I2C_SMBUS_BLOCK_MAX + 2] ; // block [0] is used for length + one more for PEC } ; struct i2c_smbus_ioctl_data { char read_write ; uint8_t command ; int size ; union i2c_smbus_data *data ; } ; static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args ; args.read_write = rw ; args.command = command ; args.size = size ; args.data = data ; return ioctl (fd, I2C_SMBUS, &args) ; } /* * wiringPiI2CRead: * Simple device read ********************************************************************************* */ int wiringPiI2CRead (int fd) { union i2c_smbus_data data ; if (i2c_smbus_access (fd, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) return -1 ; else return data.byte & 0xFF ; } /* * wiringPiI2CReadReg8: wiringPiI2CReadReg16: * Read an 8 or 16-bit value from a regsiter on the device ********************************************************************************* */ int wiringPiI2CReadReg8 (int fd, int reg) { union i2c_smbus_data data; if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data)) return -1 ; else return data.byte & 0xFF ; } int wiringPiI2CReadReg16 (int fd, int reg) { union i2c_smbus_data data; if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, &data)) return -1 ; else return data.word & 0xFFFF ; } /* * wiringPiI2CWrite: * Simple device write ********************************************************************************* */ int wiringPiI2CWrite (int fd, int data) { return i2c_smbus_access (fd, I2C_SMBUS_WRITE, data, I2C_SMBUS_BYTE, NULL) ; } /* * wiringPiI2CWriteReg8: wiringPiI2CWriteReg16: * Write an 8 or 16-bit value to the given register ********************************************************************************* */ int wiringPiI2CWriteReg8 (int fd, int reg, int value) { union i2c_smbus_data data ; data.byte = value ; return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, &data) ; } int wiringPiI2CWriteReg16 (int fd, int reg, int value) { union i2c_smbus_data data ; data.word = value ; return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, &data) ; } /* * wiringPiI2CSetupInterface: * Undocumented access to set the interface explicitly - might be used * for the Pi's 2nd I2C interface... ********************************************************************************* */ int wiringPiI2CSetupInterface (const char *device, int devId) { int fd ; if ((fd = open (device, O_RDWR)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open I2C device: %s\n", strerror (errno)) ; if (ioctl (fd, I2C_SLAVE, devId) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to select I2C device: %s\n", strerror (errno)) ; return fd ; } /* * wiringPiI2CSetup: * Open the I2C device, and regsiter the target device ********************************************************************************* */ int wiringPiI2CSetup (const int devId) { int rev ; const char *device ; rev = piBoardRev () ; if (rev == 1) device = "/dev/i2c-0" ; else device = "/dev/i2c-1" ; return wiringPiI2CSetupInterface (device, devId) ; } wiringPi/wiringPi/mcp3002.c0000644000000000000000000000416112457032564014376 0ustar rootroot/* * mcp3002.c: * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "mcp3002.h" /* * myAnalogRead: * Return the analog value of the given pin ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { unsigned char spiData [2] ; unsigned char chanBits ; int chan = pin - node->pinBase ; if (chan == 0) chanBits = 0b11010000 ; else chanBits = 0b11110000 ; spiData [0] = chanBits ; spiData [1] = 0 ; wiringPiSPIDataRW (node->fd, spiData, 2) ; return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ; } /* * mcp3002Setup: * Create a new wiringPi device node for an mcp3002 on the Pi's * SPI interface. ********************************************************************************* */ int mcp3002Setup (const int pinBase, int spiChannel) { struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) return -1 ; node = wiringPiNewNode (pinBase, 2) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; return 0 ; } wiringPi/wiringPi/drcSerial.c0000644000000000000000000001233112457032564015220 0ustar rootroot/* * drcSerial.c: * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include "wiringPi.h" #include "wiringSerial.h" #include "drcSerial.h" #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif /* * myPinMode: * Change the pin mode on the remote DRC device ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { /**/ if (mode == OUTPUT) serialPutchar (node->fd, 'o') ; // Input else if (mode == PWM_OUTPUT) serialPutchar (node->fd, 'p') ; // PWM else serialPutchar (node->fd, 'i') ; // Default to input serialPutchar (node->fd, pin - node->pinBase) ; } /* * myPullUpDnControl: * ATmegas only have pull-up's on of off. No pull-downs. ********************************************************************************* */ static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) { // Force pin into input mode serialPutchar (node->fd, 'i' ) ; serialPutchar (node->fd, pin - node->pinBase) ; /**/ if (mode == PUD_UP) { serialPutchar (node->fd, '1') ; serialPutchar (node->fd, pin - node->pinBase) ; } else if (mode == PUD_OFF) { serialPutchar (node->fd, '0') ; serialPutchar (node->fd, pin - node->pinBase) ; } } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { serialPutchar (node->fd, value == 0 ? '0' : '1') ; serialPutchar (node->fd, pin - node->pinBase) ; } /* * myPwmWrite: ********************************************************************************* */ static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value) { serialPutchar (node->fd, 'v') ; serialPutchar (node->fd, pin - node->pinBase) ; serialPutchar (node->fd, value & 0xFF) ; } /* * myAnalogRead: ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { int vHi, vLo ; serialPutchar (node->fd, 'a') ; serialPutchar (node->fd, pin - node->pinBase) ; vHi = serialGetchar (node->fd) ; vLo = serialGetchar (node->fd) ; return (vHi << 8) | vLo ; } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { serialPutchar (node->fd, 'r') ; // Send read command serialPutchar (node->fd, pin - node->pinBase) ; return (serialGetchar (node->fd) == '0') ? 0 : 1 ; } /* * drcSetup: * Create a new instance of an DRC GPIO interface. * Could be a variable nunber of pins here - we might not know in advance * if it's an ATmega with 14 pins, or something with less or more! ********************************************************************************* */ int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) { int fd ; int ok, tries ; time_t then ; struct wiringPiNodeStruct *node ; if ((fd = serialOpen (device, baud)) < 0) return wiringPiFailure (WPI_ALMOST, "Unable to open DRC device (%s): %s", device, strerror (errno)) ; delay (10) ; // May need longer if it's an Uno that reboots on the open... // Flush any pending input while (serialDataAvail (fd)) (void)serialGetchar (fd) ; ok = FALSE ; for (tries = 1 ; (tries < 5) && (!ok) ; ++tries) { serialPutchar (fd, '@') ; // Ping then = time (NULL) + 2 ; while (time (NULL) < then) if (serialDataAvail (fd)) { if (serialGetchar (fd) == '@') { ok = TRUE ; break ; } } } if (!ok) { serialClose (fd) ; return wiringPiFailure (WPI_FATAL, "Unable to communicate with DRC serial device") ; } node = wiringPiNewNode (pinBase, numPins) ; node->fd = fd ; node->pinMode = myPinMode ; node->pullUpDnControl = myPullUpDnControl ; node->analogRead = myAnalogRead ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->pwmWrite = myPwmWrite ; return 0 ; } wiringPi/wiringPi/softServo.h0000644000000000000000000000240312457032564015306 0ustar rootroot/* * softServo.h: * Provide N channels of software driven PWM suitable for RC * servo motors. * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern void softServoWrite (int pin, int value) ; extern int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/mcp3422.c0000644000000000000000000000566612457032564014417 0ustar rootroot/* * mcp3422.c: * Extend wiringPi with the MCP3422 I2C ADC chip * Also works for the MCP3423 and MCP3224 (4 channel) chips * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include "mcp3422.h" /* * myAnalogRead: * Read a channel from the device ********************************************************************************* */ int myAnalogRead (struct wiringPiNodeStruct *node, int chan) { unsigned char config ; unsigned char buffer [4] ; int value = 0 ; // One-shot mode, trigger plus the other configs. config = 0x80 | ((chan - node->pinBase) << 5) | (node->data0 << 2) | (node->data1) ; wiringPiI2CWrite (node->fd, config) ; switch (node->data0) // Sample rate { case MCP3422_SR_3_75: // 18 bits delay (270) ; read (node->fd, buffer, 4) ; value = ((buffer [0] & 3) << 16) | (buffer [1] << 8) | buffer [0] ; break ; case MCP3422_SR_15: // 16 bits delay ( 70) ; read (node->fd, buffer, 3) ; value = (buffer [0] << 8) | buffer [1] ; break ; case MCP3422_SR_60: // 14 bits delay ( 17) ; read (node->fd, buffer, 3) ; value = ((buffer [0] & 0x3F) << 8) | buffer [1] ; break ; case MCP3422_SR_240: // 12 bits delay ( 5) ; read (node->fd, buffer, 3) ; value = ((buffer [0] & 0x0F) << 8) | buffer [0] ; break ; } return value ; } /* * mcp3422Setup: * Create a new wiringPi device node for the mcp3422 ********************************************************************************* */ int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; node = wiringPiNewNode (pinBase, 4) ; node->data0 = sampleRate ; node->data1 = gain ; node->analogRead = myAnalogRead ; return 0 ; } wiringPi/wiringPi/drcSerial.h0000644000000000000000000000231412457032564015225 0ustar rootroot/* * drcSerial.h: * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/pcf8574.c0000644000000000000000000000625612457032564014421 0ustar rootroot/* * pcf8574.c: * Extend wiringPi with the PCF8574 I2C GPIO expander chip * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "wiringPi.h" #include "wiringPiI2C.h" #include "pcf8574.h" /* * myPinMode: * The PCF8574 is an odd chip - the pins are effectively bi-directional, * however the pins should be drven high when used as an input pin... * So, we're effectively copying digitalWrite... ********************************************************************************* */ static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) { int bit, old ; bit = 1 << ((pin - node->pinBase) & 7) ; old = node->data2 ; if (mode == OUTPUT) old &= (~bit) ; // Write bit to 0 else old |= bit ; // Write bit to 1 wiringPiI2CWrite (node->fd, old) ; node->data2 = old ; } /* * myDigitalWrite: ********************************************************************************* */ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) { int bit, old ; bit = 1 << ((pin - node->pinBase) & 7) ; old = node->data2 ; if (value == LOW) old &= (~bit) ; else old |= bit ; wiringPiI2CWrite (node->fd, old) ; node->data2 = old ; } /* * myDigitalRead: ********************************************************************************* */ static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) { int mask, value ; mask = 1 << ((pin - node->pinBase) & 7) ; value = wiringPiI2CRead (node->fd) ; if ((value & mask) == 0) return LOW ; else return HIGH ; } /* * pcf8574Setup: * Create a new instance of a PCF8574 I2C GPIO interface. We know it * has 8 pins, so all we need to know here is the I2C address and the * user-defined pin base. ********************************************************************************* */ int pcf8574Setup (const int pinBase, const int i2cAddress) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) return fd ; node = wiringPiNewNode (pinBase, 8) ; node->fd = fd ; node->pinMode = myPinMode ; node->digitalRead = myDigitalRead ; node->digitalWrite = myDigitalWrite ; node->data2 = wiringPiI2CRead (fd) ; return 0 ; } wiringPi/wiringPi/sn3218.c0000644000000000000000000000451712457032564014255 0ustar rootroot/* * sn3218.c: * Extend wiringPi with the SN3218 I2C LEd Driver * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "sn3218.h" /* * myAnalogWrite: * Write analog value on the given pin ********************************************************************************* */ static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) { int fd = node->fd ; int chan = 0x01 + (pin - node->pinBase) ; wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ; // Value wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update } /* * sn3218Setup: * Create a new wiringPi device node for an sn3218 on the Pi's * SPI interface. ********************************************************************************* */ int sn3218Setup (const int pinBase) { int fd ; struct wiringPiNodeStruct *node ; if ((fd = wiringPiI2CSetup (0x54)) < 0) return fd ; // Setup the chip - initialise all 18 LEDs to off //wiringPiI2CWriteReg8 (fd, 0x17, 0) ; // Reset wiringPiI2CWriteReg8 (fd, 0x00, 1) ; // Not Shutdown wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ; // Enable LEDs 0- 5 wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ; // Enable LEDs 6-11 wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ; // Enable LEDs 12-17 wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update node = wiringPiNewNode (pinBase, 18) ; node->fd = fd ; node->analogWrite = myAnalogWrite ; return 0 ; } wiringPi/wiringPi/Makefile0000644000000000000000000001511612457032564014610 0ustar rootroot# ; # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # # Copyright (c) 2012 Gordon Henderson ################################################################################# # This file is part of wiringPi: # https://projects.drogon.net/raspberry-pi/wiringpi/ # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# DYN_VERS_MAJ=2 DYN_VERS_MIN=0 VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN) DESTDIR=/usr PREFIX=/local STATIC=libwiringPi.a DYNAMIC=libwiringPi.so.$(VERSION) #DEBUG = -g -O0 DEBUG = -O2 CC = gcc INCLUDE = -I. DEFS = -D_GNU_SOURCE CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC LIBS = # Should not alter anything below this line ############################################################################### SRC = wiringPi.c \ wiringSerial.c wiringShift.c \ piHiPri.c piThread.c \ wiringPiSPI.c wiringPiI2C.c \ softPwm.c softTone.c \ mcp23008.c mcp23016.c mcp23017.c \ mcp23s08.c mcp23s17.c \ sr595.c \ pcf8574.c pcf8591.c \ mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ max31855.c max5322.c \ sn3218.c \ drcSerial.c OBJ = $(SRC:.c=.o) all: $(DYNAMIC) static: $(STATIC) $(STATIC): $(OBJ) @echo "[Link (Static)]" @ar rcs $(STATIC) $(OBJ) @ranlib $(STATIC) # @size $(STATIC) $(DYNAMIC): $(OBJ) @echo "[Link (Dynamic)]" @$(CC) -shared -Wl,-soname,libwiringPi.so -o libwiringPi.so.$(VERSION) -lpthread $(OBJ) .c.o: @echo [Compile] $< @$(CC) -c $(CFLAGS) $< -o $@ .PHONY: clean clean: @echo "[Clean]" @rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* .PHONY: tags tags: $(SRC) @echo [ctags] @ctags $(SRC) .PHONY: install-headers install-headers: @echo "[Install Headers]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringPi.h $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringSerial.h $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringShift.h $(DESTDIR)$(PREFIX)/include @install -m 0644 softPwm.h $(DESTDIR)$(PREFIX)/include @install -m 0644 softTone.h $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringPiSPI.h $(DESTDIR)$(PREFIX)/include @install -m 0644 wiringPiI2C.h $(DESTDIR)$(PREFIX)/include @install -m 0644 drcSerial.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp23008.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp23016.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp23017.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp23s08.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp23s17.h $(DESTDIR)$(PREFIX)/include @install -m 0644 max31855.h $(DESTDIR)$(PREFIX)/include @install -m 0644 max5322.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp3002.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp3004.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp4802.h $(DESTDIR)$(PREFIX)/include @install -m 0644 mcp3422.h $(DESTDIR)$(PREFIX)/include @install -m 0644 sr595.h $(DESTDIR)$(PREFIX)/include @install -m 0644 pcf8574.h $(DESTDIR)$(PREFIX)/include @install -m 0644 pcf8591.h $(DESTDIR)$(PREFIX)/include @install -m 0644 sn3218.h $(DESTDIR)$(PREFIX)/include .PHONY: install install: $(DYNAMIC) install-headers @echo "[Install Dynamic Lib]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib @install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so @ldconfig .PHONY: install-static install-static: $(STATIC) install-headers @echo "[Install Static Lib]" @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib @install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib .PHONY: uninstall uninstall: @echo "[UnInstall]" @rm -f $(DESTDIR)$(PREFIX)/include/wiringPi.h @rm -f $(DESTDIR)$(PREFIX)/include/wiringSerial.h @rm -f $(DESTDIR)$(PREFIX)/include/wiringShift.h @rm -f $(DESTDIR)$(PREFIX)/include/softPwm.h @rm -f $(DESTDIR)$(PREFIX)/include/softTone.h @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiI2C.h @rm -f $(DESTDIR)$(PREFIX)/include/drcSerial.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp23008.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp23016.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp23017.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp23s08.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp23s17.h @rm -f $(DESTDIR)$(PREFIX)/include/max31855.h @rm -f $(DESTDIR)$(PREFIX)/include/max5322.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp3002.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp3004.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp4802.h @rm -f $(DESTDIR)$(PREFIX)/include/mcp3422.h @rm -f $(DESTDIR)$(PREFIX)/include/sr595.h @rm -f $(DESTDIR)$(PREFIX)/include/pcf8574.h @rm -f $(DESTDIR)$(PREFIX)/include/pcf8591.h @rm -f $(DESTDIR)$(PREFIX)/include/sn3218.h @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPi.* @ldconfig .PHONY: depend depend: makedepend -Y $(SRC) $(SRC_I2C) # DO NOT DELETE wiringPi.o: softPwm.h softTone.h wiringPi.h wiringSerial.o: wiringSerial.h wiringShift.o: wiringPi.h wiringShift.h piHiPri.o: wiringPi.h piThread.o: wiringPi.h wiringPiSPI.o: wiringPi.h wiringPiSPI.h wiringPiI2C.o: wiringPi.h wiringPiI2C.h softPwm.o: wiringPi.h softPwm.h softTone.o: wiringPi.h softTone.h mcp23008.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23008.h mcp23016.o: wiringPi.h wiringPiI2C.h mcp23016.h mcp23016reg.h mcp23017.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23017.h mcp23s08.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s08.h mcp23s17.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s17.h sr595.o: wiringPi.h sr595.h pcf8574.o: wiringPi.h wiringPiI2C.h pcf8574.h pcf8591.o: wiringPi.h wiringPiI2C.h pcf8591.h mcp3002.o: wiringPi.h wiringPiSPI.h mcp3002.h mcp3004.o: wiringPi.h wiringPiSPI.h mcp3004.h mcp4802.o: wiringPi.h wiringPiSPI.h mcp4802.h mcp3422.o: wiringPi.h wiringPiI2C.h mcp3422.h max31855.o: wiringPi.h wiringPiSPI.h max31855.h max5322.o: wiringPi.h wiringPiSPI.h max5322.h sn3218.o: wiringPi.h wiringPiI2C.h sn3218.h drcSerial.o: wiringPi.h wiringSerial.h drcSerial.h wiringPi/wiringPi/mcp3004.c0000644000000000000000000000425212457032564014401 0ustar rootroot/* * mcp3004.c: * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor * Copyright (c) 2012-2013 Gordon Henderson * * Thanks also to "ShorTie" on IRC for some remote debugging help! *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include "mcp3004.h" /* * myAnalogRead: * Return the analog value of the given pin ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { unsigned char spiData [3] ; unsigned char chanBits ; int chan = pin - node->pinBase ; chanBits = 0b10000000 | (chan << 4) ; spiData [0] = 1 ; // Start bit spiData [1] = chanBits ; spiData [2] = 0 ; wiringPiSPIDataRW (node->fd, spiData, 3) ; return ((spiData [1] << 8) | spiData [2]) & 0x3FF ; } /* * mcp3004Setup: * Create a new wiringPi device node for an mcp3004 on the Pi's * SPI interface. ********************************************************************************* */ int mcp3004Setup (const int pinBase, int spiChannel) { struct wiringPiNodeStruct *node ; if (wiringPiSPISetup (spiChannel, 1000000) < 0) return -1 ; node = wiringPiNewNode (pinBase, 8) ; node->fd = spiChannel ; node->analogRead = myAnalogRead ; return 0 ; } wiringPi/wiringPi/piThread.c0000644000000000000000000000341612457032564015054 0ustar rootroot/* * piThread.c: * Provide a simplified interface to pthreads * * Copyright (c) 2012 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include "wiringPi.h" static pthread_mutex_t piMutexes [4] ; /* * piThreadCreate: * Create and start a thread ********************************************************************************* */ int piThreadCreate (void *(*fn)(void *)) { pthread_t myThread ; return pthread_create (&myThread, NULL, fn, NULL) ; } /* * piLock: piUnlock: * Activate/Deactivate a mutex. * We're keeping things simple here and only tracking 4 mutexes which * is more than enough for out entry-level pthread programming ********************************************************************************* */ void piLock (int key) { pthread_mutex_lock (&piMutexes [key]) ; } void piUnlock (int key) { pthread_mutex_unlock (&piMutexes [key]) ; } wiringPi/wiringPi/max5322.h0000644000000000000000000000224212457032564014416 0ustar rootroot/* * max5322.h: * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor * Copyright (c) 2012-2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int max5322Setup (int pinBase, int spiChannel) ; #ifdef __cplusplus } #endif wiringPi/wiringPi/sr595.h0000644000000000000000000000231612457032564014206 0ustar rootroot/* * sr595.h: * Extend wiringPi with the 74x595 shift registers. * Copyright (c) 2013 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #ifdef __cplusplus extern "C" { #endif extern int sr595Setup (const int pinBase, const int numPins, const int dataPin, const int clockPin, const int latchPin) ; #ifdef __cplusplus } #endif wiringPi/examples/0000755000000000000000000000000012457032564013172 5ustar rootrootwiringPi/examples/blink.sh0000644000000000000000000000233212457032564014625 0ustar rootroot#!/bin/sh # # blink.sh: # Standard "blink" program in wiringPi. Blinks an LED connected # to the first GPIO pin. # # Copyright (c) 2012-2013 Gordon Henderson. ####################################################################### # This file is part of wiringPi: # https://projects.drogon.net/raspberry-pi/wiringpi/ # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ####################################################################### # LED Pin - wiringPi pin 0 is BCM_GPIO 17. PIN=0 gpio mode $PIN out while true; do gpio write $PIN 1 sleep 0.5 gpio write $PIN 0 sleep 0.5 done wiringPi/examples/q2w/0000755000000000000000000000000012457032564013703 5ustar rootrootwiringPi/examples/q2w/blink.sh0000755000000000000000000000234612457032564015346 0ustar rootroot#!/bin/sh # # blink.sh: # Standard "blink" program in wiringPi. Blinks an LED connected # to the LED on the Quick2Wire board # # Copyright (c) 2012-2013 Gordon Henderson. ####################################################################### # This file is part of wiringPi: # https://projects.drogon.net/raspberry-pi/wiringpi/ # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ####################################################################### # LED Pin - wiringPi pin 1 is BCM_GPIO 18. LED=1 gpio mode $LED out while true; do gpio write $LED 1 sleep 0.5 gpio write $LED 0 sleep 0.5 done wiringPi/examples/q2w/volts.c0000644000000000000000000000331112457032564015214 0ustar rootroot/* * volts.c: * Read in all 4 analogs on the Q2W analog board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define LED 1 #define Q2W_ABASE 120 int main (void) { int value, pin ; // Enable the on-goard GPIO wiringPiSetup () ; pinMode (LED, OUTPUT) ; // On-board LED // Add in the pcf8591 on the q2w board pcf8591Setup (Q2W_ABASE, 0x48) ; printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ; for (;;) { for (pin = 0 ; pin < 4 ; ++pin) { value = analogRead (Q2W_ABASE + pin) ; printf (" %5.2f", (double)value * 3.3 / 255.0) ; } printf ("\r") ; fflush (stdout) ; delay (100) ; digitalWrite (LED, !digitalRead (LED)) ; // Flicker the LED } return 0 ; } wiringPi/examples/q2w/button.c0000644000000000000000000000340012457032564015357 0ustar rootroot/* * button.c: * Simple button test for the Quick2Wire interface board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #define BUTTON 0 #define LED1 1 #define LED2 7 int main (void) { // Enable the on-goard GPIO wiringPiSetup () ; printf ("Raspberry Pi - Quick2Wire Mainboard Button & LED Test\n") ; pinMode (BUTTON, INPUT) ; pinMode (LED1, OUTPUT) ; pinMode (LED2, OUTPUT) ; digitalWrite (LED1, HIGH) ; // On-board LED on digitalWrite (LED2, LOW) ; // 2nd LED off for (;;) { if (digitalRead (BUTTON) == HIGH) // Swap LED states { digitalWrite (LED1, LOW) ; digitalWrite (LED2, HIGH) ; while (digitalRead (BUTTON) == HIGH) delay (1) ; digitalWrite (LED1, HIGH) ; digitalWrite (LED2, LOW) ; } delay (1) ; } return 0 ; } wiringPi/examples/q2w/bright.c0000644000000000000000000000306412457032564015331 0ustar rootroot/* * bright.c: * Vary the Q2W LED brightness with the analog card * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define LED 1 #define Q2W_ABASE 120 int main (void) { int value ; // Enable the on-goard GPIO wiringPiSetup () ; // Add in the pcf8591 on the q2w board pcf8591Setup (Q2W_ABASE, 0x48) ; printf ("Raspberry Pi - Quick2Wire Analog Test\n") ; // Setup the LED pinMode (LED, PWM_OUTPUT) ; pwmWrite (LED, 0) ; for (;;) { value = analogRead (Q2W_ABASE + 0) ; pwmWrite (LED, value * 4) ; delay (10) ; } return 0 ; } wiringPi/examples/q2w/binary.c0000644000000000000000000000414512457032564015337 0ustar rootroot/* * binary.c: * Using the Quick 2 wire 16-bit GPIO expansion board to output * a binary counter. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define Q2W_BASE 100 int main (void) { int i, bit ; // Enable the on-goard GPIO wiringPiSetup () ; // Add in the mcp23017 on the q2w board mcp23017Setup (Q2W_BASE, 0x20) ; printf ("Raspberry Pi - quite2Wire MCP23017 Test\n") ; // On-board button Input: pinMode (0, INPUT) ; // First 10 pins on q2w board as outputs: for (i = 0 ; i < 10 ; ++i) pinMode (Q2W_BASE + i, OUTPUT) ; // Last pin as an input with the internal pull-up enabled pinMode (Q2W_BASE + 15, INPUT) ; pullUpDnControl (Q2W_BASE + 15, PUD_UP) ; // Loop, outputting a binary number, // Go faster with the button, or stop if the // on-board button is pushed for (;;) { for (i = 0 ; i < 1024 ; ++i) { for (bit = 0 ; bit < 10 ; ++bit) digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ; while (digitalRead (0) == HIGH) // While pushed delay (1) ; if (digitalRead (Q2W_BASE + 15) == HIGH) // Not Pushed delay (100) ; } } return 0 ; } wiringPi/examples/q2w/blink.c0000644000000000000000000000262212457032564015150 0ustar rootroot/* * blink.c: * Simple "blink" test for the Quick2Wire interface board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #define LED 1 int main (void) { // Enable the on-goard GPIO wiringPiSetup () ; printf ("Raspberry Pi - Quick2Wire Mainboard LED Blink Test\n") ; pinMode (LED, OUTPUT) ; for (;;) { digitalWrite (LED, HIGH) ; delay (500) ; digitalWrite (LED, LOW) ; delay (500) ; } return 0 ; } wiringPi/examples/q2w/blink-io.c0000644000000000000000000000330712457032564015556 0ustar rootroot/* * blink-io.c: * Simple "blink" test for the Quick2Wire 16-pin IO board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define LED 1 #define Q2W_BASE 100 int main (void) { // Enable the on-goard GPIO wiringPiSetup () ; // Add in the mcp23017 on the q2w board mcp23017Setup (Q2W_BASE, 0x20) ; printf ("Raspberry Pi - Quick2Wire MCP23017 Blink Test\n") ; // Blink the on-board LED as well as one on the mcp23017 pinMode (LED, OUTPUT) ; pinMode (Q2W_BASE + 0, OUTPUT) ; for (;;) { digitalWrite (LED, HIGH) ; digitalWrite (Q2W_BASE + 0, HIGH) ; delay (500) ; digitalWrite (LED, LOW) ; digitalWrite (Q2W_BASE + 0, LOW) ; delay (500) ; } return 0 ; } wiringPi/examples/q2w/Makefile0000644000000000000000000000400312457032564015340 0ustar rootroot# # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # https://projects.drogon.net/wiring-pi # # Copyright (c) 2012-2013 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# #DEBUG = -g -O0 DEBUG = -O3 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm ############################################################################### SRC = blink.c button.c blink-io.c volts.c bright.c OBJ = $(SRC:.c=.o) BINS = $(SRC:.c=) all: $(BINS) blink: blink.o @echo [link] @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) blink-io: blink-io.o @echo [link] @$(CC) -o $@ blink-io.o $(LDFLAGS) $(LDLIBS) button: button.o @echo [link] @$(CC) -o $@ button.o $(LDFLAGS) $(LDLIBS) volts: volts.o @echo [link] @$(CC) -o $@ volts.o $(LDFLAGS) $(LDLIBS) bright: bright.o @echo [link] @$(CC) -o $@ bright.o $(LDFLAGS) $(LDLIBS) .c.o: @echo [CC] $< @$(CC) -c $(CFLAGS) $< -o $@ clean: @echo "[Clean]" @rm -f $(OBJ) *~ core tags $(BINS) tags: $(SRC) @echo [ctags] @ctags $(SRC) depend: makedepend -Y $(SRC) # DO NOT DELETE wiringPi/examples/serialRead.c0000644000000000000000000000266012457032564015415 0ustar rootroot/* * serial.c: * Example program to read bytes from the Serial line * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include int main () { int fd ; if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) { fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; return 1 ; } // Loop, getting and printing characters for (;;) { putchar (serialGetchar (fd)) ; fflush (stdout) ; } } wiringPi/examples/nes.c0000644000000000000000000000430312457032564014123 0ustar rootroot/* * nes.c: * Test program for an old NES controller connected to the Pi. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #define BLANK "| " int main () { int joystick ; unsigned int buttons ; if (wiringPiSetup () == -1) { fprintf (stdout, "oops: %s\n", strerror (errno)) ; return 1 ; } if ((joystick = setupNesJoystick (2, 1, 0)) == -1) { fprintf (stdout, "Unable to setup joystick\n") ; return 1 ; } for (;;) { buttons = readNesJoystick (joystick) ; if ((buttons & NES_UP) != 0) printf ("| UP " ) ; else printf (BLANK) ; if ((buttons & NES_DOWN) != 0) printf ("| DOWN " ) ; else printf (BLANK) ; if ((buttons & NES_LEFT) != 0) printf ("| LEFT " ) ; else printf (BLANK) ; if ((buttons & NES_RIGHT) != 0) printf ("|RIGHT " ) ; else printf (BLANK) ; if ((buttons & NES_SELECT) != 0) printf ("|SELECT" ) ; else printf (BLANK) ; if ((buttons & NES_START) != 0) printf ("|START " ) ; else printf (BLANK) ; if ((buttons & NES_A) != 0) printf ("| A " ) ; else printf (BLANK) ; if ((buttons & NES_B) != 0) printf ("| B " ) ; else printf (BLANK) ; printf ("|\n") ; } return 0 ; } wiringPi/examples/ds1302.c0000644000000000000000000001302112457032564014247 0ustar rootroot/* * ds1302.c: * Real Time clock * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include // Register defines #define RTC_SECS 0 #define RTC_MINS 1 #define RTC_HOURS 2 #define RTC_DATE 3 #define RTC_MONTH 4 #define RTC_DAY 5 #define RTC_YEAR 6 #define RTC_WP 7 #define RTC_TC 8 #define RTC_BM 31 static unsigned int masks [] = { 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x07, 0xFF } ; /* * bcdToD: dToBCD: * BCD decode/encode ********************************************************************************* */ static int bcdToD (unsigned int byte, unsigned int mask) { unsigned int b1, b2 ; byte &= mask ; b1 = byte & 0x0F ; b2 = ((byte >> 4) & 0x0F) * 10 ; return b1 + b2 ; } static unsigned int dToBcd (unsigned int byte) { return ((byte / 10) << 4) + (byte % 10) ; } /* * ramTest: * Simple test of the 31 bytes of RAM inside the DS1302 chip ********************************************************************************* */ static int ramTestValues [] = { 0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xF0, 0x0F, -1 } ; static int ramTest (void) { int addr ; int got ; int i = 0 ; int errors = 0 ; int testVal ; printf ("DS1302 RAM TEST\n") ; testVal = ramTestValues [i] ; while (testVal != -1) { for (addr = 0 ; addr < 31 ; ++addr) ds1302ramWrite (addr, testVal) ; for (addr = 0 ; addr < 31 ; ++addr) if ((got = ds1302ramRead (addr)) != testVal) { printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", addr, testVal, got) ; ++errors ; } testVal = ramTestValues [++i] ; } for (addr = 0 ; addr < 31 ; ++addr) ds1302ramWrite (addr, addr) ; for (addr = 0 ; addr < 31 ; ++addr) if ((got = ds1302ramRead (addr)) != addr) { printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", addr, addr, got) ; ++errors ; } if (errors == 0) printf ("-- DS1302 RAM TEST: OK\n") ; else printf ("-- DS1302 RAM TEST FAILURE. %d errors.\n", errors) ; return 0 ; } /* * setLinuxClock: * Set the Linux clock from the hardware ********************************************************************************* */ static int setLinuxClock (void) { char dateTime [20] ; char command [64] ; int clock [8] ; printf ("Setting the Linux Clock from the DS1302... ") ; fflush (stdout) ; ds1302clockRead (clock) ; // [MMDDhhmm[[CC]YY][.ss]] sprintf (dateTime, "%02d%02d%02d%02d%02d%02d.%02d", bcdToD (clock [RTC_MONTH], masks [RTC_MONTH]), bcdToD (clock [RTC_DATE], masks [RTC_DATE]), bcdToD (clock [RTC_HOURS], masks [RTC_HOURS]), bcdToD (clock [RTC_MINS], masks [RTC_MINS]), 20, bcdToD (clock [RTC_YEAR], masks [RTC_YEAR]), bcdToD (clock [RTC_SECS], masks [RTC_SECS])) ; sprintf (command, "/bin/date %s", dateTime) ; system (command) ; return 0 ; } /* * setDSclock: * Set the DS1302 block from Linux time ********************************************************************************* */ static int setDSclock (void) { struct tm t ; time_t now ; int clock [8] ; printf ("Setting the clock in the DS1302 from Linux time... ") ; now = time (NULL) ; gmtime_r (&now, &t) ; clock [ 0] = dToBcd (t.tm_sec) ; // seconds clock [ 1] = dToBcd (t.tm_min) ; // mins clock [ 2] = dToBcd (t.tm_hour) ; // hours clock [ 3] = dToBcd (t.tm_mday) ; // date clock [ 4] = dToBcd (t.tm_mon + 1) ; // months 0-11 --> 1-12 clock [ 5] = dToBcd (t.tm_wday + 1) ; // weekdays (sun 0) clock [ 6] = dToBcd (t.tm_year - 100) ; // years clock [ 7] = 0 ; // W-Protect off ds1302clockWrite (clock) ; printf ("OK\n") ; return 0 ; } int main (int argc, char *argv []) { int i ; int clock [8] ; wiringPiSetup () ; ds1302setup (0, 1, 2) ; if (argc == 2) { /**/ if (strcmp (argv [1], "-slc") == 0) return setLinuxClock () ; else if (strcmp (argv [1], "-sdsc") == 0) return setDSclock () ; else if (strcmp (argv [1], "-rtest") == 0) return ramTest () ; else { printf ("Usage: ds1302 [-slc | -sdsc | -rtest]\n") ; return EXIT_FAILURE ; } } for (i = 0 ;; ++i) { printf ("%5d: ", i) ; ds1302clockRead (clock) ; printf (" %2d:%02d:%02d", bcdToD (clock [2], masks [2]), bcdToD (clock [1], masks [1]), bcdToD (clock [0], masks [0])) ; printf (" %2d/%02d/%04d", bcdToD (clock [3], masks [3]), bcdToD (clock [4], masks [4]), bcdToD (clock [6], masks [6]) + 2000) ; printf ("\n") ; delay (200) ; } return 0 ; } wiringPi/examples/header.h0000644000000000000000000000176312457032564014602 0ustar rootroot/* * file.c: * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ wiringPi/examples/wfi.c0000644000000000000000000000726212457032564014132 0ustar rootroot/* * wfi.c: * Wait for Interrupt test program * * This program demonstrates the use of the waitForInterrupt() * function in wiringPi. It listens to a button input on * BCM_GPIO pin 17 (wiringPi pin 0) * * The biggest issue with this method is that it really only works * well in Sys mode. * * Jan 2013: This way of doing things is sort of deprecated now, see * the wiringPiISR() function instead and the isr.c test program here. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include // A 'key' which we can lock and unlock - values are 0 through 3 // This is interpreted internally as a pthread_mutex by wiringPi // which is hiding some of that to make life simple. #define COUNT_KEY 0 // What BCM_GPIO input are we using? #define BUTTON_PIN 17 // Debounce time in mS #define DEBOUNCE_TIME 100 // globalCounter: // Global variable to count interrupts // Should be declared volatile to make sure the compiler doesn't cache it. static volatile int globalCounter = 0 ; /* * waitForIt: * This is a thread created using the wiringPi simplified threading * mechanism. It will wait on an interrupt on the button and increment * a counter. ********************************************************************************* */ PI_THREAD (waitForIt) { int state = 0 ; int debounceTime = 0 ; (void)piHiPri (10) ; // Set this thread to be high priority for (;;) { if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it { // Bouncing? if (millis () < debounceTime) { debounceTime = millis () + DEBOUNCE_TIME ; continue ; } // We have a valid one state ^= 1 ; piLock (COUNT_KEY) ; ++globalCounter ; piUnlock (COUNT_KEY) ; // Wait for key to be released while (digitalRead (BUTTON_PIN) == LOW) delay (1) ; debounceTime = millis () + DEBOUNCE_TIME ; } } } /* * setup: * Demo a crude but effective way to initialise the hardware ********************************************************************************* */ void setup (void) { // Use the gpio program to initialise the hardware // (This is the crude, but effective) system ("gpio edge 17 falling") ; // Setup wiringPi wiringPiSetupSys () ; // Fire off our interrupt handler piThreadCreate (waitForIt) ; } /* * main ********************************************************************************* */ int main (void) { int lastCounter = 0 ; int myCounter = 0 ; setup () ; for (;;) { printf ("Waiting ... ") ; fflush (stdout) ; while (myCounter == lastCounter) { piLock (COUNT_KEY) ; myCounter = globalCounter ; piUnlock (COUNT_KEY) ; delay (500) ; } printf (" Done. myCounter: %5d\n", myCounter) ; lastCounter = myCounter ; } return 0 ; } wiringPi/examples/PiFace/0000755000000000000000000000000012457032564014321 5ustar rootrootwiringPi/examples/PiFace/motor.c0000644000000000000000000000616612457032564015636 0ustar rootroot/* * motor.c: * Use the PiFace board to demonstrate an H bridge * circuit via the 2 relays. * Then add on an external transsitor to help with PWM. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include int outputs [2] = { 0,0 } ; #define PIFACE_BASE 200 #define PWM_OUT_PIN 204 #define PWM_UP 202 #define PWM_DOWN 203 void scanButton (int button) { if (digitalRead (PIFACE_BASE + button) == LOW) { outputs [button] ^= 1 ; digitalWrite (PIFACE_BASE + button, outputs [button]) ; printf ("Button %d pushed - output now: %s\n", button, (outputs [button] == 0) ? "Off" : "On") ; } while (digitalRead (PIFACE_BASE + button) == LOW) delay (1) ; } int main (void) { int pin, button ; int pwmValue = 0 ; printf ("Raspberry Pi PiFace - Motor control\n") ; printf ("==================================\n") ; printf ("\n") ; printf ( "This program is designed to be used with a motor connected to the relays\n" "in an H-Bridge type configuration with optional speeed control via PWM.\n" "\n" "Use the leftmost buttons to turn each relay on and off, and the rigthmost\n" "buttons to increase ot decrease the PWM output on the control pin (pin\n" "4)\n\n") ; wiringPiSetup () ; piFaceSetup (PIFACE_BASE) ; softPwmCreate (PWM_OUT_PIN, 100, 100) ; // Enable internal pull-ups & start with all off for (pin = 0 ; pin < 8 ; ++pin) { pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; digitalWrite (PIFACE_BASE + pin, 0) ; } for (;;) { for (button = 0 ; button < 2 ; ++button) scanButton (button) ; if (digitalRead (PWM_UP) == LOW) { pwmValue += 10 ; if (pwmValue > 100) pwmValue = 100 ; softPwmWrite (PWM_OUT_PIN, pwmValue) ; printf ("PWM -> %3d\n", pwmValue) ; while (digitalRead (PWM_UP) == LOW) delay (5) ; } if (digitalRead (PWM_DOWN) == LOW) { pwmValue -= 10 ; if (pwmValue < 0) pwmValue = 0 ; softPwmWrite (PWM_OUT_PIN, pwmValue) ; printf ("PWM -> %3d\n", pwmValue) ; while (digitalRead (PWM_DOWN) == LOW) delay (5) ; } delay (5) ; } return 0 ; } wiringPi/examples/PiFace/metro.c0000644000000000000000000000516712457032564015624 0ustar rootroot/* * metronome.c: * Simple test for the PiFace interface board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #define PIFACE 200 /* * middleA: * Play middle A (on the relays - yea!) ********************************************************************************* */ static void middleA (void) { unsigned int next ; for (;;) { next = micros () + 1136 ; digitalWrite (PIFACE + 0, 0) ; digitalWrite (PIFACE + 1, 0) ; while (micros () < next) delayMicroseconds (1) ; next = micros () + 1137 ; digitalWrite (PIFACE + 0, 1) ; digitalWrite (PIFACE + 1, 1) ; while (micros () < next) delayMicroseconds (1) ; } } int main (int argc, char *argv []) { int bpm, msPerBeat, state = 0 ; unsigned int end ; printf ("Raspberry Pi PiFace Metronome\n") ; printf ("=============================\n") ; piHiPri (50) ; wiringPiSetupSys () ; // Needed for timing functions piFaceSetup (PIFACE) ; if (argc != 2) { printf ("Usage: %s \n", argv [0]) ; exit (1) ; } if (strcmp (argv [1], "a") == 0) middleA () ; bpm = atoi (argv [1]) ; if ((bpm < 40) || (bpm > 208)) { printf ("%s range is 40 through 208 beats per minute\n", argv [0]) ; exit (1) ; } msPerBeat = 60000 / bpm ; // Main loop: // Put some random LED pairs up for a few seconds, then blank ... for (;;) { end = millis () + msPerBeat ; digitalWrite (PIFACE + 0, state) ; digitalWrite (PIFACE + 1, state) ; while (millis () < end) delayMicroseconds (500) ; state ^= 1 ; } return 0 ; } wiringPi/examples/PiFace/blink.c0000644000000000000000000000330712457032564015567 0ustar rootroot/* * blink.c: * Simple "blink" test for the PiFace interface board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include // Use 200 as the pin-base for the PiFace board, and pick a pin // for the LED that's not connected to a relay #define PIFACE 200 #define LED (PIFACE+2) int main (int argc, char *argv []) { printf ("Raspberry Pi PiFace Blink\n") ; printf ("=========================\n") ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; // Setup the PiFace board piFaceSetup (PIFACE) ; for (;;) { digitalWrite (LED, HIGH) ; // On delay (500) ; // mS digitalWrite (LED, LOW) ; // Off delay (500) ; } return 0 ; } wiringPi/examples/PiFace/reaction.c0000644000000000000000000000773112457032564016301 0ustar rootroot/* * reaction.c: * Simple test for the PiFace interface board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include int outputs [4] = { 0,0,0,0 } ; #define PIFACE 200 /* * light: * Light up the given LED - actually lights up a pair ********************************************************************************* */ void light (int led, int value) { led *= 2 ; digitalWrite (PIFACE + led + 0, value) ; digitalWrite (PIFACE + led + 1, value) ; } /* * lightAll: * All On or Off ********************************************************************************* */ void lightAll (int onoff) { light (0, onoff) ; light (1, onoff) ; light (2, onoff) ; light (3, onoff) ; } /* * waitForNoButtons: * Wait for all buttons to be released ********************************************************************************* */ void waitForNoButtons (void) { int i, button ; for (;;) { button = 0 ; for (i = 0 ; i < 4 ; ++i) button += digitalRead (PIFACE + i) ; if (button == 4) break ; } } void scanButton (int button) { if (digitalRead (PIFACE + button) == LOW) { outputs [button] ^= 1 ; digitalWrite (PIFACE + button, outputs [button]) ; } while (digitalRead (PIFACE + button) == LOW) delay (1) ; } int main (void) { int i, j ; int led, button ; unsigned int start, stop ; printf ("Raspberry Pi PiFace Reaction Timer\n") ; printf ("==================================\n") ; if (piFaceSetup (PIFACE) == -1) exit (1) ; // Enable internal pull-ups for (i = 0 ; i < 8 ; ++i) pullUpDnControl (PIFACE + i, PUD_UP) ; // Main game loop: // Put some random LED pairs up for a few seconds, then blank ... for (;;) { printf ("Press any button to start ... \n") ; fflush (stdout) ; for (;;) { led = rand () % 4 ; light (led, 1) ; delay (10) ; light (led, 0) ; button = 0 ; for (j = 0 ; j < 4 ; ++j) button += digitalRead (PIFACE + j) ; if (button != 4) break ; } waitForNoButtons () ; printf ("Wait for it ... ") ; fflush (stdout) ; led = rand () % 4 ; delay (rand () % 500 + 1000) ; light (led, 1) ; start = millis () ; for (button = -1 ; button == -1 ; ) { for (j = 0 ; j < 4 ; ++j) if (digitalRead (PIFACE + j) == 0) // Pushed { button = j ; break ; } } stop = millis () ; button = 3 - button ; // Correct for the buttons/LEDs reversed light (led, 0) ; waitForNoButtons () ; light (led, 1) ; if (button == led) { printf ("You got it in %3d mS\n", stop - start) ; } else { printf ("Missed: You pushed %d - LED was %d\n", button, led) ; for (;;) { light (button, 1) ; delay (100) ; light (button, 0) ; delay (100) ; i = 0 ; for (j = 0 ; j < 4 ; ++j) i += digitalRead (PIFACE + j) ; if (i != 4) break ; } waitForNoButtons () ; } light (led, 0) ; delay (4000) ; } return 0 ; } wiringPi/examples/PiFace/ladder.c0000755000000000000000000001431612457032564015730 0ustar rootroot/* * ladder.c: * * Gordon Henderson, June 2012 *********************************************************************** */ #include #include #include #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif #undef DEBUG #define NUM_LEDS 8 // Map the LEDs to the hardware pins // using PiFace pin numbers here #define PIFACE 200 const int ledMap [NUM_LEDS] = { // 0, 1, 2, 3, 4, 5, 6, 7, 8 200, 201, 202, 203, 204, 205, 206, 207 } ; // Some constants for our circuit simulation const double vBatt = 9.0 ; // Volts (ie. a PP3) const double capacitor = 0.001 ; // 1000uF const double rCharge = 2200.0 ; // ohms const double rDischarge = 68000.0 ; // ohms const double timeInc = 0.01 ; // Seconds double vCharge, vCap, vCapLast ; /* * setup: * Program the GPIO correctly and initialise the lamps *********************************************************************** */ void setup (void) { int i ; wiringPiSetupSys () ; if (piFaceSetup (200) == -1) exit (1) ; // Enable internal pull-ups for (i = 0 ; i < 8 ; ++i) pullUpDnControl (PIFACE + i, PUD_UP) ; // Calculate the actual charging voltage - standard calculation of // vCharge = r2 / (r1 + r2) * vBatt // // // -----+--- vBatt // | // R1 // | // +---+---- vCharge // | | // R2 C // | | // -----+---+----- vCharge = rDischarge / (rCharge + rDischarge) * vBatt ; // Start with no charge vCap = vCapLast = 0.0 ; } /* * introLeds * Put a little pattern on the LEDs to start with ********************************************************************************* */ void introLeds (void) { int i, j ; printf ("Pi Ladder\n") ; printf ("=========\n\n") ; printf (" vBatt: %6.2f volts\n", vBatt) ; printf (" rCharge: %6.0f ohms\n", rCharge) ; printf (" rDischarge: %6.0f ohms\n", rDischarge) ; printf (" vCharge: %6.2f volts\n", vCharge) ; printf (" capacitor: %6.0f uF\n", capacitor * 1000.0) ; // Flash 3 times: for (j = 0 ; j < 3 ; ++j) { for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 1) ; delay (500) ; for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 0) ; delay (100) ; } // All On for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 1) ; delay (500) ; // Countdown... for (i = NUM_LEDS - 1 ; i >= 0 ; --i) { digitalWrite (ledMap [i], 0) ; delay (100) ; } delay (500) ; } /* * winningLeds * Put a little pattern on the LEDs to start with ********************************************************************************* */ void winningLeds (void) { int i, j ; // Flash 3 times: for (j = 0 ; j < 3 ; ++j) { for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 1) ; delay (500) ; for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 0) ; delay (100) ; } // All On for (i = 0 ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 1) ; delay (500) ; // Countup... for (i = 0 ; i < NUM_LEDS ; ++i) { digitalWrite (ledMap [i], 0) ; delay (100) ; } delay (500) ; } /* * chargeCapacitor: dischargeCapacitor: * Add or remove charge to the capacitor. * Standard capacitor formulae. ********************************************************************************* */ void chargeCapacitor (void) { vCap = (vCapLast - vCharge) * exp (- timeInc / (rCharge * capacitor)) + vCharge ; #ifdef DEBUG printf ("+vCap: %7.4f\n", vCap) ; #endif vCapLast = vCap ; } void dischargeCapacitor (void) { vCap = vCapLast * exp (- timeInc / (rDischarge * capacitor)) ; #ifdef DEBUG printf ("-vCap: %7.4f\n", vCap) ; #endif vCapLast = vCap ; } /* * ledBargraph: * Output the supplied number as a bargraph on the LEDs ********************************************************************************* */ void ledBargraph (double value, int topLedOn) { int topLed = (int)floor (value / vCharge * (double)NUM_LEDS) + 1 ; int i ; if (topLed > NUM_LEDS) topLed = NUM_LEDS ; if (!topLedOn) --topLed ; for (i = 0 ; i < topLed ; ++i) digitalWrite (ledMap [i], 1) ; for (i = topLed ; i < NUM_LEDS ; ++i) digitalWrite (ledMap [i], 0) ; } /* * ledOnAction: * Make sure the leading LED is on and check the button ********************************************************************************* */ void ledOnAction (void) { if (digitalRead (PIFACE) == LOW) { chargeCapacitor () ; ledBargraph (vCap, TRUE) ; } } /* * ledOffAction: * Make sure the leading LED is off and check the button ********************************************************************************* */ void ledOffAction (void) { dischargeCapacitor () ; // Are we still pushing the button? if (digitalRead (PIFACE) == LOW) { vCap = vCapLast = 0.0 ; ledBargraph (vCap, FALSE) ; // Wait until we release the button while (digitalRead (PIFACE) == LOW) delay (10) ; } } /* *********************************************************************** * The main program *********************************************************************** */ int main (void) { unsigned int then, ledOnTime, ledOffTime ; unsigned int ourDelay = (int)(1000.0 * timeInc) ; setup () ; introLeds () ; // Setup the LED times - TODO reduce the ON time as the game progresses ledOnTime = 1000 ; ledOffTime = 1000 ; // This is our Gate/Squarewave loop for (;;) { // LED ON: (void)ledBargraph (vCap, TRUE) ; then = millis () + ledOnTime ; while (millis () < then) { ledOnAction () ; delay (ourDelay) ; } // Have we won yet? // We need vCap to be in the top NUM_LEDS of the vCharge if (vCap > ((double)(NUM_LEDS - 1) / (double)NUM_LEDS * vCharge)) // Woo hoo! { winningLeds () ; while (digitalRead (PIFACE) == HIGH) delay (10) ; while (digitalRead (PIFACE) == LOW) delay (10) ; vCap = vCapLast = 0.0 ; } // LED OFF: (void)ledBargraph (vCap, FALSE) ; then = millis () + ledOffTime ; while (millis () < then) { ledOffAction () ; delay (ourDelay) ; } } return 0 ; } wiringPi/examples/PiFace/buttons.c0000644000000000000000000000537312457032564016173 0ustar rootroot/* * buttons.c: * Simple test for the PiFace interface board. * * Read the buttons and output the same to the LEDs * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include int outputs [4] = { 0,0,0,0 } ; // Use 200 as the pin-base for the PiFace board #define PIFACE_BASE 200 /* * scanButton: * Read the guiven button - if it's pressed, then flip the state * of the correspoinding output pin ********************************************************************************* */ void scanButton (int button) { if (digitalRead (PIFACE_BASE + button) == LOW) { outputs [button] ^= 1 ; digitalWrite (PIFACE_BASE + button, outputs [button]) ; printf ("Button %d pushed - output now: %s\n", button, (outputs [button] == 0) ? "Off" : "On") ; } while (digitalRead (PIFACE_BASE + button) == LOW) delay (1) ; } /* * start here ********************************************************************************* */ int main (void) { int pin, button ; printf ("Raspberry Pi wiringPi + PiFace test program\n") ; printf ("===========================================\n") ; printf ("\n") ; printf ( "This program reads the buttons and uses them to toggle the first 4\n" "outputs. Push a button once to turn an output on, and push it again to\n" "turn it off again.\n\n") ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; piFaceSetup (PIFACE_BASE) ; // Enable internal pull-ups & start with all off for (pin = 0 ; pin < 8 ; ++pin) { pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; digitalWrite (PIFACE_BASE + pin, 0) ; } // Loop, scanning the buttons for (;;) { for (button = 0 ; button < 4 ; ++button) scanButton (button) ; delay (5) ; } return 0 ; } wiringPi/examples/PiFace/Makefile0000644000000000000000000000417612457032564015771 0ustar rootroot# # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # https://projects.drogon.net/wiring-pi # # Copyright (c) 2012 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# #DEBUG = -g -O0 DEBUG = -O3 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm # Should not alter anything below this line ############################################################################### SRC = blink.c buttons.c reaction.c ladder.c metro.c motor.c OBJ = $(SRC:.c=.o) BINS = $(SRC:.c=) all: $(BINS) blink: blink.o @echo [link] @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) buttons: buttons.o @echo [link] @$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) reaction: reaction.o @echo [link] @$(CC) -o $@ reaction.o $(LDFLAGS) $(LDLIBS) ladder: ladder.o @echo [link] @$(CC) -o $@ ladder.o $(LDFLAGS) $(LDLIBS) metro: metro.o @echo [link] @$(CC) -o $@ metro.o $(LDFLAGS) $(LDLIBS) motor: motor.o @echo [link] @$(CC) -o $@ motor.o $(LDFLAGS) $(LDLIBS) .c.o: @echo [CC] $< @$(CC) -c $(CFLAGS) $< -o $@ clean: @echo "[Clean]" @rm -f $(OBJ) *~ core tags $(BINS) tags: $(SRC) @echo [ctags] @ctags $(SRC) depend: makedepend -Y $(SRC) # DO NOT DELETE wiringPi/examples/README.TXT0000644000000000000000000000054112457032564014530 0ustar rootroot wiringPi Examples ================= There are now too many examples to compile them all in a sensible time, and you probably don't want to compile or run them all anyway, so they have been separated out. To compile an individual example, just type make exampleName To really compile everything: make really-all The individual tests are: wiringPi/examples/COPYING.LESSER0000644000000000000000000001674312457032564015234 0ustar rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. wiringPi/examples/isr.c0000644000000000000000000000637212457032564014143 0ustar rootroot/* * isr.c: * Wait for Interrupt test program - ISR method * * How to test: * Use the SoC's pull-up and pull down resistors that are avalable * on input pins. So compile & run this program (via sudo), then * in another terminal: * gpio mode 0 up * gpio mode 0 down * at which point it should trigger an interrupt. Toggle the pin * up/down to generate more interrupts to test. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include // globalCounter: // Global variable to count interrupts // Should be declared volatile to make sure the compiler doesn't cache it. static volatile int globalCounter [8] ; /* * myInterrupt: ********************************************************************************* */ void myInterrupt0 (void) { ++globalCounter [0] ; } void myInterrupt1 (void) { ++globalCounter [1] ; } void myInterrupt2 (void) { ++globalCounter [2] ; } void myInterrupt3 (void) { ++globalCounter [3] ; } void myInterrupt4 (void) { ++globalCounter [4] ; } void myInterrupt5 (void) { ++globalCounter [5] ; } void myInterrupt6 (void) { ++globalCounter [6] ; } void myInterrupt7 (void) { ++globalCounter [7] ; } /* ********************************************************************************* * main ********************************************************************************* */ int main (void) { int gotOne, pin ; int myCounter [8] ; for (pin = 0 ; pin < 8 ; ++pin) globalCounter [pin] = myCounter [pin] = 0 ; wiringPiSetup () ; wiringPiISR (0, INT_EDGE_FALLING, &myInterrupt0) ; wiringPiISR (1, INT_EDGE_FALLING, &myInterrupt1) ; wiringPiISR (2, INT_EDGE_FALLING, &myInterrupt2) ; wiringPiISR (3, INT_EDGE_FALLING, &myInterrupt3) ; wiringPiISR (4, INT_EDGE_FALLING, &myInterrupt4) ; wiringPiISR (5, INT_EDGE_FALLING, &myInterrupt5) ; wiringPiISR (6, INT_EDGE_FALLING, &myInterrupt6) ; wiringPiISR (7, INT_EDGE_FALLING, &myInterrupt7) ; for (;;) { gotOne = 0 ; printf ("Waiting ... ") ; fflush (stdout) ; for (;;) { for (pin = 0 ; pin < 8 ; ++pin) { if (globalCounter [pin] != myCounter [pin]) { printf (" Int on pin %d: Counter: %5d\n", pin, globalCounter [pin]) ; myCounter [pin] = globalCounter [pin] ; ++gotOne ; } } if (gotOne != 0) break ; } } return 0 ; } wiringPi/examples/clock.c0000644000000000000000000001167112457032564014437 0ustar rootroot/* * clock.c: * Demo of the 128x64 graphics based LCD driver. * This is designed to drive the parallel interface LCD drivers * based on the popular 12864H controller chip. * * This test program assumes the following: * (Which is currently hard-wired into the driver) * * GPIO 0-7 is connected to display data pins 0-7. * GPIO 10 is CS1 * GPIO 11 is CS2 * GPIO 12 is STROBE * GPIO 10 is RS * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif double clockRadius ; double thickness, barLen ; int maxX, maxY ; double rads (double degs) { return degs * M_PI / 180.0 ; } void drawClockHands (void) { time_t t ; struct tm *now ; double angle, p, x0, y0, x1, y1 ; int h24, h, m, s ; char text [20] ; time (&t) ; now = localtime (&t) ; h24 = now->tm_hour ; m = now->tm_min ; s = now->tm_sec ; h = h24 ; if (h > 12) h -= 12 ; // Hour hand angle = h * 30 + m * 0.5 ; x0 = sin (rads (angle)) * (clockRadius * 0.75) ; y0 = cos (rads (angle)) * (clockRadius * 0.75) ; for (p = -3.0 ; p <= 3.0 ; p += 0.2) { x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ; y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ; lcd128x64line (0, 0, x1, y1, 1) ; lcd128x64lineTo (x0, y0, 1) ; } // Minute hand angle = m * 6 ; x0 = sin (rads (angle)) * (clockRadius * 0.9) ; y0 = cos (rads (angle)) * (clockRadius * 0.9) ; for (p = -1.0 ; p <= 1.0 ; p += 0.2) { x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ; y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ; lcd128x64line (0, 0, x1, y1, 1) ; lcd128x64lineTo (x0, y0, 1) ; } // Second hand angle = s * 6 ; x0 = sin (rads (angle)) * (clockRadius * 0.2) ; y0 = cos (rads (angle)) * (clockRadius * 0.2) ; x1 = sin (rads (angle)) * (clockRadius * 0.95) ; y1 = cos (rads (angle)) * (clockRadius * 0.95) ; lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ; lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; // Text: sprintf (text, "%02d:%02d:%02d", h24, m, s) ; lcd128x64puts (32, 24, text, 0, 1) ; sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ; lcd128x64puts (32, -23, text, 0, 1) ; } void drawClockFace (void) { int m ; double d, px1, py1, px2, py2 ; lcd128x64clear (0) ; lcd128x64circle (0,0, clockRadius, 1, TRUE) ; lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; // The four big indicators for 12,15,30 and 45 lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 // Smaller 5 and 1 minute ticks for (m = 0 ; m < 60 ; ++m) { px1 = sin (rads (m * 6)) * clockRadius ; py1 = cos (rads (m * 6)) * clockRadius ; if ((m % 5) == 0) d = barLen ; else d = barLen / 2.0 ; px2 = sin (rads (m * 6)) * (clockRadius - d) ; py2 = cos (rads (m * 6)) * (clockRadius - d) ; lcd128x64line (px1, py1, px2, py2, 1) ; } } void setup (void) { lcd128x64getScreenSize (&maxX, &maxY) ; clockRadius = maxY / 2 - 1 ; thickness = maxX / 48 ; barLen = thickness * 4 ; lcd128x64setOrigin (32, 32) ; } /* *********************************************************************** * The main program *********************************************************************** */ int main (int argc, char *argv []) { time_t now ; wiringPiSetup () ; lcd128x64setup () ; setup () ; for (;;) { drawClockFace () ; drawClockHands () ; lcd128x64update () ; now = time (NULL) ; while (time (NULL) == now) delay (10) ; } return 0 ; } wiringPi/examples/blink12drcs.c0000644000000000000000000000607612457032564015465 0ustar rootroot/* * blink12drcs.c: * Simple sequence over the first 12 GPIO pins - LEDs * Aimed at the Gertboard, but it's fairly generic. * This version uses DRC totalk to the ATmega on the Gertboard * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define GERT_BASE 100 static int pinMap [] = { 0, 1, 2, 3, // Pi Native GERT_BASE + 2, GERT_BASE + 3, GERT_BASE + 4, GERT_BASE + 5, GERT_BASE + 6, GERT_BASE + 7, GERT_BASE + 8, GERT_BASE + 9, } ; // Simple sequencer data // Triplets of LED, On/Off and delay int data [] = { 0, 1, 1, 1, 1, 1, 0, 0, 0, 2, 1, 1, 1, 0, 0, 3, 1, 1, 2, 0, 0, 4, 1, 1, 3, 0, 0, 5, 1, 1, 4, 0, 0, 6, 1, 1, 5, 0, 0, 7, 1, 1, 6, 0, 0, 8, 1, 1, 7, 0, 0, 9, 1, 1, 8, 0, 0, 10, 1, 1, 9, 0, 0, 11, 1, 1, 10, 0, 1, 11, 0, 1, 0, 0, 1, // Extra delay // Back again 11, 1, 1, 10, 1, 1, 11, 0, 0, 9, 1, 1, 10, 0, 0, 8, 1, 1, 9, 0, 0, 7, 1, 1, 8, 0, 0, 6, 1, 1, 7, 0, 0, 5, 1, 1, 6, 0, 0, 4, 1, 1, 5, 0, 0, 3, 1, 1, 4, 0, 0, 2, 1, 1, 3, 0, 0, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, // Extra delay 0, 9, 0, // End marker } ; int main (void) { int pin ; int dataPtr ; int l, s, d ; printf ("Raspberry Pi - 12-LED Sequence\n") ; printf ("==============================\n") ; printf ("\n") ; printf ("Connect LEDs up to the first 4 Pi pins and 8 pins on the ATmega\n") ; printf (" from PD2 through PB1 in that order,\n") ; printf (" then sit back and watch the show!\n") ; wiringPiSetup () ; drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; for (pin = 0 ; pin < 12 ; ++pin) pinMode (pinMap [pin], OUTPUT) ; dataPtr = 0 ; for (;;) { l = data [dataPtr++] ; // LED s = data [dataPtr++] ; // State d = data [dataPtr++] ; // Duration (10ths) if (s == 9) // 9 -> End Marker { dataPtr = 0 ; continue ; } digitalWrite (pinMap [l], s) ; delay (d * analogRead (GERT_BASE) / 4) ; } return 0 ; } wiringPi/examples/Gertboard/0000755000000000000000000000000012457032564015103 5ustar rootrootwiringPi/examples/Gertboard/voltmeter.c0000644000000000000000000000356512457032564017301 0ustar rootroot/* * voltmeter.c: * Demonstrate use of the Gertboard A to D converter to make * a simple voltmeter. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include int main () { int x1, x2 ; double v1, v2 ; printf ("\n") ; printf ("Gertboard demo: Simple Voltmeters\n") ; printf ("=================================\n") ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; // Initialise the Gertboard analog hardware at pin 100 gertboardAnalogSetup (100) ; printf ("\n") ; printf ("| Channel 0 | Channel 1 |\n") ; for (;;) { // Read the 2 channels: x1 = analogRead (100) ; x2 = analogRead (101) ; // Convert to a voltage: v1 = (double)x1 / 1023.0 * 3.3 ; v2 = (double)x2 / 1023.0 * 3.3 ; // Print printf ("| %6.3f | %6.3f |\r", v1, v2) ; fflush (stdout) ; } return 0 ; } wiringPi/examples/Gertboard/vumeter.c0000644000000000000000000000635612457032564016750 0ustar rootroot/* * vumeter.c: * Simple VU meter * * Heres the theory: * We will sample at 4000 samples/sec and put the data into a * low-pass filter with a depth of 1000 samples. This will give * us 1/4 a second of lag on the signal, but I think it might * produce a more pleasing output. * * The input of the microphone should be at mid-pont with no * sound input, but we might have to sample that too, to get * our reference zero... * * Copyright (c) 2013 Gordon Henderson *********************************************************************** */ #include #include #include #include #include #ifndef TRUE #define TRUE (1==1) #define FALSE (!TRUE) #endif #define B_SIZE 1000 #define S_SIZE 128 static int buffer [B_SIZE] ; static int bPtr = 0 ; /* * ledPercent: * Output the given value as a percentage on the LEDs ********************************************************************************* */ static void ledPercent (int percent) { unsigned int output = 0 ; if (percent > 11) output |= 0x01 ; if (percent > 22) output |= 0x02 ; if (percent > 33) output |= 0x04 ; if (percent > 44) output |= 0x08 ; if (percent > 55) output |= 0x10 ; if (percent > 66) output |= 0x20 ; if (percent > 77) output |= 0x40 ; if (percent > 88) output |= 0x80 ; digitalWriteByte (output) ; } static unsigned int tPeriod, tNextSampleTime ; /* * sample: * Get a sample from the Gertboard. If not enough time has elapsed * since the last sample, then wait... ********************************************************************************* */ static void sample (void) { unsigned int tFuture ; // Calculate the future sample time tFuture = tPeriod + tNextSampleTime ; // Wait until the next sample time while (micros () < tNextSampleTime) ; buffer [bPtr] = gertboardAnalogRead (0) ; tNextSampleTime = tFuture ; } int main () { int quietLevel, min, max ; int i, sum ; unsigned int tStart, tEnd ; printf ("\n") ; printf ("Gertboard demo: VU Meter\n") ; printf ("========================\n") ; wiringPiSetup () ; gertboardSPISetup () ; ledPercent (0) ; for (i = 0 ; i < 8 ; ++i) pinMode (i, OUTPUT) ; for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) buffer [bPtr] = 99 ; tPeriod = 1000000 / 1000 ; printf ("Shhhh.... ") ; fflush (stdout) ; delay (1000) ; printf ("Sampling quiet... ") ; fflush (stdout) ; tStart = micros () ; tNextSampleTime = micros () ; for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) sample () ; tEnd = micros () ; quietLevel = 0 ; max = 0 ; min = 1024 ; for (i = 0 ; i < B_SIZE ; ++i) { quietLevel += buffer [i] ; if (buffer [i] > max) max = buffer [i] ; if (buffer [i] < min) min = buffer [i] ; } quietLevel /= B_SIZE ; printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ; printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ; for (bPtr = 0 ;;) { sample () ; sum = 0 ; for (i = 0 ; i < S_SIZE ; ++i) sum += buffer [i] ; sum /= S_SIZE ; sum = abs (quietLevel - sum) ; sum = (sum * 1000) / quietLevel ; ledPercent (sum) ; if (++bPtr > S_SIZE) bPtr = 0 ; } return 0 ; } wiringPi/examples/Gertboard/gertboard.c0000644000000000000000000000516212457032564017224 0ustar rootroot/* * gertboard.c: * Simple test for the SPI bus on the Gertboard * * Hardware setup: * D/A port 0 jumpered to A/D port 0. * * We output a sine wave on D/A port 0 and sample A/D port 0. We then * plot the input value on the terminal as a sort of vertical scrolling * oscilloscipe. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include // Gertboard D to A is an 8-bit unit. #define B_SIZE 256 #include #include int main (void) { double angle ; int i, inputValue ; int buffer [B_SIZE] ; int cols ; struct winsize w ; printf ("Raspberry Pi Gertboard SPI test program\n") ; printf ("=======================================\n") ; ioctl (fileno (stdin), TIOCGWINSZ, &w); cols = w.ws_col - 2 ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; // Initialise the Gertboard analog hardware at pin 100 gertboardAnalogSetup (100) ; // Generate a Sine Wave and store in our buffer for (i = 0 ; i < B_SIZE ; ++i) { angle = ((double)i / (double)B_SIZE) * M_PI * 2.0 ; buffer [i] = (int)rint ((sin (angle)) * 127.0 + 128.0) ; } // Loop, output the sine wave on analog out port 0, read it into A-D port 0 // and display it on the screen for (;;) { for (i = 0 ; i < B_SIZE ; ++i) { analogWrite (100, buffer [i]) ; inputValue = analogRead (100) ; // We don't need to wory about the scale or sign - the analog hardware is // a 10-bit value, so 0-1023. Just scale this to our terminal printf ("%*s\n", (inputValue * cols) / 1023, "*") ; delay (2) ; } } return 0 ; } wiringPi/examples/Gertboard/temperature.c0000644000000000000000000000420012457032564017600 0ustar rootroot/* * temperature.c: * Demonstrate use of the Gertboard A to D converter to make * a simple thermometer using the LM35. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include int main () { int x1, x2 ; double v1, v2 ; printf ("\n") ; printf ("Gertboard demo: Simple Thermemeter\n") ; printf ("==================================\n") ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; // Initialise the Gertboard analog hardware at pin 100 gertboardAnalogSetup (100) ; printf ("\n") ; printf ("| Channel 0 | Channel 1 | Temperature 1 | Temperature 2 |\n") ; for (;;) { // Read the 2 channels: x1 = analogRead (100) ; x2 = analogRead (101) ; // Convert to a voltage: v1 = (double)x1 / 1023.0 * 3.3 ; v2 = (double)x2 / 1023.0 * 3.3 ; // Print printf ("| %6.3f | %6.3f |", v1, v2) ; // Print Temperature of both channels by converting the LM35 reading // to a temperature. Fortunately these are easy: 0.01 volts per C. printf (" %4.1f | %4.1f |\r", v1 * 100.0, v2 * 100.0) ; fflush (stdout) ; } return 0 ; } wiringPi/examples/Gertboard/record.c0000644000000000000000000000234612457032564016532 0ustar rootroot/* * record.c: * Record some audio via the Gertboard * * Copyright (c) 2013 Gordon Henderson *********************************************************************** */ #include #include #include #include #define B_SIZE 40000 int main () { int i ; struct timeval tStart, tEnd, tTaken ; unsigned char buffer [B_SIZE] ; printf ("\n") ; printf ("Gertboard demo: Recorder\n") ; printf ("========================\n") ; // Always initialise wiringPi. Use wiringPiSys() if you don't need // (or want) to run as root wiringPiSetupSys () ; // Initialise the Gertboard analog hardware at pin 100 gertboardAnalogSetup (100) ; gettimeofday (&tStart, NULL) ; for (i = 0 ; i < B_SIZE ; ++i) buffer [i] = analogRead (100) >> 2 ; gettimeofday (&tEnd, NULL) ; timersub (&tEnd, &tStart, &tTaken) ; printf ("Time taken for %d reads: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; gettimeofday (&tStart, NULL) ; for (i = 0 ; i < B_SIZE ; ++i) analogWrite (100, buffer [i]) ; gettimeofday (&tEnd, NULL) ; timersub (&tEnd, &tStart, &tTaken) ; printf ("Time taken for %d writes: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; return 0 ; } wiringPi/examples/Gertboard/7segments.c0000644000000000000000000001043312457032564017164 0ustar rootroot/* * 7segments.c: * Simple test program to see if we can drive a 7-segment LED * display using the GPIO and little else on the Raspberry Pi * * Copyright (c) 2013 Gordon Henderson *********************************************************************** */ #undef PHOTO_HACK #include #include #include #include #include /* * Segment mapping * * --a-- * | | * f b * | | * --g-- * | | * e c * | | * --d-- p */ // GPIO Pin Mapping static int digits [6] = { 7, 11, 10, 13, 12, 14 } ; static int segments [7] = { 6, 5, 4, 3, 2, 1, 0 } ; static const int segmentDigits [] = { // a b c d e f g Segments // 6 5 4 3 2 1 0, // wiringPi pin No. 1, 1, 1, 1, 1, 1, 0, // 0 0, 1, 1, 0, 0, 0, 0, // 1 1, 1, 0, 1, 1, 0, 1, // 2 1, 1, 1, 1, 0, 0, 1, // 3 0, 1, 1, 0, 0, 1, 1, // 4 1, 0, 1, 1, 0, 1, 1, // 5 1, 0, 1, 1, 1, 1, 1, // 6 1, 1, 1, 0, 0, 0, 0, // 7 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 0, 1, 1, // 9 1, 1, 1, 0, 1, 1, 1, // A 0, 0, 1, 1, 1, 1, 1, // b 1, 0, 0, 1, 1, 1, 0, // C 0, 1, 1, 1, 1, 0, 1, // d 1, 0, 0, 1, 1, 1, 1, // E 1, 0, 0, 0, 1, 1, 1, // F 0, 0, 0, 0, 0, 0, 0, // blank } ; // display: // A global variable which is written to by the main program and // read from by the thread that updates the display. Only the first // 6 characters are used. char display [8] ; /* * displayDigits: * This is our thread that's run concurrently with the main program. * Essentially sit in a loop, parsing and displaying the data held in * the "display" global. ********************************************************************************* */ PI_THREAD (displayDigits) { int digit, segment ; int index, d, segVal ; piHiPri (50) ; for (;;) { for (digit = 0 ; digit < 6 ; ++digit) { for (segment = 0 ; segment < 7 ; ++segment) { d = toupper (display [digit]) ; /**/ if ((d >= '0') && (d <= '9')) // Digit index = d - '0' ; else if ((d >= 'A') && (d <= 'F')) // Hex index = d - 'A' + 10 ; else index = 16 ; // Blank segVal = segmentDigits [index * 7 + segment] ; digitalWrite (segments [segment], segVal) ; } digitalWrite (digits [digit], 1) ; delay (2) ; digitalWrite (digits [digit], 0) ; } } } /* * setup: * Initialise the hardware and start the thread ********************************************************************************* */ void setup (void) { int i, c ; wiringPiSetup () ; // 7 segments for (i = 0 ; i < 7 ; ++i) { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; } // 6 digits for (i = 0 ; i < 6 ; ++i) { digitalWrite (digits [i], 0) ; pinMode (digits [i], OUTPUT) ; } strcpy (display, " ") ; piThreadCreate (displayDigits) ; delay (10) ; // Just to make sure it's started // Quick countdown LED test sort of thing c = 999999 ; for (i = 0 ; i < 10 ; ++i) { sprintf (display, "%06d", c) ; delay (400) ; c -= 111111 ; } strcpy (display, " ") ; delay (400) ; #ifdef PHOTO_HACK sprintf (display, "%s", "123456") ; for (;;) delay (1000) ; #endif } /* * teenager: * No explanation needed. (Nor one given!) ********************************************************************************* */ void teenager (void) { char *message = " feedbeef babe cafe b00b " ; int i ; for (i = 0 ; i < strlen (message) - 4 ; ++i) { strncpy (display, &message [i], 6) ; delay (200) ; } delay (1000) ; for (i = 0 ; i < 3 ; ++i) { strcpy (display, " ") ; delay (150) ; strcpy (display, " b00b ") ; delay (250) ; } delay (1000) ; strcpy (display, " ") ; delay (1000) ; } /* ********************************************************************************* * main: * Let the fun begin ********************************************************************************* */ int main (void) { struct tm *t ; time_t tim ; setup () ; teenager () ; tim = time (NULL) ; for (;;) { while (time (NULL) == tim) delay (5) ; tim = time (NULL) ; t = localtime (&tim) ; sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ; delay (500) ; } return 0 ; } wiringPi/examples/Gertboard/buttons.c0000644000000000000000000000421312457032564016745 0ustar rootroot/* * buttons.c: * Read the Gertboard buttons. Each one will act as an on/off * tiggle switch for 3 different LEDs * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include // Array to keep track of our LEDs int leds [] = { 0, 0, 0 } ; // scanButton: // See if a button is pushed, if so, then flip that LED and // wait for the button to be let-go void scanButton (int button) { if (digitalRead (button) == HIGH) // Low is pushed return ; leds [button] ^= 1 ; // Invert state digitalWrite (4 + button, leds [button]) ; while (digitalRead (button) == LOW) // Wait for release delay (10) ; } int main (void) { int i ; printf ("Raspberry Pi Gertboard Button Test\n") ; wiringPiSetup () ; // Setup the outputs: // Pins 3, 4, 5, 6 and 7 output: // We're not using 3 or 4, but make sure they're off anyway // (Using same hardware config as blink12.c) for (i = 3 ; i < 8 ; ++i) { pinMode (i, OUTPUT) ; digitalWrite (i, 0) ; } // Setup the inputs for (i = 0 ; i < 3 ; ++i) { pinMode (i, INPUT) ; pullUpDnControl (i, PUD_UP) ; leds [i] = 0 ; } for (;;) { for (i = 0 ; i < 3 ; ++i) scanButton (i) ; delay (1) ; } } wiringPi/examples/Gertboard/Makefile0000644000000000000000000000263412457032564016550 0ustar rootroot# # Makefile: # Gertboard - Examples using wiringPi # # Copyright (c) 2013 Gordon Henderson ################################################################################# #DEBUG = -g -O0 DEBUG = -O3 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm # Should not alter anything below this line ############################################################################### SRC = gertboard.c \ buttons.c 7segments.c \ voltmeter.c temperature.c vumeter.c \ record.c OBJ = $(SRC:.c=.o) BINS = $(SRC:.c=) all: $(BINS) gertboard: gertboard.o @echo [link] @$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS) buttons: buttons.o @echo [link] @$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) 7segments: 7segments.o @echo [link] @$(CC) -o $@ 7segments.o $(LDFLAGS) $(LDLIBS) voltmeter: voltmeter.o @echo [link] @$(CC) -o $@ voltmeter.o $(LDFLAGS) $(LDLIBS) temperature: temperature.o @echo [link] @$(CC) -o $@ temperature.o $(LDFLAGS) $(LDLIBS) vumeter: vumeter.o @echo [link] @$(CC) -o $@ vumeter.o $(LDFLAGS) $(LDLIBS) record: record.o @echo [link] @$(CC) -o $@ record.o $(LDFLAGS) $(LDLIBS) .c.o: @echo [CC] $< @$(CC) -c $(CFLAGS) $< -o $@ clean: @echo [Clean] @rm -f $(OBJ) *~ core tags $(BINS) tags: $(SRC) @echo [ctags] @ctags $(SRC) depend: makedepend -Y $(SRC) # DO NOT DELETE wiringPi/examples/lcd-adafruit.c0000644000000000000000000001721612457032564015704 0ustar rootroot/* * lcd-adafruit.c: * Text-based LCD driver test code * This is designed to drive the Adafruit RGB LCD Plate * with the additional 5 buttons for the Raspberry Pi * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif // Defines for the Adafruit Pi LCD interface board #define AF_BASE 100 #define AF_RED (AF_BASE + 6) #define AF_GREEN (AF_BASE + 7) #define AF_BLUE (AF_BASE + 8) #define AF_E (AF_BASE + 13) #define AF_RW (AF_BASE + 14) #define AF_RS (AF_BASE + 15) #define AF_DB4 (AF_BASE + 12) #define AF_DB5 (AF_BASE + 11) #define AF_DB6 (AF_BASE + 10) #define AF_DB7 (AF_BASE + 9) #define AF_SELECT (AF_BASE + 0) #define AF_RIGHT (AF_BASE + 1) #define AF_DOWN (AF_BASE + 2) #define AF_UP (AF_BASE + 3) #define AF_LEFT (AF_BASE + 4) // User-Defined character test static unsigned char newChar [8] = { 0b00100, 0b00100, 0b00000, 0b00100, 0b01110, 0b11011, 0b11011, 0b10001, } ; // Global lcd handle: static int lcdHandle ; /* * usage: ********************************************************************************* */ int usage (const char *progName) { fprintf (stderr, "Usage: %s colour\n", progName) ; return EXIT_FAILURE ; } /* * scrollMessage: ********************************************************************************* */ static const char *message = " " "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" " " ; void scrollMessage (int line, int width) { char buf [32] ; static int position = 0 ; static int timer = 0 ; if (millis () < timer) return ; timer = millis () + 200 ; strncpy (buf, &message [position], width) ; buf [width] = 0 ; lcdPosition (lcdHandle, 0, line) ; lcdPuts (lcdHandle, buf) ; if (++position == (strlen (message) - width)) position = 0 ; } /* * setBacklightColour: * The colour outputs are inverted. ********************************************************************************* */ static void setBacklightColour (int colour) { colour &= 7 ; digitalWrite (AF_RED, !(colour & 1)) ; digitalWrite (AF_GREEN, !(colour & 2)) ; digitalWrite (AF_BLUE, !(colour & 4)) ; } /* * adafruitLCDSetup: * Setup the Adafruit board by making sure the additional pins are * set to the correct modes, etc. ********************************************************************************* */ static void adafruitLCDSetup (int colour) { int i ; // Backlight LEDs pinMode (AF_RED, OUTPUT) ; pinMode (AF_GREEN, OUTPUT) ; pinMode (AF_BLUE, OUTPUT) ; setBacklightColour (colour) ; // Input buttons for (i = 0 ; i <= 4 ; ++i) { pinMode (AF_BASE + i, INPUT) ; pullUpDnControl (AF_BASE + i, PUD_UP) ; // Enable pull-ups, switches close to 0v } // Control signals pinMode (AF_RW, OUTPUT) ; digitalWrite (AF_RW, LOW) ; // Not used with wiringPi - always in write mode // The other control pins are initialised with lcdInit () lcdHandle = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ; if (lcdHandle < 0) { fprintf (stderr, "lcdInit failed\n") ; exit (EXIT_FAILURE) ; } } /* * waitForEnter: * On the Adafruit display, wait for the select button ********************************************************************************* */ static void waitForEnter (void) { printf ("Press SELECT to continue: ") ; fflush (stdout) ; while (digitalRead (AF_SELECT) == HIGH) // Wait for push delay (1) ; while (digitalRead (AF_SELECT) == LOW) // Wait for release delay (1) ; printf ("OK\n") ; } /* * speedTest: * Test the update speed of the display ********************************************************************************* */ static void speedTest (void) { unsigned int start, end, taken ; int times ; lcdClear (lcdHandle) ; start = millis () ; for (times = 0 ; times < 10 ; ++times) { lcdPuts (lcdHandle, "0123456789ABCDEF") ; lcdPuts (lcdHandle, "0123456789ABCDEF") ; } end = millis () ; taken = (end - start) / 10; lcdClear (lcdHandle) ; lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Speed: %dmS", taken) ; lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "For full update") ; waitForEnter () ; lcdClear (lcdHandle) ; lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Time: %dmS", taken / 32) ; lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "Per character") ; waitForEnter () ; lcdClear (lcdHandle) ; lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "%d cps...", 32000 / taken) ; waitForEnter () ; } /* * The works ********************************************************************************* */ int main (int argc, char *argv[]) { int colour ; int cols = 16 ; int waitForRelease = FALSE ; struct tm *t ; time_t tim ; char buf [32] ; if (argc != 2) return usage (argv [0]) ; printf ("Raspberry Pi Adafruit LCD test\n") ; printf ("==============================\n") ; colour = atoi (argv [1]) ; wiringPiSetupSys () ; mcp23017Setup (AF_BASE, 0x20) ; adafruitLCDSetup (colour) ; lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; waitForEnter () ; lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "Adafruit RGB LCD") ; waitForEnter () ; lcdCharDef (lcdHandle, 2, newChar) ; lcdClear (lcdHandle) ; lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "User Char: ") ; lcdPutchar (lcdHandle, 2) ; lcdCursor (lcdHandle, TRUE) ; lcdCursorBlink (lcdHandle, TRUE) ; waitForEnter () ; lcdCursor (lcdHandle, FALSE) ; lcdCursorBlink (lcdHandle, FALSE) ; speedTest () ; lcdClear (lcdHandle) ; for (;;) { scrollMessage (0, cols) ; tim = time (NULL) ; t = localtime (&tim) ; sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; lcdPuts (lcdHandle, buf) ; // Check buttons to cycle colour // If Up or Down are still pushed, then skip if (waitForRelease) { if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW)) continue ; else waitForRelease = FALSE ; } if (digitalRead (AF_UP) == LOW) // Pushed { colour = colour + 1 ; if (colour == 8) colour = 0 ; setBacklightColour (colour) ; waitForRelease = TRUE ; } if (digitalRead (AF_DOWN) == LOW) // Pushed { colour = colour - 1 ; if (colour == -1) colour = 7 ; setBacklightColour (colour) ; waitForRelease = TRUE ; } } return 0 ; } wiringPi/examples/lcd.c0000644000000000000000000001410712457032564014103 0ustar rootroot/* * lcd.c: * Text-based LCD driver. * This is designed to drive the parallel interface LCD drivers * based in the Hitachi HD44780U controller and compatables. * * This test program assumes the following: * * 8-bit displays: * GPIO 0-7 is connected to display data pins 0-7. * GPIO 11 is the RS pin. * GPIO 10 is the Strobe/E pin. * * For 4-bit interface: * GPIO 4-7 is connected to display data pins 4-7. * GPIO 11 is the RS pin. * GPIO 10 is the Strobe/E pin. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (1==2) #endif static unsigned char newChar [8] = { 0b11111, 0b10001, 0b10001, 0b10101, 0b11111, 0b10001, 0b10001, 0b11111, } ; // Global lcd handle: static int lcdHandle ; /* * usage: ********************************************************************************* */ int usage (const char *progName) { fprintf (stderr, "Usage: %s bits cols rows\n", progName) ; return EXIT_FAILURE ; } /* * scrollMessage: ********************************************************************************* */ static const char *message = " " "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" " " ; void scrollMessage (int line, int width) { char buf [32] ; static int position = 0 ; static int timer = 0 ; if (millis () < timer) return ; timer = millis () + 200 ; strncpy (buf, &message [position], width) ; buf [width] = 0 ; lcdPosition (lcdHandle, 0, line) ; lcdPuts (lcdHandle, buf) ; if (++position == (strlen (message) - width)) position = 0 ; } /* * pingPong: * Bounce a character - only on 4-line displays ********************************************************************************* */ static void pingPong (int lcd, int cols) { static int position = 0 ; static int dir = 0 ; if (dir == 0) // Setup { dir = 1 ; lcdPosition (lcdHandle, 0, 3) ; lcdPutchar (lcdHandle, '*') ; return ; } lcdPosition (lcdHandle, position, 3) ; lcdPutchar (lcdHandle, ' ') ; position += dir ; if (position == cols) { dir = -1 ; --position ; } if (position < 0) { dir = 1 ; ++position ; } lcdPosition (lcdHandle, position, 3) ; lcdPutchar (lcdHandle, '#') ; } /* * waitForEnter: ********************************************************************************* */ static void waitForEnter (void) { printf ("Press ENTER to continue: ") ; (void)fgetc (stdin) ; } /* * The works ********************************************************************************* */ int main (int argc, char *argv[]) { int i ; int lcd ; int bits, rows, cols ; struct tm *t ; time_t tim ; char buf [32] ; if (argc != 4) return usage (argv [0]) ; printf ("Raspberry Pi LCD test\n") ; printf ("=====================\n") ; bits = atoi (argv [1]) ; cols = atoi (argv [2]) ; rows = atoi (argv [3]) ; if (!((rows == 1) || (rows == 2) || (rows == 4))) { fprintf (stderr, "%s: rows must be 1, 2 or 4\n", argv [0]) ; return EXIT_FAILURE ; } if (!((cols == 16) || (cols == 20))) { fprintf (stderr, "%s: cols must be 16 or 20\n", argv [0]) ; return EXIT_FAILURE ; } wiringPiSetup () ; if (bits == 4) lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ; else lcdHandle = lcdInit (rows, cols, 8, 11,10, 0,1,2,3,4,5,6,7) ; if (lcdHandle < 0) { fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ; return -1 ; } lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; waitForEnter () ; if (rows > 1) { lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; if (rows == 4) { lcdPosition (lcdHandle, 0, 2) ; for (i = 0 ; i < ((cols - 1) / 2) ; ++i) lcdPuts (lcdHandle, "=-") ; lcdPuts (lcdHandle, "=3") ; lcdPosition (lcdHandle, 0, 3) ; for (i = 0 ; i < ((cols - 1) / 2) ; ++i) lcdPuts (lcdHandle, "-=") ; lcdPuts (lcdHandle, "-4") ; } } waitForEnter () ; lcdCharDef (lcdHandle, 2, newChar) ; lcdClear (lcdHandle) ; lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "User Char: ") ; lcdPutchar (lcdHandle, 2) ; lcdCursor (lcdHandle, TRUE) ; lcdCursorBlink (lcdHandle, TRUE) ; waitForEnter () ; lcdCursor (lcdHandle, FALSE) ; lcdCursorBlink (lcdHandle, FALSE) ; lcdClear (lcdHandle) ; for (;;) { scrollMessage (0, cols) ; if (rows == 1) continue ; tim = time (NULL) ; t = localtime (&tim) ; sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; lcdPuts (lcdHandle, buf) ; if (rows == 2) continue ; sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ; lcdPosition (lcdHandle, (cols - 10) / 2, 2) ; lcdPuts (lcdHandle, buf) ; pingPong (lcd, cols) ; } return 0 ; } wiringPi/examples/servo.c0000644000000000000000000000316512457032564014501 0ustar rootroot/* * servo.c: * Test of the softServo code. * Do not use this code - use the servoBlaster kernel module instead * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include int main () { if (wiringPiSetup () == -1) { fprintf (stdout, "oops: %s\n", strerror (errno)) ; return 1 ; } softServoSetup (0, 1, 2, 3, 4, 5, 6, 7) ; softServoWrite (0, 0) ; /* softServoWrite (1, 1000) ; softServoWrite (2, 1100) ; softServoWrite (3, 1200) ; softServoWrite (4, 1300) ; softServoWrite (5, 1400) ; softServoWrite (6, 1500) ; softServoWrite (7, 2200) ; */ for (;;) delay (10) ; } wiringPi/examples/delayTest.c0000644000000000000000000000510612457032564015276 0ustar rootroot/* * delayTest.c: * Just a little test program I'm using to experiment with * various timings and latency, etc. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #define CYCLES 1000 int main() { int x ; struct timeval t1, t2 ; int t ; int max, min ; int del ; int underRuns, overRuns, exactRuns, total ; int descheds ; if (wiringPiSetup () == -1) return 1 ; piHiPri (10) ; sleep (1) ; // Baseline test gettimeofday (&t1, NULL) ; gettimeofday (&t2, NULL) ; t = t2.tv_usec - t1.tv_usec ; printf ("Baseline test: %d\n", t); for (del = 1 ; del < 200 ; ++del) { underRuns = overRuns = exactRuns = total = 0 ; descheds = 0 ; max = del ; min = del ; for (x = 0 ; x < CYCLES ; ++x) { for (;;) // Repeat this if we get a delay over 999uS { // -> High probability Linux has deschedulled us gettimeofday (&t1, NULL) ; delayMicroseconds (del) ; gettimeofday (&t2, NULL) ; if (t2.tv_usec < t1.tv_usec) // Counter wrapped t = (1000000 + t2.tv_usec) - t1.tv_usec; else t = t2.tv_usec - t1.tv_usec ; if (t > 999) { ++descheds ; continue ; } else break ; } if (t > max) { max = t ; ++overRuns ; } else if (t < min) { min = t ; ++underRuns ; } else ++exactRuns ; total += t ; } printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d, Descheds: %2d\n", del, min, max, underRuns, overRuns, exactRuns, total / CYCLES, descheds) ; fflush (stdout) ; delay (1) ; } return 0 ; } wiringPi/examples/speed.c0000644000000000000000000000516112457032564014441 0ustar rootroot/* * speed.c: * Simple program to measure the speed of the various GPIO * access mechanisms. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #define FAST_COUNT 10000000 #define SLOW_COUNT 1000000 #define PASSES 5 void speedTest (int pin, int maxCount) { int count, sum, perSec, i ; unsigned int start, end ; sum = 0 ; for (i = 0 ; i < PASSES ; ++i) { start = millis () ; for (count = 0 ; count < maxCount ; ++count) digitalWrite (pin, 1) ; end = millis () ; printf (" %6d", end - start) ; fflush (stdout) ; sum += (end - start) ; } digitalWrite (pin, 0) ; printf (". Av: %6dmS", sum / PASSES) ; perSec = (int)(double)maxCount / (double)((double)sum / (double)PASSES) * 1000.0 ; printf (": %7d/sec\n", perSec) ; } int main (void) { printf ("Raspberry Pi wiringPi GPIO speed test program\n") ; printf ("=============================================\n") ; // Start the standard way printf ("\nNative wiringPi method: (%8d iterations)\n", FAST_COUNT) ; wiringPiSetup () ; pinMode (0, OUTPUT) ; speedTest (0, FAST_COUNT) ; // GPIO printf ("\nNative GPIO method: (%8d iterations)\n", FAST_COUNT) ; wiringPiSetupGpio () ; pinMode (17, OUTPUT) ; speedTest (17, FAST_COUNT) ; // Phys printf ("\nPhysical pin GPIO method: (%8d iterations)\n", FAST_COUNT) ; wiringPiSetupPhys () ; pinMode (11, OUTPUT) ; speedTest (11, FAST_COUNT) ; // Switch to SYS mode: system ("/usr/local/bin/gpio export 17 out") ; printf ("\n/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ; wiringPiSetupSys () ; speedTest (17, SLOW_COUNT) ; return 0 ; } wiringPi/examples/pwm.c0000644000000000000000000000301612457032564014141 0ustar rootroot/* * pwm.c: * This tests the hardware PWM channel. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include int main (void) { int bright ; printf ("Raspberry Pi wiringPi PWM test program\n") ; if (wiringPiSetup () == -1) exit (1) ; pinMode (1, PWM_OUTPUT) ; for (;;) { for (bright = 0 ; bright < 1024 ; ++bright) { pwmWrite (1, bright) ; delay (1) ; } for (bright = 1023 ; bright >= 0 ; --bright) { pwmWrite (1, bright) ; delay (1) ; } } return 0 ; } wiringPi/examples/blink.rtb0000644000000000000000000000224612457032564015006 0ustar rootroot// blink.rtb: // Blink program in Return to Basic // // Copyright (c) 2012-2013 Gordon Henderson. //********************************************************************** // This file is part of wiringPi: // https://projects.drogon.net/raspberry-pi/wiringpi/ // // wiringPi is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // wiringPi 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with wiringPi. If not, see . *********************************************************************** // PinMode (0, 1) // Output CYCLE DigitalWrite (0, 1) // Pin 0 ON WAIT (0.5) // 0.5 seconds DigitalWrite (0, 0) WAIT (0.5) REPEAT END wiringPi/examples/softTone.c0000644000000000000000000000276712457032564015153 0ustar rootroot/* * softTone.c: * Test of the softTone module in wiringPi * Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #define PIN 3 int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ; int main () { int i ; wiringPiSetup () ; softToneCreate (PIN) ; for (;;) { for (i = 0 ; i < 8 ; ++i) { printf ("%3d\n", i) ; softToneWrite (PIN, scale [i]) ; delay (500) ; } } } wiringPi/examples/PiGlow/0000755000000000000000000000000012457032564014373 5ustar rootrootwiringPi/examples/PiGlow/piGlow0.c0000644000000000000000000000302712457032564016062 0ustar rootroot/* * piglow.c: * Very simple demonstration of the PiGlow board. * This uses the SN3218 directly - soon there will be a new PiGlow * devLib device which will handle the PiGlow board on a more easy * to use manner... * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #define LED_BASE 533 int main (void) { int i, j ; wiringPiSetupSys () ; sn3218Setup (LED_BASE) ; for (;;) { for (i = 0 ; i < 256 ; ++i) for (j = 0 ; j < 18 ; ++j) analogWrite (LED_BASE + j, i) ; for (i = 255 ; i >= 0 ; --i) for (j = 0 ; j < 18 ; ++j) analogWrite (LED_BASE + j, i) ; } } wiringPi/examples/PiGlow/piGlow1.c0000644000000000000000000001226512457032564016067 0ustar rootroot/* * piGlow1.c: * Very simple demonstration of the PiGlow board. * This uses the piGlow devLib. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #define PIGLOW_BASE 533 #ifndef TRUE # define TRUE (1==1) # define FALSE (!TRUE) #endif /* * keypressed: clearKeypressed: * Simple but effective ways to tell if the enter key has been pressed ********************************************************************************* */ static int keypressed (void) { struct pollfd polls ; polls.fd = fileno (stdin) ; polls.events = POLLIN ; return poll (&polls, 1, 0) != 0 ; } static void clearKeypressed (void) { while (keypressed ()) (void)getchar () ; } /* * pulseLed: * Pulses the LED at position leg, ring from off to a max. value, * then off again ********************************************************************************* */ static void pulseLed (int leg, int ring) { int i ; for (i = 0 ; i < 140 ; ++i) { piGlow1 (leg, ring, i) ; delay (1) ; } delay (10) ; for (i = 140 ; i >= 0 ; --i) { piGlow1 (leg, ring, i) ; delay (1) ; } } /* * pulseLeg: * Same as above, but a whole leg at a time ********************************************************************************* */ static void pulseLeg (int leg) { int i ; for (i = 0 ; i < 140 ; ++i) { piGlowLeg (leg, i) ; delay (1) ; } delay (10) ; for (i = 140 ; i >= 0 ; --i) { piGlowLeg (leg, i) ; delay (1) ; } } /* * pulse Ring: * Same as above, but a whole ring at a time ********************************************************************************* */ static void pulseRing (int ring) { int i ; for (i = 0 ; i < 140 ; ++i) { piGlowRing (ring, i) ; delay (1) ; } delay (10) ; for (i = 140 ; i >= 0 ; --i) { piGlowRing (ring, i) ; delay (1) ; } } #define LEG_STEPS 3 static int legSequence [] = { 4, 12, 99, 99, 4, 12, 12, 99, 4, } ; #define RING_STEPS 16 static int ringSequence [] = { 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 64, 64, 0, 0, 0, 64, 64, 0, 0, 0, 64, 64, 0, 0, 0, 64, 64, 0, 0, 0, 64, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, } ; /* * main: * Our little demo prgoram ********************************************************************************* */ int main (void) { int i ; int step, ring, leg ; // Always initialise wiringPi: // Use the Sys method if you don't need to run as root wiringPiSetupSys () ; // Initialise the piGlow devLib with our chosen pin base piGlowSetup (1) ; // LEDs, one at a time printf ("LEDs, one at a time\n") ; for (; !keypressed () ;) for (leg = 0 ; leg < 3 ; ++leg) { for (ring = 0 ; ring < 6 ; ++ring) { pulseLed (leg, ring) ; if (keypressed ()) break ; } if (keypressed ()) break ; } clearKeypressed () ; // Rings, one at a time printf ("Rings, one at a time\n") ; for (; !keypressed () ;) for (ring = 0 ; ring < 6 ; ++ring) { pulseRing (ring) ; if (keypressed ()) break ; } clearKeypressed () ; // Legs, one at a time printf ("Legs, one at a time\n") ; for (; !keypressed () ;) for (leg = 0 ; leg < 3 ; ++leg) { pulseLeg (leg) ; if (keypressed ()) break ; } clearKeypressed () ; delay (1000) ; // Sequence - alternating rings, legs and random printf ("Sequence now\n") ; for (; !keypressed () ;) { for (i = 0 ; i < 20 ; ++i) for (step = 0 ; step < LEG_STEPS ; ++step) { for (leg = 0 ; leg < 3 ; ++leg) piGlowLeg (leg, legSequence [step * 3 + leg]) ; delay (80) ; } for (i = 0 ; i < 10 ; ++i) for (step = 0 ; step < RING_STEPS ; ++step) { for (ring = 0 ; ring < 6 ; ++ring) piGlowRing (ring, ringSequence [step * 6 + ring]) ; delay (80) ; } for (i = 0 ; i < 1000 ; ++i) { leg = random () % 3 ; ring = random () % 6 ; piGlow1 (leg, ring, random () % 256) ; delay (5) ; piGlow1 (leg, ring, 0) ; } } return 0 ; } wiringPi/examples/PiGlow/piglow.c0000644000000000000000000001113512457032564016041 0ustar rootroot/* * piglow.c: * Very simple demonstration of the PiGlow board. * This uses the piGlow devLib. * * Copyright (c) 2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #ifndef TRUE # define TRUE (1==1) # define FALSE (!TRUE) #endif #include #include static void failUsage (void) { fprintf (stderr, "Usage examples:\n") ; fprintf (stderr, " piglow off # All off\n") ; fprintf (stderr, " piglow red 50 # Light the 3 red LEDs to 50%%\n") ; fprintf (stderr, " colours are: red, yellow, orange, green, blue and white\n") ; fprintf (stderr, " piglow all 75 # Light all to 75%%\n") ; fprintf (stderr, " piglow leg 0 25 # Light leg 0 to 25%%\n") ; fprintf (stderr, " piglow ring 3 100 # Light ring 3 to 100%%\n") ; fprintf (stderr, " piglow led 2 5 100 # Light the single LED on Leg 2, ring 5 to 100%%\n") ; exit (EXIT_FAILURE) ; } static int getPercent (char *typed) { int percent ; percent = atoi (typed) ; if ((percent < 0) || (percent > 100)) { fprintf (stderr, "piglow: percent value out of range\n") ; exit (EXIT_FAILURE) ; } return (percent * 255) / 100 ; } /* * main: * Our little demo prgoram ********************************************************************************* */ int main (int argc, char *argv []) { int percent ; int ring, leg ; // Always initialise wiringPi: // Use the Sys method if you don't need to run as root wiringPiSetupSys () ; // Initialise the piGlow devLib piGlowSetup (FALSE) ; if (argc == 1) failUsage () ; if ((argc == 2) && (strcasecmp (argv [1], "off") == 0)) { for (leg = 0 ; leg < 3 ; ++leg) piGlowLeg (leg, 0) ; return 0 ; } if (argc == 3) { percent = getPercent (argv [2]) ; /**/ if (strcasecmp (argv [1], "red") == 0) piGlowRing (PIGLOW_RED, percent) ; else if (strcasecmp (argv [1], "yellow") == 0) piGlowRing (PIGLOW_YELLOW, percent) ; else if (strcasecmp (argv [1], "orange") == 0) piGlowRing (PIGLOW_ORANGE, percent) ; else if (strcasecmp (argv [1], "green") == 0) piGlowRing (PIGLOW_GREEN, percent) ; else if (strcasecmp (argv [1], "blue") == 0) piGlowRing (PIGLOW_BLUE, percent) ; else if (strcasecmp (argv [1], "white") == 0) piGlowRing (PIGLOW_WHITE, percent) ; else if (strcasecmp (argv [1], "all") == 0) for (ring = 0 ; ring < 6 ; ++ring) piGlowRing (ring, percent) ; else { fprintf (stderr, "piglow: invalid colour\n") ; exit (EXIT_FAILURE) ; } return 0 ; } if (argc == 4) { /**/ if (strcasecmp (argv [1], "leg") == 0) { leg = atoi (argv [2]) ; if ((leg < 0) || (leg > 2)) { fprintf (stderr, "piglow: leg value out of range\n") ; exit (EXIT_FAILURE) ; } percent = getPercent (argv [3]) ; piGlowLeg (leg, percent) ; } else if (strcasecmp (argv [1], "ring") == 0) { ring = atoi (argv [2]) ; if ((ring < 0) || (ring > 5)) { fprintf (stderr, "piglow: ring value out of range\n") ; exit (EXIT_FAILURE) ; } percent = getPercent (argv [3]) ; piGlowRing (ring, percent) ; } return 0 ; } if (argc == 5) { if (strcasecmp (argv [1], "led") != 0) failUsage () ; leg = atoi (argv [2]) ; if ((leg < 0) || (leg > 2)) { fprintf (stderr, "piglow: leg value out of range\n") ; exit (EXIT_FAILURE) ; } ring = atoi (argv [3]) ; if ((ring < 0) || (ring > 5)) { fprintf (stderr, "piglow: ring value out of range\n") ; exit (EXIT_FAILURE) ; } percent = getPercent (argv [4]) ; piGlow1 (leg, ring, percent) ; return 0 ; } failUsage () ; return 0 ; } wiringPi/examples/PiGlow/Makefile0000644000000000000000000000410012457032564016026 0ustar rootroot# # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # https://projects.drogon.net/wiring-pi # # Copyright (c) 2012-2013 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# #DEBUG = -g -O0 DEBUG = -O3 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm # Should not alter anything below this line ############################################################################### SRC = piGlow0.c piGlow1.c piglow.c OBJ = $(SRC:.c=.o) BINS = $(SRC:.c=) all: $(BINS) piGlow0: piGlow0.o @echo [link] @$(CC) -o $@ piGlow0.o $(LDFLAGS) $(LDLIBS) piGlow1: piGlow1.o @echo [link] @$(CC) -o $@ piGlow1.o $(LDFLAGS) $(LDLIBS) piglow: piglow.o @echo [link] @$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) .c.o: @echo [CC] $< @$(CC) -c $(CFLAGS) $< -o $@ clean: @echo "[Clean]" @rm -f $(OBJ) *~ core tags $(BINS) tags: $(SRC) @echo [ctags] @ctags $(SRC) install: piglow @echo Installing piglow into /usr/local/bin @cp -a piglow /usr/local/bin/piglow @chmod 755 /usr/local/bin/piglow @echo Done. Remember to load the I2C drivers! depend: makedepend -Y $(SRC) # DO NOT DELETE wiringPi/examples/okLed.c0000644000000000000000000000420512457032564014375 0ustar rootroot/* * okLed.c: * Make the OK LED on the Pi Pulsate... * * Originally posted to the Raspberry Pi forums: * http://www.raspberrypi.org/phpBB3/viewtopic.php?p=162581#p162581 * * Compile this and store it somewhere, then kick it off at boot time * e.g. by putting it in /etc/rc.local and running it in the * background & * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include // The OK/Act LED is connected to BCM_GPIO pin 16 #define OK_LED 16 int main () { int fd, i ; wiringPiSetupGpio () ; // Change the trigger on the OK/Act LED to "none" if ((fd = open ("/sys/class/leds/led0/trigger", O_RDWR)) < 0) { fprintf (stderr, "Unable to change LED trigger: %s\n", strerror (errno)) ; return 1 ; } write (fd, "none\n", 5) ; close (fd) ; softPwmCreate (OK_LED, 0, 100) ; for (;;) { for (i = 0 ; i <= 100 ; ++i) { softPwmWrite (OK_LED, i) ; delay (10) ; } delay (50) ; for (i = 100 ; i >= 0 ; --i) { softPwmWrite (OK_LED, i) ; delay (10) ; } delay (10) ; } return 0 ; } wiringPi/examples/isr-osc.c0000644000000000000000000000633112457032564014720 0ustar rootroot/* * isr-osc.c: * Wait for Interrupt test program - ISR method - interrupt oscillator * * How to test: * * IMPORTANT: To run this test we connect 2 GPIO pins together, but * before we do that YOU must make sure that they are both setup * the right way. If they are set to outputs and one is high and one low, * then you connect the wire, you'll create a short and that won't be good. * * Before making the connection, type: * gpio mode 0 output * gpio write 0 0 * gpio mode 1 input * then you can connect them together. * * Run the program, then: * gpio write 0 1 * gpio write 0 0 * * at which point it will trigger an interrupt and the program will * then do the up/down toggling for itself and run at full speed, and * it will report the number of interrupts recieved every second. * * Copyright (c) 2013 Gordon Henderson. projects@drogon.net *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include // What GPIO input are we using? // This is a wiringPi pin number #define OUT_PIN 0 #define IN_PIN 1 // globalCounter: // Global variable to count interrupts // Should be declared volatile to make sure the compiler doesn't cache it. static volatile int globalCounter = 0 ; /* * myInterrupt: ********************************************************************************* */ void myInterrupt (void) { digitalWrite (OUT_PIN, 1) ; ++globalCounter ; digitalWrite (OUT_PIN, 0) ; } /* ********************************************************************************* * main ********************************************************************************* */ int main (void) { int myCounter = 0 ; int lastCounter = 0 ; if (wiringPiSetup () < 0) { fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ; return 1 ; } pinMode (OUT_PIN, OUTPUT) ; pinMode (IN_PIN, INPUT) ; if (wiringPiISR (IN_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) { fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ; return 1 ; } for (;;) { printf ("Waiting ... ") ; fflush (stdout) ; while (myCounter == globalCounter) delay (1000) ; printf (" Done. counter: %6d: %6d\n", globalCounter, myCounter - lastCounter) ; lastCounter = myCounter ; myCounter = globalCounter ; } return 0 ; } wiringPi/examples/blink6drcs.c0000644000000000000000000000555212457032564015406 0ustar rootroot/* * blink6drcs.c: * Simple sequence over 6 pins on a remote DRC board. * Aimed at the Gertduino, but it's fairly generic. * This version uses DRC to talk to the ATmega on the Gertduino * * Copyright (c) 2012-2014 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define GERT_BASE 100 static int pinMap [] = { GERT_BASE + 6, GERT_BASE + 5, GERT_BASE + 3, GERT_BASE + 10, GERT_BASE + 9, GERT_BASE + 13, } ; // Simple sequencer data // Triplets of LED, On/Off and delay int data [] = { 0, 1, 1, 1, 1, 1, 0, 0, 0, 2, 1, 1, 1, 0, 0, 3, 1, 1, 2, 0, 0, 4, 1, 1, 3, 0, 0, 5, 1, 1, 4, 0, 1, 5, 0, 1, 0, 0, 1, // Extra delay // Back again 5, 1, 1, 4, 1, 1, 5, 0, 0, 3, 1, 1, 4, 0, 0, 2, 1, 1, 3, 0, 0, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, // Extra delay 0, 9, 0, // End marker } ; int main (void) { int pin ; int dataPtr ; int l, s, d ; printf ("Raspberry Pi - 6-LED Sequence\n") ; printf ("=============================\n") ; printf ("\n") ; printf (" Use the 2 buttons to temporarily speed up the sequence\n") ; wiringPiSetupSys () ; // Not using the Pi's GPIO here drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; for (pin = 0 ; pin < 6 ; ++pin) pinMode (pinMap [pin], OUTPUT) ; pinMode (GERT_BASE + 16, INPUT) ; // Buttons pinMode (GERT_BASE + 17, INPUT) ; pullUpDnControl (GERT_BASE + 16, PUD_UP) ; pullUpDnControl (GERT_BASE + 17, PUD_UP) ; dataPtr = 0 ; for (;;) { l = data [dataPtr++] ; // LED s = data [dataPtr++] ; // State d = data [dataPtr++] ; // Duration (10ths) if (s == 9) // 9 -> End Marker { dataPtr = 0 ; continue ; } digitalWrite (pinMap [l], s) ; delay (d * digitalRead (GERT_BASE + 16) * 15 + digitalRead (GERT_BASE + 17) * 20) ; } return 0 ; } wiringPi/examples/blink.c0000644000000000000000000000266312457032564014444 0ustar rootroot/* * blink.c: * Standard "blink" program in wiringPi. Blinks an LED connected * to the first GPIO pin. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include // LED Pin - wiringPi pin 0 is BCM_GPIO 17. #define LED 0 int main (void) { printf ("Raspberry Pi blink\n") ; wiringPiSetup () ; pinMode (LED, OUTPUT) ; for (;;) { digitalWrite (LED, HIGH) ; // On delay (500) ; // mS digitalWrite (LED, LOW) ; // Off delay (500) ; } return 0 ; } wiringPi/examples/rht03.c0000644000000000000000000000346312457032564014304 0ustar rootroot/* * rht03.c: * Driver for the MaxDetect series sensors * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define RHT03_PIN 0 /* *********************************************************************** * The main program *********************************************************************** */ int main (void) { int temp, rh ; int newTemp, newRh ; temp = rh = newTemp = newRh = 0 ; wiringPiSetup () ; piHiPri (55) ; for (;;) { delay (100) ; if (!readRHT03 (RHT03_PIN, &newTemp, &newRh)) continue ; if ((temp != newTemp) || (rh != newRh)) { temp = newTemp ; rh = newRh ; if ((temp & 0x8000) != 0) // Negative { temp &= 0x7FFF ; temp = -temp ; } printf ("Temp: %5.1f, RH: %5.1f%%\n", temp / 10.0, rh / 10.0) ; } } return 0 ; } wiringPi/examples/lowPower.c0000644000000000000000000000367512457032564015167 0ustar rootroot/* * lowPower.c: * Check the Pi's LOW-Power signal. * * This is a demonstration program that could be turned into some sort * of logger via e.g. syslog - however it's also probably something * that might be better handled by a future kernel - who knows. * * Copyright (c) 2014 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #define LOW_POWER 35 /* * lowPower: * This is an ISR that waits for the low-power signal going low and * prints the result. ********************************************************************************* */ void lowPower (void) { time_t t ; time (&t) ; printf ("%s: LOW POWER DETECTED\n", ctime (&t)) ; } /* ********************************************************************************* * main ********************************************************************************* */ int main (void) { wiringPiSetupGpio () ; // GPIO mode as it's an internal pin wiringPiISR (LOW_POWER, INT_EDGE_FALLING, &lowPower) ; for (;;) delay (1000) ; return 0 ; } wiringPi/examples/softPwm.c0000644000000000000000000000426512457032564015004 0ustar rootroot/* * softPwm.c: * Test of the software PWM driver. Needs 8 LEDs connected * to the Pi - e.g. Ladder board. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include #define RANGE 100 #define NUM_LEDS 8 int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7 } ; int values [NUM_LEDS] = { 0, 25, 50, 75, 100, 75, 50, 25 } ; int main () { int i, j ; char buf [80] ; wiringPiSetup () ; for (i = 0 ; i < NUM_LEDS ; ++i) { softPwmCreate (ledMap [i], 0, RANGE) ; printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ; } fgets (buf, 80, stdin) ; // Bring all up one by one: for (i = 0 ; i < NUM_LEDS ; ++i) for (j = 0 ; j <= 100 ; ++j) { softPwmWrite (ledMap [i], j) ; delay (10) ; } fgets (buf, 80, stdin) ; // All Down for (i = 100 ; i > 0 ; --i) { for (j = 0 ; j < NUM_LEDS ; ++j) softPwmWrite (ledMap [j], i) ; delay (10) ; } fgets (buf, 80, stdin) ; for (;;) { for (i = 0 ; i < NUM_LEDS ; ++i) softPwmWrite (ledMap [i], values [i]) ; delay (50) ; i = values [0] ; for (j = 0 ; j < NUM_LEDS - 1 ; ++j) values [j] = values [j + 1] ; values [NUM_LEDS - 1] = i ; } } wiringPi/examples/blink8.c0000644000000000000000000000321112457032564014522 0ustar rootroot/* * blink8.c: * Simple sequence over the first 8 GPIO pins - LEDs * Aimed at the Gertboard, but it's fairly generic. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include int main (void) { int i, led ; printf ("Raspberry Pi - 8-LED Sequencer\n") ; printf ("==============================\n") ; printf ("\n") ; printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ; wiringPiSetup () ; for (i = 0 ; i < 8 ; ++i) pinMode (i, OUTPUT) ; for (;;) { for (led = 0 ; led < 8 ; ++led) { digitalWrite (led, 1) ; delay (100) ; } for (led = 0 ; led < 8 ; ++led) { digitalWrite (led, 0) ; delay (100) ; } } } wiringPi/examples/blink12.c0000644000000000000000000000507612457032564014610 0ustar rootroot/* * blink12.c: * Simple sequence over the first 12 GPIO pins - LEDs * Aimed at the Gertboard, but it's fairly generic. * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include // Simple sequencer data // Triplets of LED, On/Off and delay int data [] = { 0, 1, 1, 1, 1, 1, 0, 0, 0, 2, 1, 1, 1, 0, 0, 3, 1, 1, 2, 0, 0, 4, 1, 1, 3, 0, 0, 5, 1, 1, 4, 0, 0, 6, 1, 1, 5, 0, 0, 7, 1, 1, 6, 0, 0, 11, 1, 1, 7, 0, 0, 10, 1, 1, 11, 0, 0, 13, 1, 1, 10, 0, 0, 12, 1, 1, 13, 0, 1, 12, 0, 1, 0, 0, 1, // Extra delay // Back again 12, 1, 1, 13, 1, 1, 12, 0, 0, 10, 1, 1, 13, 0, 0, 11, 1, 1, 10, 0, 0, 7, 1, 1, 11, 0, 0, 6, 1, 1, 7, 0, 0, 5, 1, 1, 6, 0, 0, 4, 1, 1, 5, 0, 0, 3, 1, 1, 4, 0, 0, 2, 1, 1, 3, 0, 0, 1, 1, 1, 2, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, // Extra delay 0, 9, 0, // End marker } ; int main (void) { int pin ; int dataPtr ; int l, s, d ; printf ("Raspberry Pi - 12-LED Sequence\n") ; printf ("==============================\n") ; printf ("\n") ; printf ("Connect LEDs up to the first 8 GPIO pins, then pins 11, 10, 13, 12 in\n") ; printf (" that order, then sit back and watch the show!\n") ; wiringPiSetup () ; for (pin = 0 ; pin < 14 ; ++pin) pinMode (pin, OUTPUT) ; dataPtr = 0 ; for (;;) { l = data [dataPtr++] ; // LED s = data [dataPtr++] ; // State d = data [dataPtr++] ; // Duration (10ths) if (s == 9) // 9 -> End Marker { dataPtr = 0 ; continue ; } digitalWrite (l, s) ; delay (d * 100) ; } return 0 ; } wiringPi/examples/Makefile0000644000000000000000000000732312457032564014637 0ustar rootroot# # Makefile: # wiringPi - Wiring Compatable library for the Raspberry Pi # https://projects.drogon.net/wiring-pi # # Copyright (c) 2012 Gordon Henderson ################################################################################# # This file is part of wiringPi: # Wiring Compatable library for the Raspberry Pi # # wiringPi is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # wiringPi 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with wiringPi. If not, see . ################################################################################# #DEBUG = -g -O0 DEBUG = -O3 CC = gcc INCLUDE = -I/usr/local/include CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe LDFLAGS = -L/usr/local/lib LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm # Should not alter anything below this line ############################################################################### SRC = blink.c blink8.c blink12.c \ blink12drcs.c \ pwm.c \ speed.c wfi.c isr.c isr-osc.c \ lcd.c lcd-adafruit.c clock.c \ nes.c \ softPwm.c softTone.c \ delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ lowPower.c \ rht03.c piglow.c OBJ = $(SRC:.c=.o) BINS = $(SRC:.c=) all: @cat README.TXT @echo " $(BINS)" | fmt @echo "" really-all: $(BINS) blink: blink.o @echo [link] @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) blink8: blink8.o @echo [link] @$(CC) -o $@ blink8.o $(LDFLAGS) $(LDLIBS) blink12drcs: blink12drcs.o @echo [link] @$(CC) -o $@ blink12drcs.o $(LDFLAGS) $(LDLIBS) blink12: blink12.o @echo [link] @$(CC) -o $@ blink12.o $(LDFLAGS) $(LDLIBS) speed: speed.o @echo [link] @$(CC) -o $@ speed.o $(LDFLAGS) $(LDLIBS) lcd: lcd.o @echo [link] @$(CC) -o $@ lcd.o $(LDFLAGS) $(LDLIBS) lcd-adafruit: lcd-adafruit.o @echo [link] @$(CC) -o $@ lcd-adafruit.o $(LDFLAGS) $(LDLIBS) clock: clock.o @echo [link] @$(CC) -o $@ clock.o $(LDFLAGS) $(LDLIBS) wfi: wfi.o @echo [link] @$(CC) -o $@ wfi.o $(LDFLAGS) $(LDLIBS) isr: isr.o @echo [link] @$(CC) -o $@ isr.o $(LDFLAGS) $(LDLIBS) isr-osc: isr-osc.o @echo [link] @$(CC) -o $@ isr-osc.o $(LDFLAGS) $(LDLIBS) nes: nes.o @echo [link] @$(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) rht03: rht03.o @echo [link] @$(CC) -o $@ rht03.o $(LDFLAGS) $(LDLIBS) pwm: pwm.o @echo [link] @$(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS) softPwm: softPwm.o @echo [link] @$(CC) -o $@ softPwm.o $(LDFLAGS) $(LDLIBS) softTone: softTone.o @echo [link] @$(CC) -o $@ softTone.o $(LDFLAGS) $(LDLIBS) delayTest: delayTest.o @echo [link] @$(CC) -o $@ delayTest.o $(LDFLAGS) $(LDLIBS) serialRead: serialRead.o @echo [link] @$(CC) -o $@ serialRead.o $(LDFLAGS) $(LDLIBS) serialTest: serialTest.o @echo [link] @$(CC) -o $@ serialTest.o $(LDFLAGS) $(LDLIBS) okLed: okLed.o @echo [link] @$(CC) -o $@ okLed.o $(LDFLAGS) $(LDLIBS) tone: tone.o @echo [link] @$(CC) -o $@ tone.o $(LDFLAGS) $(LDLIBS) ds1302: ds1302.o @echo [link] @$(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) piglow: piglow.o @echo [link] @$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) .c.o: @echo [CC] $< @$(CC) -c $(CFLAGS) $< -o $@ clean: @echo "[Clean]" @rm -f $(OBJ) *~ core tags $(BINS) tags: $(SRC) @echo [ctags] @ctags $(SRC) depend: makedepend -Y $(SRC) # DO NOT DELETE wiringPi/examples/spiSpeed.c0000644000000000000000000000651112457032564015115 0ustar rootroot/* * spiSpeed.c: * Code to measure the SPI speed/latency. * Copyright (c) 2014 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include #include //#include //#include //#include #include #include #define TRUE (1==1) #define FALSE (!TRUE) #define SPI_CHAN 0 #define NUM_TIMES 100 #define MAX_SIZE (1024*1024) static int myFd ; void spiSetup (int speed) { if ((myFd = wiringPiSPISetup (SPI_CHAN, speed)) < 0) { fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ; exit (EXIT_FAILURE) ; } } int main (void) { int speed, times, size ; unsigned int start, end ; int spiFail ; unsigned char *myData ; double timePerTransaction, perfectTimePerTransaction, dataSpeed ; if ((myData = malloc (MAX_SIZE)) == NULL) { fprintf (stderr, "Unable to allocate buffer: %s\n", strerror (errno)) ; exit (EXIT_FAILURE) ; } wiringPiSetup () ; for (speed = 1 ; speed <= 32 ; speed *= 2) { printf ("+-------+--------+----------+----------+-----------+------------+\n") ; printf ("| MHz | Size | mS/Trans | TpS | Mb/Sec | Latency mS |\n") ; printf ("+-------+--------+----------+----------+-----------+------------+\n") ; spiFail = FALSE ; spiSetup (speed * 1000000) ; for (size = 1 ; size <= MAX_SIZE ; size *= 2) { printf ("| %5d | %6d ", speed, size) ; start = millis () ; for (times = 0 ; times < NUM_TIMES ; ++times) if (wiringPiSPIDataRW (SPI_CHAN, myData, size) == -1) { printf ("SPI failure: %s\n", strerror (errno)) ; spiFail = TRUE ; break ; } end = millis () ; if (spiFail) break ; timePerTransaction = ((double)(end - start) / (double)NUM_TIMES) / 1000.0 ; dataSpeed = (double)(size * 8) / (1024.0 * 1024.0) / timePerTransaction ; perfectTimePerTransaction = ((double)(size * 8)) / ((double)(speed * 1000000)) ; printf ("| %8.3f ", timePerTransaction * 1000.0) ; printf ("| %8.1f ", 1.0 / timePerTransaction) ; printf ("| %9.5f ", dataSpeed) ; printf ("| %8.5f ", (timePerTransaction - perfectTimePerTransaction) * 1000.0) ; printf ("|\n") ; } close (myFd) ; printf ("+-------+--------+----------+----------+-----------+------------+\n") ; printf ("\n") ; } return 0 ; } wiringPi/examples/serialTest.c0000644000000000000000000000371312457032564015461 0ustar rootroot/* * serialTest.c: * Very simple program to test the serial port. Expects * the port to be looped back to itself * * Copyright (c) 2012-2013 Gordon Henderson. *********************************************************************** * This file is part of wiringPi: * https://projects.drogon.net/raspberry-pi/wiringpi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * wiringPi 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with wiringPi. If not, see . *********************************************************************** */ #include #include #include #include #include int main () { int fd ; int count ; unsigned int nextTime ; if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) { fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; return 1 ; } if (wiringPiSetup () == -1) { fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; return 1 ; } nextTime = millis () + 300 ; for (count = 0 ; count < 256 ; ) { if (millis () > nextTime) { printf ("\nOut: %3d: ", count) ; fflush (stdout) ; serialPutchar (fd, count) ; nextTime += 300 ; ++count ; } delay (3) ; while (serialDataAvail (fd)) { printf (" -> %3d", serialGetchar (fd)) ; fflush (stdout) ; } } printf ("\n") ; return 0 ; }