n@4@@@4@defl$apnd@Helvetica 2FLucida Grande@dI0W(?@@@)defl@7@ s  Lucida GrandeS$h ^ _

SS11LB Calibration

For AFT27 3 Liter Cal. Syringe


Use this to perform a user calibration of an SS11LB airflow transducer. An MP unit, SS11LB, and FLOWCAL (AFT27 syringe + AFT11D coupler) are required. User calibration settings are stored within each SS11LB and are used automatically by Lessons, PRO Lessons and the SS11LB analog channel preset.


Connect the SS11LB to CH1. The SS11LB must be warmed up for at least 10 minutes prior to calibration. Keep the SS11LB connected to the MP unit and the MP unit powered on during the warm-up period.


Press "Calibrate" to begin the SS11LB user calibration procedure.


Press "Restore Factory Calibration" to remove any user calibration and return to the factory calibration values.


Press "Info" to see the current calibration settings stored in the SS11LB.

ޭ=L L 1 5 0 0 -1 0 1 -1 0 2 -1 0 3 -1 0 4 -1  w3 5deflzusr1xusr2cusr3vusr4`usr5ausr6busr7dusr8eusr9gdeflodeflݻUsnPmNXLessons OnOpenFile //////////////////// // // OnOpenFile // //////////////////// // Note that in BSL 4.1.1 if we are in tabbed mode this callback is invoked // synchronous with open and the window may not be properly created yet. // Instead we handle operations on our first activation. N# = 0 // flag holding whether we have added our buttons to the window End OnActivateGraph //////////////////// // // OnActivateGraph // //////////////////// // Add in our SS11LB calibration buttons on our first activation if N# = 0 CreateButton "Calibrate SS11LB", "Calibrate" CreateButton "Restore Factory Calibration", "RestoreFactory" CreateButton "Info", "ShowFactors" N# = 1 // record the UUID of the graph that is performing the calibration DataViews GetRootView U@ Y# = 0 // no calibration in progress endif End Calibrate //////////////////// // // Calibrate // //////////////////// Call "CheckSS11LB" Call "ExtractResources" // // Prompt to connect the syringe. We can't detect this unfortunately. // Prompt "Connect the AFT27+AFT11D to the SS11LB. Place the 3 Liter syringe on a flat, sturdy surface.", "Continue" // remove any data in the graph from a previous calibration run Edit SelectAll Edit ClearAll // set up only channel 1 with our airflow transducer settings MP30 Set Channel AllOff //turn OFF all channels to reset MP30 Set Channel 1, Analog, Enable, Plot, Off //Channel 1(Airflow) enabled MP30 SyncPlotOnAcquire // BSL-286 MP30 Set Gain 1, 10 MP30 Set Offset 1, 0 MP30 Set HardwareFilter 1, DC, 0.5HZHP, 1KHZLP, Off // e = 60 //just in case the GetPrefNumber does not work GetPrefNumber "MP100" "LineFrequency" e //get the line frequency (saved when BSL was loaded) now. Get MPModelNum A if A < 45 //for all MP3X devices, we cannot realize a 10 Hz H.P. IIR filter MP30 Set DSPFilter 1, 1, Lowpass, 66.5, .5 //Macy 35 Hz Low Pass MP30 Set DSPFilter 1, 2, Lowpass, 38.5, 1 MP30 Set DSPFilter 1, 3, BandStop, e, 1 //set the line freq. notch filter endif if A = 45 //for MP45 10 Hz IIR is done by application in Floating Point. MP30 Set DSPFilter 1, 1, Lowpass, 10, .707 MP30 Set DSPFilter 1, 2, BandStop, e, 1 //set the line freq. notch filter MP30 Set DSPFilter 1, 3, Off, 38.5, 1 //freq and Q are ignored endif // //****Sample rate and storage changes**** // MP30 Set Rate 1000 //rate to 100 s/s MP30 Set Length 1000*180 //L set in SetMaxLength MP30 Set Storage Memory Off Off //One Shot Mode // // zero offset calibration. Turn off the analog channel processor, set // scaling to uniform, and perform two readings // MP30 Set Offset 1, 0 MP30 Set AnalogChanProcName 0, "" MP30 Set Scaling Analog 1, -1, -1, 1, 1 Prompt "Make sure there is no airflow through the SS11LB and press 'Continue.'", "Continue" // note we do two readings here as that is what is performed by Lessons. MP30 Set m, Analog, 1 Wait 100 MP30 Set m, Analog, 1 m = -m MP30 Set Offset 1, m MP30 Set n, Analog, 1 Wait 100 MP30 Set n, Analog, 1 m = m - n MP30 Set Offset 1, m // set the calibration factors for channel 1 and enable the hardware processor // change to ATP. BSL-1792 MP30 Set Scaling Analog 1, 0, 0, 10, .0285 MP30 Set AnalogChanProcName 0, "SS11LBSignalProcessor" // Now prompt the user to perform the calibration. Prompt "Pull the plunger of the AFT27 fully out so it extends from the syringe.", "Continue" Prompt "After pressing 'Start Calibration', fully cycle the plunger in and out five times. When finished, stop the acquisition.", "Start Calibration" Y# = 1 MP30 StartAcq CreateButton "Stop Calibration", "StopCal" End StopCal //////////////////// // // StopCal // //////////////////// // just a quick helper function to put another button in the toolbar to stop // the acquisition MP30 StopAcq RemoveButton "Stop Calibration" End OnEndAcquisition //////////////////// // // OnEndAcquisition // //////////////////// // if we were running a calibration and the user has stopped the acquisition // check the calibration factors if Y# = 1 // also check the UUID if, for some reason, this callback has been left // lingering around or if multiple hardware was in use DataViews GetRootView Z$ EqualString Z$, U@, z if z = true // compute correction factors based on positive going and negative // going waveforms. This correction algorithm is taken from the // syringe step of Lesson 12. // //**** Subtract the mean found when no air was going through transducer // // //**** Split the waveform in two. Signal above 0 and signal below 0 // Edit SelectAll Select Wave 1 Get MPModelNum A Transform Progress Off // [ed] 7/4/10 Suppress progress sheet if A <> 45 // mimic calc channel from L12 by applying 10Hz LP filter. Transform IIRFilter LowPass 10, 0.707 endif Edit SelectAll Edit Duplicate //this creates a new channel 2 Select Wave 2 Edit Duplicate //this creates a new channel 3 Edit SelectAll // //Since the airflow transducer has different linearity for positive //signals vs. negative signals (cycles), we will calculate a correction //factor for each polarity. // Select Wave 2 Transform Function Limit -10, 0 //only keep negative data Edit SelectAll Select Wave 3 Transform Function Limit 0, 10 //only keep positive data Edit SelectAll Select Wave 2 //point to negative data Update Mmts //must update before we can read Transform Progress On // //**** Calculate Y#, the Negative cycle correction factor // y = Integral //add up the area of the negative data s = 1 If y < 0 //prevent division by 0 // change to ATP. BSL-1792 y = -(15 * s)/y //Y# is the factor needed to make -15 Liters (5 x -3 L) endif Select Wave 3 //point to positive data Update Mmts // //**** Calculate X#, the Positive cycle correction factor // x = Integral If x > 0 x = (15 * s)/x //X# is the factor needed to make 15 Liters (5 x 3 L) endif // eliminate the halves of the signal Select Wave 2 Edit Remove Select Wave 3 //intermediate airflow signal above 0 Edit Remove Set Channel 1, Units, "L/sec" Update all //redraw the whole window // check if we have more than a 20% deviation from the factory calibrated // values a = A# * x if less(0.2, ( abs(a - D#) / D# ) ) = true Prompt "The positive correction factor differs from the factory setting by more than 20%. Use it?", "Use User Calibration", "Cancel", "", z if z = 2 Prompt "Please reperform the calibration.", "OK" Halt endif endif b = B# * y if less(0.2, ( abs(b - E#) / E# ) ) = true Prompt "The negative correction factor differs from the factory setting by more than 20%. Use it?", "Use User Calibration", "Cancel", "", z if z = 2 Prompt "Please reperform the calibration.", "OK" Halt endif endif // store that we have a valid custom calibration and save it to the I2C A# = a B# = b C# = 1 Call "ProgramISID" Prompt "User calibration has been successfully stored in the SS11LB.", "OK" // mark calibration as finished Y# = 0 endif endif End ShowFactors //////////////////// // // ShowFactors // //////////////////// // Display a dialog with the current calibration factors to the user and // factory vs. user calibration state. Call "CheckSS11LB" Call "ExtractResources" Z$ = "SS11LB Serial #: " + J@ Z$ = Z$ + "\n\n" if C# = 0 Z$ = Z$ + "Calibration type: Factory\n\n" Z$ = Z$ + "Positive factor: " Z$ = Z$ + STR$(A#, 8) Z$ = Z$ + "\nNegative factor: " Z$ = Z$ + STR$(B#, 8) else Z$ = Z$ + "Calibration type: User\n\n" Z$ = Z$ + "Positive factor: " Z$ = Z$ + STR$(A#, 8) Z$ = Z$ + "\nNegative factor: " Z$ = Z$ + STR$(B#, 8) Z$ = Z$ + "\n\nFactory positive factor: " Z$ = Z$ + STR$(D#, 8) Z$ = Z$ + "\nFactory negative factor: " Z$ = Z$ + STR$(E#, 8) endif Prompt Z$, "OK" End RestoreFactory //////////////////// // // RestoreFactory // //////////////////// // Restore the factory calibration values of an SS11LB. On user recalibration // the factory coefficients are stored in string resources ID 25 and 26. // If these do not exist, the unit is already factory calibrated. Call "CheckSS11LB" Call "ExtractResources" if C# = 0 Prompt "The SS11LB is already using factory calibration.", "OK" Halt endif if C# = 1 Prompt "This will erase the user calibration and revert back to factory calibration. Are you sure?", "Restore Factory Settings", "Cancel@", "", z if z = 2 Halt endif // restore the factory calibration into the values and program the EEPROM A# = D# B# = E# C# = 0 // will omit the extra resources from the table Call "ProgramISID" Prompt "The SS11LB factory calibration has been restored successfully.", "OK" Halt endif End CheckSS11LB //////////////////// // // CheckSS11LB // //////////////////// // Check that an SS11LB is connected on channel 1 MP30 ISID Clear MP30 ISID Read 1, a if a <> 0 Prompt "SS11LB not detected on channel 1. Verify the SS11LB is connected to channel 1 and try again.", "OK" Halt endif MP30 ISID GET NumberOfResources n //Look at how many resources there are if n <= 0 //we must have at least one or we cant get the name Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif // //****************************************************************** // Find resource #1 (device name) This is a little complicated because // the resources may not lie in numerical order. // n = n - 1 //decrement the number of resources counter i = 0 //reset the loop counter // ResourceIDLoop: // MP30 ISID GET ResourceID i, a if a = 1 //IF resource ID = 1 MP30 ISID GET String 1, X@, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt goto ExitDevName //exit now endif //if no error, X@ will contain the device name goto ExitDevName //so exit now endif i = i + 1 //if we have not yet found the resource #1 if i <= n //increment the loop counter goto ResourceIDLoop endif //****************************************************************** // ExitDevName: // check the device name against the SS11LB EqualString X@, "SS11LB", z if z = false Prompt "SS11LB not detected on channel 1. Verify the SS11LB is connected to channel 1 and try again.", "OK" Halt endif End ExtractResources //////////////////// // // ExtractResources // //////////////////// // Given a programmed SS11LB, extract out the resources from the current // EEPROM memory. As we can't replace entries within the table, we need // to read any custom resources (e.g. user calibration constants, test // engineer, serial number, etc.) so we can reprogram the table properly // after any modifications are applied. // // This will extract the following resources: // // J@ = serial number // I@ = device name (string res. 1) // L@ = user ID (string res. 2) // C@ = factory calibration date (string res. 3) // P@ = production test engineer (string res. 4) // A# = positive correction factor (hex string res. 21) // B# = negative correction factor (hex string res. 22) // C# = 0 if factory calibration is present in table, 1 if unit has never been customized // D# = postive factory correction factor (hex string res. 26) // E# = negative factory correction factor (hex string res. 27) // F# = factory cal temperature (hex string res. 23) // G# = factory cal humidity (hex string res. 24) // H# = factory cal pressure (hex string res. 25) // Check that an SS11LB is connected on channel 1 MP30 ISID Clear MP30 ISID Read 1, a if a <> 0 Prompt "SS11LB not detected on channel 1. Verify the SS11LB is connected to channel 1 and try again.", "OK" Halt endif MP30 ISID GET NumberOfResources n //Look at how many resources there are if n <= 0 //we must have at least one or we cant get the name Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif // read out the serial number MP30 ISID Get SerialNumber J@ C# = 0 // assume no customization until we see the additional factory default resources // Now extract out all of the customized resources from the table n = n - 1 //decrement the number of resources counter i = 0 //reset the loop counter // ResourceIDLoop: // MP30 ISID GET ResourceID i, a if a = 1 // device name/ID string MP30 ISID GET String 1, I@, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif endif if a = 2 // user ID string MP30 ISID GET String 2, L@, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif endif if a = 3 // factory calibration date MP30 ISID GET String 3, C@, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif endif if a = 4 // production test engineer MP30 ISID GET String 4, P@, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif endif if a = 21 // positive multiplicative correction factor MP30 ISID GET String 21, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, A# endif if a = 22 // negative multiplicative correction factor MP30 ISID GET String 22, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, B# endif if a = 23 // factory cal temperature measurement MP30 ISID GET String 23, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, F# endif if a = 24 // factory cal humidity MP30 ISID GET String 24, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, G# endif if a = 25 // factory cal barometric pressure MP30 ISID GET String 25, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, H# endif if a = 26 // user has calibrated the unit, stores the factory calibration multiplicative factor C# = 1 MP30 ISID GET String 26, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, D# endif if a = 27 // user has calibrated the unit, stores the factory calibration multiplicative factor C# = 1 MP30 ISID GET String 27, Z$, a //get the device ID string if a <> 0 //if there was an error reading the string Prompt "SS11LB is corrupted. Please contact BIOPAC support.", "OK" Halt endif Base64ToDbl Z$, E# endif i = i + 1 //if we have not yet found the resource #1 if i <= n //increment the loop counter goto ResourceIDLoop endif // if we are factory calibrated, set the two factory factors to match the main // correction factors if C# = 0 D# = A# E# = B# endif End ProgramISID //////////////////// // // ProgramISID // //////////////////// // Reprogram the ISID of the SS11LB with the appropriate default settings and // any retained or customized values in the local macro variables (see // ExtractResources for details). // // This should only be executed after a successful call to ExtractResources. MP30 ISID CLEAR MP30 ISID SET DeviceID 11 MP30 ISID SET RevisionMaj 3 MP30 ISID SET RevisionMin 0 MP30 ISID SET SerialNumber J@ MP30 ISID ADD String 1, I@, 0 MP30 ISID ADD String 2, L@, 0 MP30 ISID ADD String 3, C@, 11 MP30 ISID ADD String 4, P@, 40 ; MP30 ISID ADD Integer 5, 8192 ; MP30 ISID ADD SensorDescription a if a <> 0 Prompt "Internal application error. Contact BIOPAC support.", "OK" Halt endif ; MP30 ISID SET SensorDescription 1, Category, "Airflow" MP30 ISID SET SensorDescription 1, Units, "liters/sec" MP30 ISID SET SensorDescription 1, RangeLow, -10 MP30 ISID SET SensorDescription 1, RangeHigh, 10 MP30 ISID SET SensorDescription 1, MvRangeLow, -1000 MP30 ISID SET SensorDescription 1, MvRangeHigh, 1000 MP30 ISID SET SensorDescription 1, Maximum, 0 MP30 ISID SET SensorDescription 1, GainAttenuation, 0 MP30 ISID SET SensorDescription 1, BandWidthLow, 0 MP30 ISID SET SensorDescription 1, BandWidthHigh, 36 MP30 ISID SET SensorDescription 1, ResponseTime, 0 MP30 ISID SET SensorDescription 1, TempRangeLow, -40 MP30 ISID SET SensorDescription 1, TempRangeHigh, 85 MP30 ISID SET SensorDescription 1, InitOffset, 0 MP30 ISID SET SensorDescription 1, OffsetOverTemp, 0 MP30 ISID SET SensorDescription 1, Linearity, 0 MP30 ISID SET SensorDescription 1, Accuracy, 5 MP30 ISID SET SensorDescription 1, CalibrationCode, 4 MP30 ISID SET SensorDescription 1, CalScalingValue1, 0 MP30 ISID SET SensorDescription 1, CalScalingValue2, 0 ; MP30 ISID SET Preset 1, Name, "SS11LB" MP30 ISID SET Preset 1, TransducerName, "SS11LB" MP30 ISID SET Preset 1, ChannelLabel, "Airflow" MP30 ISID SET Preset 1, Username, "BIOPAC" MP30 ISID SET Preset 1, Userdate, C$ MP30 ISID SET Preset 1, Gain, 100 MP30 ISID SET Preset 1, Offset, 0 MP30 ISID SET Preset 1, InputCoupling, 1 MP30 ISID SET Preset 1, HPFilter, 0 MP30 ISID SET Preset 1, LPFilter, 0 MP30 ISID SET Preset 1, DigitalFilter1Type, 1 MP30 ISID SET Preset 1, DigitalFilter1Freq, 66.5 MP30 ISID SET Preset 1, DigitalFilter1Q, 0.5 MP30 ISID SET Preset 1, DigitalFilter2Type, 1 MP30 ISID SET Preset 1, DigitalFilter2Freq, 38.5 MP30 ISID SET Preset 1, DigitalFilter2Q, 1 MP30 ISID SET Preset 1, DigitalFilter3Type, 5 MP30 ISID SET Preset 1, DigitalFilter3Freq, 60 MP30 ISID SET Preset 1, DigitalFilter3Q, 1 MP30 ISID SET Preset 1, InputValue1, 0 MP30 ISID SET Preset 1, ScaleValue1, 0 MP30 ISID SET Preset 1, InputValue2, 28.5 MP30 ISID SET Preset 1, ScaleValue2, 10 MP30 ISID SET Preset 1, UnitsLabel, "liters/sec" MP30 ISID SET Preset 1, SampleRate, 500 ; // [ed] Now set our default curve fit parameters. These parameters are // for two fifth order polynomials, one fit for positive values, and a // second fit for negative values. The SS11LB has different response for // positive and negative airflows. DblToBase64 0, Z$ MP30 ISID Add String 9, Z$ DblToBase64 1.420119689419690000, Z$ MP30 ISID Add String 10, Z$ DblToBase64 -0.051133813767999400, Z$ MP30 ISID Add String 11, Z$ DblToBase64 0.001863615335729030, Z$ MP30 ISID Add String 12, Z$ DblToBase64 -0.000034617387092297, Z$ MP30 ISID Add String 13, Z$ DblToBase64 0.000000253374925272, Z$ MP30 ISID Add String 14, Z$ DblToBase64 0, Z$ MP30 ISID Add String 15, Z$ DblToBase64 1.311338478178680000, Z$ MP30 ISID Add String 16, Z$ DblToBase64 0.035404522364901100, Z$ MP30 ISID Add String 17, Z$ DblToBase64 0.001063710675877440, Z$ MP30 ISID Add String 18, Z$ DblToBase64 0.000017493966496790, Z$ MP30 ISID Add String 19, Z$ DblToBase64 0.000000111055204298, Z$ MP30 ISID Add String 20, Z$ DblToBase64 A#, Z$ MP30 ISID Add String 21, Z$ DblToBase64 B#, Z$ MP30 ISID Add String 22, Z$ DblToBase64 F#, Z$ MP30 ISID Add String 23, Z$ DblToBase64 G#, Z$ MP30 ISID Add String 24, Z$ DblToBase64 H#, Z$ MP30 ISID Add String 25, Z$ if C# > 0 // unit has been user calibrated at one point in time, so store the // factory values in the memory so they can be restored if the user // miscalibrates the unit DblToBase64 D#, Z$ MP30 ISID Add String 26, Z$ DblToBase64 E#, Z$ MP30 ISID Add String 27, Z$ endif MP30 ISID WRITE 1, a if a < 0 Prompt "Communications error with the SS11LB. Please try again or contact BIOPAC support.", "OK" Halt endif End Gg8GMbm2noHJNsfHePfrrbe6GlAr1bX24qspOP7kH3+Kd86IFO753jCX0+X+sxXkMThzq50F+CKcTKcqO/8V9m5bAS9Mw35iUe/VZSX2zU4+fOjhD/HM9XR6Agw8Gi23BVjtLtQCvdjIG8D3SFTalyH30zwo27d+rpo4n7fFprX2GGm+GX1JgLMUnGm+JSFM77iOB8RZ1pS3j3l3tzXtDq5rFhFFp+y8G/0FnWDvzpW9fffGlQeCbI49xNmV2Mvkd9Gro7KHqJsD8Qm1Aw8y3JGo9MJssA0CRBYrbq8FwEgqJb8V3l4KlO5ijOcJYShOzgJ3vFdF/5EfARTylklRQA== z#) ## #PropiPXMLWPXML SCO ]PXML &PXMLqPXML 4dxl}sg өF(ԔR{3!Y!!mٞM&jjODHOXHS DZݖH)Et9Ϲؾ>g||y}>97{{}ν{ms;ͼoxϟ /~]=v7'[٪;Yc zWB/?_+ҥ?U|s'v~}}0ښ06i5;p˯ >܇X}_qL/poes.,/M>poyʽ᧧&~x}U65_oo^}m[$v$G(X;'ұg |;U|~o+}~/?#pc՛Tۑ&v}`o+}.]ZɹG??130ĞkLjlߏ ߣtϥO40wqC莦уO:y#9B={g^.BP8 @=@sd=@w&rut( uD!>3>H=@st=@:(=@i<韁 F_dϗ݁#oV6y} ;3Ww6gg/M<5ؚ99ڟ][_8vyq;kcϵ993uٵEN_:qF:q>Wy݅N}_><tgrd/|c3AGWϧ76C=@#]8ihdгZyf}}֤73&36oW'ggνrvluykqUn-]F:{Ff4+TEv 7Xq;&ݺVۗMwݽ{}ҿT[۳nM[m̺[|Q }>'FfѡH=@Yܪ VܸuO:w܌|]sW=w5鏸ΆO6p|2Zܧ|*T#);~玤cJQKnQݧܦ[s}zͻCoͪ檛7w깝 V- wO;>H9YvPPg =@zzmL'+n-[>,*,c6UY7_57sZ?.oL{5ӭ`TDv|5]3Ke5v,w]Uy]ev__uܩYqquw_hYl*]8=@zGz!i,2i:_FYvORKC}wݝ ]W?oV1_OŐy?nt:ct 3QnTxiw2K?bڰr{_s FLCc/C=@zt^-kuZ |s9d yLv4g 2_$zDv+7~;}ÿV\<#T?H9{t M2D{vϪA_fͬ=믿^ݭ^ȌKձ{f =@Dv| :\}&nU}PPkVikiޟqOgW =4JzC m=@vЃwzvsOgq?t|^fýUX؟{u{.z""X~ Xl˱뙻QF^?Vٍ n%<[Kq-j2fͳ!nԋq+G|Rx]%DFPО%i;^ ]&tR5/~ˏիT`kj=n9(eicWI?G *w=rtT;4\]T=$kzv2\5Jz' kvD=@=w&ιQW5__Zwo:F+?iV:QnKΟqwt' щnƿuYZ {G-1/bCjr|{T!$GP#)(=@zz%ŝqogw^f,OvzE_ߋN~r ܬ~x^fm3 ݼ{޽V_*/\=/믘>wց:w7ouO :02r:@z5 }wm;Tk4 ԫT+Lu_R8gY-f"<~'U`c=@ {=U]/߼kwﮅ׷^&j}}?j$]#!r'c pvhРoڼv~ͻCurꄵ|on|VkaAZ;9Dvr|6ܦ[ kWsy~6ٹz6aY+[3JzUzTƽNҭ1z2tkL5X^)m_VlK:UerEtMd/TW{ν/Ggg2W‹]bGj urEC{1wd^^a*u}º/ m3.'w ms]/cuWiC(#7 inMwŝqՏ߯{n_[=_=֝sSey-5Qw;4ص . F(vH1upE͇%wgy,v'jwIlOɺsJݩ>| .[I׻Nފ-LX6,/Kc ^qp|Kg6F(bҖΊΊSφ k^v_?븻k {6x_޾⮸k ܢSqSHx0_Nj拉orW]?QTW/̸n=V]t/<W '0RGPFGDD^6^Uª\VrY3ؿu~ZoU*S ]n?l4 htpxpս6_ ܢzݔãcCgBX/fM\stQ2!z:$zmgG|:@/ݬZWml_sC'MqWW=b#HdonMհ[nziKMS_.\tA-F(bҖa/̵z= vUylMjM/P󪿮Ih7Kn>ZuwEa@.߮/[no_q.<^=?VAL}u8xo;{F7w7v?|{7?y.x?^3C3__0+'+;^9ٝ8W:43ͽ}3\yrpD\nq{jc5m_]?L{?:KW^/\ܿ&>_]sw.m}ď87ů{޺8}?s]Ϧ FJ{FÿO\sۋJ<؉XnwbỎ_t{ .3C@uhg:zz4@}??پޟ l_GO@zz'G?t?:ޟ @@uhg:zz4@}??پޟ l_GO@zz'G?t@ޟqwzu]^5{,^X]]Z9s:'XgWU OϲߪT8c9OՎzuj{rxڟqt\G|Uk;}VuY^UmgasvyyGfy|C<>ec8y<Lf=5S]!y)ِeb7kQ s` G#gCWyܬyGf+$:p4x6qy͚{kB90dz!/YtzTWH`c8y<Lf=5S]!y|:p4x6qy͚{kBEg` G#gCWyܬyGf+$OY1dz!ؠТ^3ՕǭِejgN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3ՕǭِejgN@zT/?8_Ӄͅёz|H21 Ff+rِeYI#Cf+$ 0dz!/8bkBc8y<L,Q hl21 Ff+$΁1< y\}^&q<~:p4x6qy͚{kBuhl215@LuFφ<>/YtzTWH6c G#gCWA'Ef+%[1dz!</S8tZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!<._pʿw-) 0#Heb:g@zTWʣ90dz!G˳|FzTWH7` G#gCWyV15S]!y\x1< y\}^&q[ĨLuqsp4x6qyYl^3ِͅebg@zTWH?oc8y<Lf=5S]!yuhl215@Luiِeb7kQ 1< y\}^&q<>emVFφ<>/SbN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3ՕǭِejgN@zTWJ6c G#gCWy :-5S]<5N[R:7`DG!tb+G˭s` G#gCWg& /8bkBc8y<L,Q hl21 Ff+$ 0dz!/S8tZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!</S8tZk|y)jܝtn.<#C:WV15S])[Fφ<>/S-M5S]!y\x1< y\}^&q[ĨLuqsp4x6qyYl^3ِͅebg@zTWH7` G#gCWyV15S]!yuhl215@Lu 90dz!/9bkR-΁1< y\}^>Z02kBc8y<L,Q hl21 Ff+$ 0dz!/8bkByِeb7kQ s` G#gCWyܬyGf+$O[Fφ<>/YtzTWH hl215@Lu)k:p4x6qytZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!</S8tZkRYc8y<Ll hQqwzޒҹ#:Rt\}^&s[ĨLu/YtzTWH΁1< y\}^&q<~ِeb7kQ Sfuhl2u? 6Luqk:p4x6qy٠Т^3ՕǭِejgN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3NW %ssFt<ҹLL,QJy:p4x6qyhyoP hl21 Ff+$ 0dz!/8bkBc8y<L,Q s` G#gCWyܬyGf+$_΁1< y\}^&q<>mc8y<Lf=5S]!y30dz!/S8tZkRYc8y<Ll hQJfuhl25A'Ef˗AxKJH=y>syYl^3Օhuhl2,$^3ِͅebg@zTWH7` G#gCWyV15S]!y\x1< y\}^&q[ĨLuqsp4x6qyYl^3[Fφ<>/YtzTWH`c8y<Lf=5S]!y|:p4x6qy͚{kBEg` G#gCWyܬyGf+$OY1dz!ؠТ^3ՕǭِejgN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3ՕǭِejgN@zT/?8_Ӄͅёz|H21 Ff+rِeYI#Cf+$ 0dz!/8bkBc8y<L,Q hl21 Ff+$΁1< y\}^&q<~:p4x6qy͚{kBuhl215@LuFφ<>/YtzTWH6c G#gCWA'Ef+%[1dz!</S8tZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!<._pʿw-) 0#Heb:g@zTWʣ90dz!G˳|FzTWH7` G#gCWyV15S]!y\x1< y\}^&q[ĨLuqsp4x6qyYl^3ِͅebg@zTWH?oc8y<Lf=5S]!yuhl215@Luiِeb7kQ 1< y\}^&q<>emVFφ<>/SbN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3ՕǭِejgN@zTWJ6c G#gCWy :-5S]<5N[R:7`DG!tb+G˭s` G#gCWg& /8bkBc8y<L,Q hl21 Ff+$ 0dz!/S8tZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!</S8tZk|y)jܝtn.<#C:WV15S])[Fφ<>/S-M5S]!y\x1< y\}^&q[ĨLuqsp4x6qyYl^3ِͅebg@zTWH7` G#gCWyV15S]!yuhl215@Lu 90dz!/9bkR-΁1< y\}^>Z02kBc8y<L,Q hl21 Ff+$ 0dz!/8bkByِeb7kQ s` G#gCWyܬyGf+$O[Fφ<>/YtzTWH hl215@Lu)k:p4x6qytZkRYc8y<Ll hQJfuhl25A'Ef+%[1dz!</S8tZkRYc8y<Ll hQqwzޒҹ#:Rt\}^&s[ĨLu/YtzTWH΁1< y\}^&q<~ِeb7kQ Sfuhl2u? 6Luqk:p4x6qy٠Т^3ՕǭِejgN@zTWJ6c G#gCWy :-5S])yڬ1< y\}^q6Luqk:p4x6qy٠Т^3NW %ssFt<ҹLL,QJy:p4x6qyhyoP hl21 Ff+$ 0dz!/8bkBc8y<L,Q s` G#gCWyܬyGf+$_΁1< y\}^&q<>mc8y<Lf=5S]!y30dz!/S8tZkRYc8y<Ll hQJfuhl25A'Ef˗ߩ.?| =/3̷Kol/V{K;o7Ό=C{z7Y|;~֪,9~E۪?ټs6Wm﹵w}\s{6x_ﰟq_盷_w׾}ܞGF9 _qO?8Ko}~'_/➯[^qoo>sii};uE(\`וӼ3qhzQ܆n}{{7\;_WNhUu;ԁѪ'<|w8<_ԁn߯ӎ} Q?9ʹ>7N޿~?o=ݿ>_s܉Ǿ_}׭oĥ_׿_mkv7do?8wӼ;U;5Qm;ku{SRٝNfWow|/߫-oSCkݡ7^/Qs=[kժ/L4S[:yW|ǵ]"o_F=:mzb?7