diff --git a/.gitignore b/.gitignore index c4c4ffc..4c8b8eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.zip +.DS_Store diff --git a/qosf.org/designs/infograph_creator/README.md b/qosf.org/designs/infograph_creator/README.md new file mode 100644 index 0000000..58b11ef --- /dev/null +++ b/qosf.org/designs/infograph_creator/README.md @@ -0,0 +1,57 @@ + +# qosf.org Project Infographic Creator + +## Overview + +This project involves creating infographics for the QoSF.org project using an existing Adobe Illustrator (.ai) file and a `VariableImporter.jsx` script. The script imports variables into the .ai file, which allows for batch exporting components into PNG files using Adobe Illustrator's native export functionality. Afterwards, the resulting PNG files are combined into a larger image using a bash script. + +## Prerequisites + +1. **Adobe Illustrator** - Ensure you have Adobe Illustrator installed for working with the .ai files. +2. **VariableImporter Script** - A script that imports variables into the .ai file. +3. **ImageMagick** - Ensure you have ImageMagick installed, as it includes the `montage` tool required for the bash script. + +To install ImageMagick, run: +```bash +sudo apt-get install imagemagick +``` + +## Instructions + +### Step 0: Modify CSV +Provided `quantum_projects.csv` contains the data to populate the cards and mount the infrograph, you may change it as desired but don't change the headers as they are required as they are to work with the provided `project_card.ai` and bind automatically with VariableImporter + +### Step 1: Use VariableImporter Script + +1. **Open Adobe Illustrator** and load the `project_card.ai` configured according to VariableImporter.jsx script requirements. +2. **Run the VariableImporter script** load `VariableImporter.jsx` script (included) to import the provided `quantum_projects.csv` to load the card variables. If some variables were not auto-assigned to the object, correct that manually. + +### Step 2: Batch Export in Adobe Illustrator +1. **Open Adobe Illustrator** and load the .ai file that has been updated with the VariableImporter script. +2. Open the **Actions** panel (Window > Actions). +3. Create a new action by clicking the **Create New Action** button. +4. In the dialog that appears, name the action (e.g., "Batch Export") and click **Record**. +5. Perform the export operation manually: Go to **File > Export > Export As**, choose **PNG** as the format, and set the export settings as desired. Click **Export**. +6. Stop recording the action by clicking the **Stop** button at the bottom of the Actions panel. +7. Go to **File > Automate > Batch**. +8. In the Batch dialog, choose the action you just created from the **Action** dropdown. +9. Set the **Source** to the folder containing your updated `.ai` file. +10. Set the **Destination** to the folder where you want to save the exported PNG files. +11. Click **OK** to start the batch export process. + +### Step 3: Assemble the PNG Files into a Larger Image +To create a grid montage of PNG images: + +1. **Navigate** to the directory where your `create_grid.sh` script is located. +2. Run the script with the following command: +```bash +./create_grid.sh 3x2 /path/to/cards output.png +``` +- `3x2` specifies the grid size (3 columns and 2 rows) you can change that accordingly. +- `/path/to/cards` is the directory where the PNG images are stored. Images are assumed to be all png +- `output.png` is the name of the output file to be created. + +### Conclusion + +By following these steps, you can create a comprehensive infographic by importing variables into the provided Adobe Illustrator file using the VariableImporter script. Use Adobe Illustrator's batch export functionality to convert the updated .ai file into PNG files, and then combine these PNG files into a larger image using the provided bash script. + diff --git a/qosf.org/designs/infograph_creator/VariableImporter.jsx b/qosf.org/designs/infograph_creator/VariableImporter.jsx new file mode 100644 index 0000000..05bcb2e --- /dev/null +++ b/qosf.org/designs/infograph_creator/VariableImporter.jsx @@ -0,0 +1,4961 @@ +/*** +{ + "name" : "VariableImporter 8", + "scriptVersion" : "8.2.4", + "note" : "This script helps to import .CSV and tab-delimited .TXT spreadsheets as Illustrator XML datasets.", + "author" : { + "by" : "Vasily Hall", + "email" : "vasily.hall@gmail.com", + "linkedIn" : "https://www.linkedin.com/pub/vasily-hall/18/166/912?trk=biz_employee_pub" + }, + "thanks" : [ + "Thanks to the global community of Illustrator enthusiasts who have helped make this script happen:", + "* Hans Boon / testing on multiple versions, workstations & platforms" , + "* Stephen Marsh / http://prepression.blogspot.com/" , + "* Andy VanWagoner's CSV Parser / http://stackoverflow.com/users/1701761/andy-vanwagoner" , + "* Albert Bassa / 'double-backslash' line-break character suggestion" , + "* John Garrett / http://hypertransitory.com/" , + "* Dmitriy Gritsenko / help with multiple graph-data import" , + "* Norbert Gindl / user testing multiple graph-data import" , + "* Alice Elliott / bug fix in graph-data import" , + "* Ryan Campbell / interval increments" , + "* The great people of Adobe Scripting Forums" + ] +} +***/ + + +#target illustrator +#targetengine main +//the ui has problems and crashes when this isn't used +#script "VariableImporter" + +function VariableImporter(){ + +//=================================== FUNCTIONS ====================================// + + +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(searchElement, fromIndex) { + var k; + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var o = Object(this); + var len = o.length >>> 0; + if (len === 0) { + return -1; + } + var n = +fromIndex || 0; + if (Math.abs(n) === Infinity) { + n = 0; + } + if (n >= len) { + return -1; + } + k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (k in o && o[k] === searchElement) { + return k; + } + k++; + } + return -1; + }; +}; + +Array.prototype.compare = function (array) { + // if the other array is a falsy value, return + if (!array) + return false; + + // compare lengths - can save a lot of time + if (this.length != array.length) + return false; + + this.sort(); + array.sort(); + for (var i = 0; i < this.length; i++) { + // Check if we have nested arrays + if (this[i] instanceof Array && array[i] instanceof Array) { + // recurse into the nested arrays + if (!this[i].compare(array[i])){ + return false; + } + } + else if (this[i] != array[i]) { + // Warning - two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + return true; +}; + +//http://stackoverflow.com/a/25094986/2864371 +function arrayMakeUnique(arr){ + if(arr.length < 1){ + return []; + } + var a = arr.slice(0,); + var b = a.length, c; + while(c = --b){ + while(c--){ + a[b]!== a[c] || a.splice(c,1); + } + } + return a; +}; + +function arrayGetAllDuplicates(arr){ + if(arr.length < 1){ + return []; + } + var a = arr.slice(0,); + var b = a.length, d = [], c; + while(c = --b){ + while(c--){ + a[b] !== a[c] || d.push(a.splice(c, 1)[0]); + } + } + return d; +}; + +function arrayGetUniqueDuplicates(arr){ + return arrayMakeUnique(arrayGetAllDuplicates(arr)); +}; + +function checkForSingleDuplicate(array, value){ + var found = [], thisCell; + for (var i = 0; i < array.length; i++) { + thisCell = array[i]; + if(thisCell == value){ + found.push(value); + } + } + return found; +}; + +"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function quote(t){ + return escapable.lastIndex=0,escapable.test(t)?'"'+t.replace(escapable,function(t){var e=meta[t]; + return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'} + function str(t,e){var n,r,o,f,u,i=gap,p=e[t];switch(p&&"object"==typeof p&&"function"==typeof p.toJSON&&(p=p.toJSON(t)), + "function"==typeof rep&&(p=rep.call(e,t,p)),typeof p){case"string":return quote(p);case"number":return isFinite(p)?String(p):"null"; + case"boolean":case"null":return String(p);case"object":if(!p)return"null";if(gap+=indent,u=[],"[object Array]"===Object.prototype.toString.apply(p)){ + for(f=p.length,n=0;f>n;n+=1)u[n]=str(n,p)||"null";return o=0===u.length?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+i+"]":"["+u.join(",")+"]",gap=i,o} + if(rep&&"object"==typeof rep)for(f=rep.length,n=0;f>n;n+=1)"string"==typeof rep[n]&&(r=rep[n],o=str(r,p),o&&u.push(quote(r)+(gap?": ":":")+o)); + else for(r in p)Object.prototype.hasOwnProperty.call(p,r)&&(o=str(r,p),o&&u.push(quote(r)+(gap?": ":":")+o));return o=0===u.length?"{}":gap?"{\n"+gap+ + u.join(",\n"+gap)+"\n"+i+"}":"{"+u.join(",")+"}",gap=i,o}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){ + return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+ + f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){ + return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&& + (escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,n){var r; + if(gap="",indent="","number"==typeof n)for(r=0;n>r;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if(rep=e, + e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}), + "function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + JSON.parse=function(text,reviver){function walk(t,e){var n,r,o=t[e];if(o&&"object"==typeof o)for(n in o)Object.prototype.hasOwnProperty.call(o,n)&& + (r=walk(o,n),void 0!==r?o[n]=r:delete o[n]);return reviver.call(t,e,o)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&& + (text=text.replace(cx,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})), + /^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]") + .replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j; + throw new SyntaxError("JSON.parse")})}(); + +var tvdhve = "These violent delights have violent ends..."; + +function clone(obj) { + var copy; + // Handle the 3 simple types, and null or undefined + if (null == obj || "object" != typeof obj) return obj; + // Handle Date + if (obj instanceof Date) { + copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } + // Handle Array + if (obj instanceof Array) { + copy = []; + for (var i = 0, len = obj.length; i < len; i++) { + copy[i] = clone(obj[i]); + } + return copy; + } + // Handle Object + if (obj instanceof Object) { + copy = {}; + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); + } + return copy; + } + throw new Error("Unable to copy obj! Its type isn't supported."); +}; + +String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); +}; + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function(callback, thisArg) { + var T, k; + if (this == null) { + throw new TypeError(' this is null or not defined'); + } + var O = Object(this); + var len = O.length >>> 0; + if (typeof callback !== "function") { + throw new TypeError(callback + ' is not a function'); + } + if (arguments.length > 1) { + T = thisArg; + } + k = 0; + while (k < len) { + var kValue; + if (k in O) { + kValue = O[k]; + callback.call(T, kValue, k, O); + } + k++; + } + }; +} + +function unCamelCaseSplit(str){ + var newStr = str[0].toUpperCase() + str.split(/([A-Z][a-z]+)/g).join(" ").replace(/\s{2}/g," ").substr(1,); + return newStr; +}; + +Number.prototype.padZero = function(decimals){ + if(typeof decimals == "undefined"){ + decimals = 2; + } + var numStr = this.toString(); + var decimalsFound = numStr.length; + if(decimalsFound >= decimals){ + return this; + } + while(decimalsFound < decimals){ + numStr = '0' + numStr; + decimalsFound += 1; + } + return numStr; +}; + +function writeImageFile(binary, dest){ + if(!dest instanceof "File"){ + dest = File(dest); + } + try { + dest.encoding = "BINARY"; + dest.open("w"); + dest.write(binary); + dest.close(); + } catch (e) { + scriptAlert("writeImageFile(binary, dest)\r" + e); + } +}; + +function getScriptImage(imageObj) { + /* + imageObj = { "data" : embeddedImageData, "name" : imageName } + */ + var scriptDataFolder = SESSION.scriptDataFolder; + if(!scriptDataFolder){ + return false; + } + var thisFile = File(scriptDataFolder + "/" + imageObj.name + '.png'); + if(!thisFile.exists){ + writeImageFile(imageObj.data, thisFile); + if(!thisFile.exists) { + return false; + } + } + return thisFile; +}; +/* +function writeScriptImages() { + var scriptDataFolder = SESSION.scriptDataFolder; + for(var all in ICONS){ + var thisFile = File(scriptDataFolder + "/" + all + '.png'); + if(!thisFile.exists){ + writeImageFile(ICONS[all], thisFile); + if(!thisFile.exists) { + return false; + } else { + ICONS[all] = thisFile; + } + } else { + ICONS[all] = thisFile; + } + } + return true; +}; +*/ + +var CSV = { + // ===================================================== http://stackoverflow.com/a/12785546 + // ===================================================== Andy VanWagoner + // ===================================================== http://thetalecrafter.com/ + parse: function(csv, reviver, splitter) { + splitter = splitter || ','; + reviver = reviver || function(r, c, v) { return v; }; + var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row; + while (c < cc) { + table.push(row = []); + while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) { + start = end = c; + if ('"' === chars[c]){ + start = end = ++c; + while (c < cc) { + if ('"' === chars[c]) { + if ('"' !== chars[c+1]) { break; } + else { chars[++c] = ''; } // unescape "" + } + end = ++c; + } + if ('"' === chars[c]) { ++c; } + while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && splitter !== chars[c]) { ++c; } + } else { + while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && splitter !== chars[c]) { end = ++c; } + } + row.push(reviver(table.length-1, row.length, chars.slice(start, end).join(''))); + if (splitter === chars[c]) { ++c; } + } + if ('\r' === chars[c]) { ++c; } + if ('\n' === chars[c]) { ++c; } + } + return table; + }, + stringify: function(table, replacer, splitter) { + replacer = replacer || function(r, c, v) { return v; }; + var csv = '', c, cc, r, rr = table.length, cell; + for (r = 0; r < rr; ++r) { + if (r) { csv += '\r\n'; } + for (c = 0, cc = table[r].length; c < cc; ++c) { + if (c) { csv += splitter; } + cell = replacer(r, c, table[r][c]); + var rx = new RegExp("[" + splitter + "]\\r" + "\\n\""); + if (rx.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; } + csv += (cell || 0 === cell) ? cell : ''; + } + } + return csv; + } +}; + +function getTextData(dataFile){ + var df = dataFile; + var dataFileName = decodeURI(df.name); + var type = dataFileName.match(/(\.txt$|\.csv$)/i)[0].toLowerCase(); + var splitter = (type == '.txt')? '\t' : ','; + df.open('r'); + var fileContents = df.read(); + var firstRow = fileContents.split(/[\r\n]/g)[0]; + if(firstRow != null && splitter != "\t"){ + if(firstRow.indexOf(",") == -1 && firstRow.indexOf(";") > -1){ + splitter = ";"; // For the .csv format: if the first row has no commas but has a semicolon, assume this is a semicolon-delimited .csv file + } + } + var everyRowRaw = CSV.parse(fileContents, undefined, splitter); + df.close(); + + var everyRow = []; + for(var i = 0; i < everyRowRaw.length; i++){ + // get rid of empty rows + var thisRawRow = everyRowRaw[i]; + if(!checkRowForAllBlanks(thisRawRow)){ + if(i > 0){ + if(thisRawRow.length < everyRow[0].length){ + var diff = everyRow[0].length - thisRawRow.length; + for(var d = 0; d < diff; d++){ + thisRawRow.push(""); + } + } + } + everyRow.push(thisRawRow); + } + } + return everyRow; +}; + +function getData(filePath){ + try{ + return getTextData(File(filePath)); + } catch(e) { + alert(e); + return null; + } +}; + +function checkRowForAllBlanks(row){ + for(var i = 0; i < row.length; i++){ + if(row[i] != ''){ + return false; + } + } + return true; +}; + +function getVariableType(str){ + var firstChar = str[0]; + for(var all in VARTYPES){ + if(firstChar == VARTYPES[all].key){ + return all; + } + } + return "Text"; +}; + +function transposeGrid(data){ + var newArr = []; + var columns = data[0].length, rows = data.length, newRow = []; + for (var i = 0; i < columns; i++) { + newRow = []; + for (var j = 0; j < rows; j++) { + newRow.push(data[j][i]); + }; + newArr.push(newRow); + }; + return newArr; +}; + +function comparePropNames(compareTo, compareThis){ + var resMsg = ""; + var propCount = {}; + propCount.compareTo = 0; + propCount.compareThis = 0; + var compareToPropArr = []; + var compareThisPropArr = []; + for(var all in compareTo){ + propCount.compareTo++; + compareToPropArr.push(all); + } + for(var all in compareThis){ + propCount.compareThis++; + compareThisPropArr.push(all); + } + var allFound = true, thisProp, thisCompareProp; + for (var i = 0; i < compareToPropArr.length; i++) { + thisProp = compareToPropArr[i]; + for (var j = 0; j < compareThisPropArr.length; j++) { + thisCompareProp = compareThisPropArr[j]; + if(compareThisPropArr.indexOf(thisProp) == -1 || compareToPropArr.indexOf(thisCompareProp) == -1){ + allFound = false; + break; + } + }; + }; + if(!allFound){ + resMsg = "Not All Found" + } else { + resMsg = "All Found" + } + + return { + resMsg : resMsg, + propCount : propCount + }; +}; + +function getByName(obj, name){ + if(obj instanceof Array){ + for (var i = 0; i < obj.length; i++) { + if(obj[i].name == name){ + return obj[i]; + } + } + } else if(typeof obj == "Object"){ + for(var all in obj){ + if(all == "name" && obj[all] == name){ + return obj[all]; + } + } + } + return null; +}; + +function getPropertyList(obj){ + var arr = []; + for(var all in obj){ + arr.push(all); + } + return arr; +}; + +function getSpecificPropertyListObj(obj, prop){ + var arr = []; + for(var all in obj){ + if(obj[all].hasOwnProperty(prop)){ + arr.push(obj[all][prop]); + } + } + return arr; +}; + +function getSpecificPropertyObj(obj, prop, value){ + for(var all in obj){ + if(obj[all].hasOwnProperty(prop) && obj[all][prop] == value){ + return obj[all]; + } + } + return null; +}; + +function getSpecificPropertyListArr(srcArr, prop){ + var arr = []; + for (var i = 0; i < srcArr.length; i++) { + if(srcArr[i].hasOwnProperty(prop)){ + arr.push(srcArr[i][prop]); + } + } + return arr; +}; + +function getSpecificValuePropertyListArr(srcArr, filterProp, filterValue, searchProp){ + var arr = []; + for (var i = 0; i < srcArr.length; i++) { + if(srcArr[i].hasOwnProperty(filterProp) && srcArr[i].hasOwnProperty(searchProp) && srcArr[i][filterProp] == filterValue){ + arr.push(srcArr[i][searchProp]); + } + } + return arr; +}; + + + +//==================================================================================// + +//================================== FUNCTIONS_2 ===================================// + +function writeFile(fileObj, contents, encoding){ + if(typeof encoding == "string"){ + fileObj.encoding = encoding; + } + fileObj.open("w"); + fileObj.write(contents); + fileObj.close(); +}; + +function writeSettingsFile(settingsObj) { + var scriptDataFolder = SESSION.scriptDataFolder; + if(scriptDataFolder.exists){ + var settingsFile = SESSION.settingsFile; + try{ + writeFile(settingsFile, JSON.stringify(settingsObj, null, 2)); + if(WARNINGSETTINGS.showSuccessfulSettingsFileSaves){ + scriptAlert("Settings file successfully saved in '" + decodeURI(settingsFile) + "'"); + } + } catch(e) { + scriptAlert(e); + } + } else { + scriptAlert("The folder '" + scriptDataFolder + "' does not exist and Settings file could not be written."); + } +}; + +function getScriptDataObj(){ + // must have updated object first + var obj = {}; + obj.WARNINGSETTINGS = WARNINGSETTINGS; + obj.PRESETS = PRESETS; + obj.DATASETNAMEFIELDS = DATASETNAMEFIELDS_current; + obj.CUSTOM_INCREMENTS = CUSTOM_INCREMENTS_current; + obj.VisibilityKeys = VisibilityKeys; + if(typeof(VI_MEMORY_SETTINGS) != "undefined"){ + obj.lastChosenDataFilePath = VI_MEMORY_SETTINGS.lastChosenDataFilePath; + } + return obj; +}; + +function updateScriptDataFromUI(UIElements, presetName){ + var presetName = presetName || SESSION.currentLoadedPresetName; + var presetObj = {}; + for ( var all in PRESETS[0] ){ + if(UIElements.hasOwnProperty(all) && typeof UIElements[all].getValue == "function"){ + presetObj[all] = UIElements[all].getValue(); + } + } + var warningList = UIElements["list_warnings"]; + for ( var all in WARNINGSETTINGS ){ + WARNINGSETTINGS[all] = warningList.find(unCamelCaseSplit(all)).checked; + } + // also update from other memory objects, not necessarily the UI anymore + presetObj["datasetNameObj"] = clone(DATASETNAMEFIELDS_current); + presetObj["enabledVisibilityKeyNames"] = getSpecificValuePropertyListArr(VisibilityKeys, "enabled", true, "name"); + var loadedPreset = PRESETS.getByName(presetName); + for(var all in presetObj){ + loadedPreset[all] = presetObj[all]; + } +}; + +function getUIData(UIElements){ + var presetObj = {}; + for ( var all in PRESETS[0]){ + if(UIElements.hasOwnProperty(all) && typeof UIElements[all].getValue == "function"){ + presetObj[all] = UIElements[all].getValue(); + } + } + for ( var all in WARNINGSETTINGS ){ + // this adds the notification settings as piggy-back, but isn't used in the return data from this function + if(UIElements.hasOwnProperty(all) && typeof UIElements[all].getValue == "function"){ + WARNINGSETTINGS[all] = UIElements[all].getValue(); + } + } + presetObj.datasetNameObj = DATASETNAMEFIELDS_current; + presetObj.enabledVisibilityKeyNames = getSpecificValuePropertyListArr(VisibilityKeys, "enabled", true, "name"); + return presetObj; +}; + +function updateCurrentPresetNameDisplays(UIElements, currentLoadedPresetObj, tryAddOverridesMarker){ + var currentUIStatePresetObj = getUIData(UIElements); + var hasOverrides = false; + if(typeof tryAddOverridesMarker != "undefined" && tryAddOverridesMarker === true ){ + var testObj = {}; + for(var all in currentUIStatePresetObj){ + if(all == "enabledVisibilityKeyNames"){ + if(currentUIStatePresetObj[all].compare(currentLoadedPresetObj[all])){ + // checked by array compare function to see if same elements exist in both arrays regardless of order + // if so, set one object to the other, making later string comparison true + currentLoadedPresetObj[all] = currentUIStatePresetObj[all]; + } + } + testObj[all] = currentLoadedPresetObj[all]; + } + hasOverrides = JSON.stringify(testObj) !== JSON.stringify(currentUIStatePresetObj); + // quickView( + // JSON.stringify(testObj, null, 2) + "\n\n" + + // JSON.stringify(currentUIStatePresetObj, null, 2) + // ); + } + var thisElem; + for (var i = 0; i < UIElements["currentlySelectedPresetName"].length; i++) { + thisElem = UIElements["currentlySelectedPresetName"][i]; + if(hasOverrides){ + thisElem.setValue(SESSION.currentLoadedPresetName + "*"); + thisElem.helpTip = "The preset '" + SESSION.currentLoadedPresetName + "' has one or more of its dialog settings overriden in the current dialog state."; + } else { + thisElem.setValue(SESSION.currentLoadedPresetName); + thisElem.helpTip = ""; + } + }; +}; + +function setVisibilityKeysEnabled(visKeyNames){ + var thisVisKeyObj, processedItems = []; + for (var i = 0; i < VisibilityKeys.length; i++) { + thisVisKeyObj = VisibilityKeys[i]; + if(visKeyNames.indexOf(thisVisKeyObj.name) > -1 && processedItems.indexOf(thisVisKeyObj.name) == -1){ + thisVisKeyObj.enabled = true; + processedItems.push(thisVisKeyObj.name); + } else if(processedItems.indexOf(thisVisKeyObj.name) == -1){ + thisVisKeyObj.enabled = false; + } + } +}; + +function populateUI(UIElements, tryAddOverridesMarker){ + // tryAddOverridesMarker should be used when this function is invoked after window loading + var currentLoadedPresetObj = PRESETS.getByName(SESSION.currentLoadedPresetName); + if(currentLoadedPresetObj.hasOwnProperty("enabledVisibilityKeyNames")){ + setVisibilityKeysEnabled(currentLoadedPresetObj.enabledVisibilityKeyNames); + } + for (var all in UIElements){ + if( all in UIElements && all in SETTINGS ){ + SETTINGS[all] = (currentLoadedPresetObj[all]); + } + } + for ( var all in PRESETS[0]){ + if(UIElements.hasOwnProperty(all) && typeof UIElements[all].getValue == "function"){ + UIElements[all].setValue(currentLoadedPresetObj[all]); + } + } + updateCurrentPresetNameDisplays(UIElements, currentLoadedPresetObj, tryAddOverridesMarker); + var warningList = UIElements["list_warnings"]; + for ( var all in WARNINGSETTINGS){ + warningList.find(unCamelCaseSplit(all)).checked = WARNINGSETTINGS[all]; + } + UIElements["disp_dataFile"].notify("onChange"); + var xmlPathStr = UIElements["xmlPath"].getValue(); + if(xmlPathStr == "" || xmlPathStr == "temp" || xmlPathStr == "undefined"){ + UIElements["xmlPath"].setValue(SETTINGS.getDataXMLDestination()); + } + UIElements["datasetNamePreview"].setValue(getDatasetNamePreviewString()); +}; + +function getCurrentlySelectedPresetName(){ + var thisPreset; + for(var i = 0; i < PRESETS.length; i++){ + thisPreset = PRESETS[i]; + if(thisPreset.currentlySelected){ + return thisPreset.name; + } + } +}; + +function setCurrentlySelectedPresetName(name){ + var thisPreset; + for(var i = 0; i < PRESETS.length; i++){ + thisPreset = PRESETS[i]; + if(name == thisPreset.name){ + thisPreset.currentlySelected = true; + } else { + thisPreset.currentlySelected = false; + } + } +}; + +function addVarNameDatasetNames(){ + FIELDNAMEOPTIONS_current = clone(FIELDNAMEOPTIONS); + var varNames = DATA.getVariableNames(); + if(varNames.length == 0){ + return; + } + var thisName, key; + for (var i = 0; i < varNames.length; i++) { + thisName = varNames[i]; + key = "variable_" + (i + 1) + "_value"; + FIELDNAMEOPTIONS_current[key] = { + defaultText : thisName, + displayText : "Variable " + (i + 1) + " Value : \"" + thisName + "\"", + type : key + } + }; + + var processedDatasetNameFieldsResult = clearOutOfBoundVariables(DATASETNAMEFIELDS_current); + DATASETNAMEFIELDS_current = processedDatasetNameFieldsResult.obj; + if(WARNINGSETTINGS.showDatasetNamingWarning && processedDatasetNameFieldsResult.msg != ""){ + quickView(processedDatasetNameFieldsResult.msg, "Dataset naming field errors."); + } +}; + +function clearOutOfBoundVariables(obj){ + // variable field values and custom increment objects in dataset name fields + var varNames = DATA.getVariableNames(); + var idx; + missingVariableNamesLog = []; + missingCustomIncrementsLog = []; + for(var all in obj){ + if(obj[all].type.match(SESSION.regexps.varRx)){ + idx = (obj[all].type.match(/\d+/) * 1) - 1; + if(idx < varNames.length){ + obj[all].text = varNames[idx]; + } else { + missingVariableNamesLog.push(all + " : variable # " + idx + " (\"" + obj[all].text + "\")"); + obj[all].type = "nothing"; + obj[all].text = ""; + } + } else if(obj[all].type == "customIncrement"){ + var customIncObj = getByName(CUSTOM_INCREMENTS_current, obj[all].text); + if(customIncObj == null){ + missingCustomIncrementsLog.push(all + " : " + obj[all].text); + obj[all].type = "nothing"; + obj[all].text = ""; + } + } + } + var msg = ""; + if(missingVariableNamesLog.length > 0 ){ + msg += "The variables associated with dataset-name fields were not found in current data and were removed from the dataset naming options.\n" + + "---------------------------------------------\n" + + missingVariableNamesLog.join("\n"); + } + if(missingCustomIncrementsLog.length > 0){ + if(msg != ""){ + msg += "\n\n"; + } + msg += "These custom increments were specified inside the dataset name fields, but were not located in the saved settings data.\n" + + "---------------------------------------------\n" + + missingCustomIncrementsLog.join("\n"); + } + return { obj : obj, msg : msg }; +}; + +function getPrependPathValue(varObj, cellData){ + var folderDiv = (SESSION.os == "Windows")? "\\" : "/"; + cellData = varObj.url + folderDiv + cellData; + cellData = (cellData).replace(/\\\\/g,"//").replace(/\\/g,"/"); + return cellData; +}; + +function getRecordDatasetName(dsNameFieldObj, row, index){ + var str = ""; + for(var all in dsNameFieldObj){ + str += getDsNameField(dsNameFieldObj, all, row, index); + }; + return str; +}; + +function getRecordCustomInc(index, startNum, padZero, increment, isIntervalIncrement, _isSelfCalled){ + /* 0-start-based index */ + startNum *= 1; + increment *= 1; + var padZeroStr = ""; + var storedPadZero = padZero; + var currentNum = startNum + (index * increment); + if(_isSelfCalled){ + currentNum -= 1; + } + var currentNumLength = currentNum.toString().length - 1; + padZero -= currentNumLength; + for(var i = 0; i < padZero; i++){ + padZeroStr += "0"; + } + if(!isIntervalIncrement){ + return padZeroStr + currentNum; + } else { + // get next value by re-using this function with edited increment argument and a flag to avoid this block during that run + var nextVal = getRecordCustomInc(index + 1, startNum, storedPadZero, increment, false, true); + + return padZeroStr + currentNum + "-" + nextVal; + } +}; + +function getDsNameField(dsNameFieldObj, fieldName, row, index){ + + function getCurrentText(dsNameFieldObj, fieldName){ + return dsNameFieldObj[fieldName].text; + }; + + if(dsNameFieldObj[fieldName].type.match(SESSION.regexps.varRx)){ + var varIndex = (dsNameFieldObj[fieldName].type.replace(/[^\d]/g, "") * 1) - 1; + if(varIndex < row.length){ + return row[varIndex]; + } + } + + switch(dsNameFieldObj[fieldName].type){ + case "customText" : { + return getCurrentText(dsNameFieldObj, fieldName); + break; + }; + case "dash" : { + return getCurrentText(dsNameFieldObj, fieldName); + break; + }; + case "nothing" : { + return getCurrentText(dsNameFieldObj, fieldName); + break; + }; + case "space" : { + return getCurrentText(dsNameFieldObj, fieldName); + break; + }; + case "increment" : { + return index + SETTINGS.incrementStartNumber; + break; + }; + case "underscore" : { + return getCurrentText(dsNameFieldObj, fieldName); + break; + }; + case "customIncrement" : { + var customIncName = getCurrentText(dsNameFieldObj, fieldName); + var customIncObj = getByName(CUSTOM_INCREMENTS_current, customIncName); + if(customIncObj == null){ + return ""; // failed to find the custom increment item + } + return getRecordCustomInc(index, customIncObj.startNum, customIncObj.padZero, customIncObj.increment, customIncObj.isIntervalIncrement); + break; + }; + default : { + return ""; + }; + } + return ""; +}; + +function getFileRefTestResults(){ + if(DATA.currentVars.length == 0){ + return null; + } + var log = { + foundImages : ["Found Images: "], + foundGraphs : ["Found Graphs: "], + missingImages : ["Missing Images: "], + missingGraphs : ["Missing Graphs: "] + }; + + var item, thisVar, test; + + for(var i = 0; i < DATA.currentGrid.length; i++){ + for (var j = 0; j < DATA.currentVars.length; j++) { + item = DATA.currentGrid[i][j]; + thisVar = DATA.currentVars[j]; + if(thisVar.varType == "Image" || thisVar.varType == "Graph"){ + test = File(item); + if(test.exists){ + log["found" + thisVar.varType + "s"].push(item); + } else { + log["missing" + thisVar.varType + "s"].push(item); + } + } + }; + } + return log; +}; + +function getSpecificFileRefTestResultsLog(log, prop){ + // images or graphs + if(prop != "Images" && prop != "Graphs"){ + alert("Only 'Images' and 'Graphs' are searchable properties in function 'getSpecificFileRefTestResultsLog(log, prop)'"); + return null; + } + + var specificLog = { + found : log["found" + prop], + missing : log["missing" + prop] + }; + + var resMsg = ""; + for(var all in specificLog){ + specificLog[all][0] += ("(" + (specificLog[all].length - 1) + ")\n---------------"); + resMsg += (specificLog[all].join("\n") + "\r\r"); + } + return resMsg; +}; + +function fileRefTestHandler(){ + // designed to be called from a button which has a .key property saying which part of the log to show. (.key = "Images" | .key = "Graphs") + if(DATA.currentVars.length == 0){ + alert("Please import a data file first."); + return; + } + DATA.getCurrentGrid(); + var allResults = getFileRefTestResults(); + var thisRefResultNumFound = allResults["found" + this.key].length - 1; + var thisRefResultNumMissing = allResults["missing" + this.key].length - 1; + var foundMissingNum = thisRefResultNumFound + "/" + (thisRefResultNumFound + thisRefResultNumMissing); + + // var logStr = getSpecificFileRefTestResultsLog(allResults, this.key); + var keySingular = this.key.replace(/s$/, ""); + + simpleShowModal(TestManager[keySingular.toLowerCase() + "Files"].makeUIContents, { + title : this.key.replace(/s$/, "") + " Files Log", + foundFiles : allResults["found" + this.key].slice(1).join("\n"), + missingFiles : allResults["missing" + this.key].slice(1).join("\n"), + foundMissingNum : foundMissingNum, + size : [800, 220] + }); + + this.disp.setValue(foundMissingNum); + var tabGroupKey = "testTabs"; + if(this.window.UITestElements.hasOwnProperty(tabGroupKey)){ + var testTabPanel = this.window.UITestElements["testTabs"], thisTab; + for (var i = 0; i < testTabPanel.children.length; i++) { + thisTab = testTabPanel.children[i]; + if(thisTab.hasOwnProperty("key") && thisTab.key == keySingular){ + thisTab.populateFields(); + } + }; + } +}; + +function displayFoundArtBindings(UITestElements){ + var doc = app.activeDocument; + DocumentBinding.getNamedBinds(doc); + UITestElements["foundArtBindings"].setValue( DocumentBinding.getBindObjectTestResults().foundItemString ); + var tabItemKey = "testTabArtBinding"; + if(UITestElements.hasOwnProperty(tabItemKey)){ + UITestElements[tabItemKey].populateFields(); + } +}; + +eval( + "@JSXBIN@ES@2.0@MyBbyBnABMAbyBn0ACOBbCn0ACJCnAEjzFjBjMjFjSjUBfRBFehBiEjPjFjTjOhHj" + + "UhAjMjPjPjLhAjMjJjLjFhAjBjOjZjUjIjJjOjHhAjUjPhAjNjFhOffZDnAFctACzChdhdCEXzHjSjF" + + "jQjMjBjDjFDfEXzLjUjPiMjPjXjFjSiDjBjTjFEfVzFjJjOjQjVjUFfAnfRCYIibieicjXicjTidhLA" + + "FeAffEXDfEXEfVzHjEjFjTjJjSjFjEGfBnfRCYIibieicjXicjTidhLAFeAffnnnZFnAFcfACG4B0Ah" + + "AF40BhAC0AzCjFjFHAG0EzAIByB" +); + + +//==================================================================================// + +//================================== FUNCTIONS_2 ===================================// + +function stringXmlSafe(str){ + str=str.toString(); + str=str.replace(/&(?!(amp;|gt;|lt;|quot;|apos;))/g, "&"); + str=str.replace(//g, ">"); + str=str.replace(/'/g, "'"); + str=str.replace(/"/g, """); + return str; +}; + +function disguiseXmlEntities(str){ + str=str.toString(); + str=str.replace(/&(?!(amp;|gt;|lt;|quot;|apos;))/g, "_#_amp_#_"); + str=str.replace(//g, "_#_gt_#_"); + str=str.replace(/'/g, "_#_apos_#_"); + str=str.replace(/"/g, "_#_quot_#_"); + return str; +}; + +function undisguiseXmlEntities(str){ + str=str.toString(); + str=str.replace(/_#_amp_#_/g, "&"); + str=str.replace(/_#_lt_#_/g, "<"); + str=str.replace(/_#_gt_#_/g, ">"); + str=str.replace(/_#_apos_#_/g, "'"); + str=str.replace(/_#_quot_#_/g, """); + return str; +}; + +function wrapCDATA(str, propNm){ + str = '' + str + ''; + str = str.replace(/(\)/g, '<' + propNm + '>)/g, ']]\>' + ''); + return XML(str); +}; + +function isXMLTagName ( tag ){ + //http://stackoverflow.com/questions/3158274/what-would-be-a-regex-for-valid-xml-names + var t = !/^[xX][mM][lL].*/.test(tag); // condition 3 + t = t && /^[a-zA-Z_].*/.test(tag); // condition 2 + t = t && /^[a-zA-Z0-9_\-\.]+$/.test(tag); // condition 4 + return t; +}; + +function getXmlFileDest(userInputObj){ + if(!SETTINGS.keepXML){ + var dataFile = File(userInputObj.sourceDataPath); + var xmlDest = File(dataFile.parent + "/" + decodeURI(dataFile.name).replace(/\.\w+$/, ".xml")) + .saveDlg("Where would you like to save the Variable Data XML file?"); + return xmlDest; + } else { + return File(userInputObj.xmlPath); + } +}; + +function forceRefreshDoc(){ + var temp = app.documents.add(); + temp.close(SaveOptions.DONOTSAVECHANGES); +}; + +function cycleUpdateAllDatasets(doc, displayElem){ + for(var i = 0; i < doc.dataSets.length; i++){ + var d = doc.dataSets[i]; + d.display(); + if(typeof displayElem != "undefined"){ + displayElem.text = (i + 1) + " of " + doc.dataSets.length; + displayElem.window.update(); + } + redraw(); + $.sleep(10); + d.update(); + }; + doc.dataSets[0].display(); + displayElem.text = (1) + " of " + doc.dataSets.length; +}; + +function processUserInput(userInputObj) { + + var xmlDest, doc, problem; + + var xmlString = XMLStringBuilder.generateVariableLibraryXMLString(); + if(xmlString == null){ + return; + } + + if(userInputObj.purpose == "createXML"){ + xmlDest = getXmlFileDest(userInputObj); + if(xmlDest == null){ + alert("Cancelled: no XML file produced."); + return; + } + + writeFile(xmlDest, xmlString, "UTF-8"); + + if(xmlDest.exists){ + // alert("File successfully saved in '" + decodeURI(xmlDest) + "'"); + finishedXMLFileDialog(xmlDest, DATA.currentVars.length, DATA.currentGrid.length); + } else { + alert("Sorry, the file '" + decodeURI(xmlDest) + "' could not be saved."); + } + } else { + + xmlDest = File(userInputObj.xmlPath); + writeFile(xmlDest, xmlString, "UTF-8"); + if(!xmlDest.exists){ + alert("Sorry, the file '" + decodeURI(xmlDest) + "' could not be saved."); + return; + } + doc = app.activeDocument; + if(doc.variables.length > 0){ + if(!CONFIRMS["showExistingVariablesWarning"]( doc.variables.length )){ + alert("Cancelled: no variables were imported."); + return; + } + if(SETTINGS.selectedAutobinding != "noAutoBinding"){ + for (var i = doc.variables.length - 1; i >= 0; i--) { + doc.variables[i].remove(); + } + } + } + + try { + problem = "Importing Variables into the document from created XML file."; + doc.importVariables(xmlDest); + forceRefreshDoc(); // force refresh actually makes binding possible? + + if(SETTINGS.selectedAutobinding != "noAutoBinding" && + !(userInputObj.fileRefsLog.missingImages.length > 1 || userInputObj.fileRefsLog.missingGraphs.length > 1)){ + problem = "Auto-Binding variables to art items based on '" + unCamelCaseSplit(SETTINGS.selectedAutobinding) + "'"; + DocumentBinding.bindDocumentItems(doc); + } + + if(userInputObj.fileRefsLog.missingImages.length < 2 || userInputObj.fileRefsLog.missingGraphs.length < 2){ + if(doc.dataSets.length > 0 && SETTINGS.selectedAutobinding != "noAutoBinding"){ + problem = "Displaying first dataset of the document." + doc.dataSets[0].display(); // display the first dataset. + } + } + finishedXMLImportDialog( + DATA.currentVars.length, + DATA.currentGrid.length, + userInputObj.fileRefsLog.missingImages.length - 1, + userInputObj.fileRefsLog.missingGraphs.length - 1 + ); + // victory! + } catch(e) { + alert("Sorry, something went wrong with the import of the generated XML file '" + xmlDest + "':\n" + e + "\nPossible Problem: " + problem); + } + + if(!SETTINGS.keepXML){ + xmlDest.remove(); + } + } +}; + + + +//==================================================================================// + +//==================================== OBJECTS =====================================// +var SESSION = { + os : $.os.match('Windows') ? 'Windows' : 'Mac', + AIVersion : parseInt(app.version.split(/\./)[0]), + scriptName : "VariableImporter.jsx", + "scriptVersion" : "8.2.4", + currentLoadedPresetName : "", + regexps : { + varRx : /variable_\d+_value/, + fileStartRx : /^file\:\/\/\// + }, + multiColumnListBoxTest : true, + documentExists : (app.documents.length > 0), + settingsFile : function(){ + return File(Folder.myDocuments + "/VariableImporter/VariableImporter_SETTINGS.json"); + }(), + scriptDataFolder : function(){ + var f = Folder(Folder.myDocuments + "/VariableImporter"); + if(!f.exists){ + f.create(); + } + return f; + }(), + dataFileMask : function(){ + return (this.os == 'Windows')? "*.txt;*.TXT;*.csv;*.CSV;" : function(f){ + return f instanceof Folder || (f instanceof File && decodeURI(f.name).match(/(\.txt|\.csv)$/i)); + }; + }, + tabbedGroupTest : false, + imageTest : false, + doImageTest : function(){ + /*var thisIcon; + var flag = true; + try{ + for (var all in ICONS) { + thisIcon = ICONS[all]; + parent.add("iconbutton", undefined, thisIcon); + }; + } catch(e) { + // fail Error 520, try to write the images + flag = writeScriptImages(); + } + this.imageTest = flag; + */ + var flag = true, thisIconString, test; + for (var all in ICONS) { + thisIconString = ICONS[all]; + test = getScriptImage({ + name : all, + data : thisIconString + }); + ICONS[all] = test; + if(!test){ + flag = false; + } + }; + this.imageTest = flag; + return flag; + }, + init : function(){ + // load from settings function + if(this.settingsFile.exists){ + this.settingsFile.open('r'); + var settingsObj = JSON.parse(this.settingsFile.read()), tempObj; + this.settingsFile.close(); + // read the visibility keys in first. + if(settingsObj.hasOwnProperty("VisibilityKeys") && settingsObj.VisibilityKeys.length > 0 && comparePropNames(settingsObj.VisibilityKeys[0], VisibilityKeys[0]).resMsg == "All Found"){ + VisibilityKeys = settingsObj.VisibilityKeys; + } + if(settingsObj.hasOwnProperty("PRESETS")){ + for( var i = 0; i < settingsObj.PRESETS.length; i++ ){ + tempObj = {}; + for(var all in PRESETS[0]){ + if(settingsObj.PRESETS[i].hasOwnProperty(all)){ + tempObj[all] = settingsObj.PRESETS[i][all]; + if(all == "currentlySelected" && settingsObj.PRESETS[i][all] === true){ + if(settingsObj.PRESETS[i].hasOwnProperty("datasetNameObj")){ + DATASETNAMEFIELDS_current = clone(settingsObj.PRESETS[i].datasetNameObj); + } + if(settingsObj.PRESETS[i].hasOwnProperty("enabledVisibilityKeyNames")){ + var currentlyEnabledVisKeyNames = settingsObj.PRESETS[i].enabledVisibilityKeyNames; + var currentlyAvailableVisKeyNames = getSpecificPropertyListObj(VisibilityKeys, "name"); + var areAllEnabledNamesPresent = true; + // check if all currently loaded visibility keys contain all of the enabled names from the preset + // remove any which were not found + for (var j = currentlyEnabledVisKeyNames.length - 1; j > -1; j--) { + if(currentlyAvailableVisKeyNames.indexOf(currentlyEnabledVisKeyNames[j]) == -1){ + currentlyEnabledVisKeyNames.splice(j, 1); + areAllEnabledNamesPresent = false; // a flag for any purpose + } + } + DATASETNAMEFIELDS_current = clone(settingsObj.PRESETS[i].datasetNameObj); + } + } + } else { + tempObj[all] = PRESETS[0][all]; + } + } + PRESETS[i] = tempObj; + } + } + if(settingsObj.hasOwnProperty("lastChosenDataFilePath") && VI_MEMORY_SETTINGS.lastChosenDataFilePath == ""){ + VI_MEMORY_SETTINGS.lastChosenDataFilePath = settingsObj["lastChosenDataFilePath"]; + } + // if the settings file contains no custom increments, defaults will be used anyway + if(settingsObj.hasOwnProperty("CUSTOM_INCREMENTS") && settingsObj.CUSTOM_INCREMENTS.length > 0){ + var customIncrementsAreAllValid = true, currentSettingsCustomInc; + for (var i = 0; i < settingsObj["CUSTOM_INCREMENTS"]; i++) { + currentSettingsCustomInc = settingsObj["CUSTOM_INCREMENTS"][i]; + for(var all in CUSTOM_INCREMENTS[0]){ // CUSTOM_INCREMENTS in the objects must always have the default value(s) + if(!currentSettingsCustomInc.hasOwnProperty(all)){ + scriptAlert("Problem reading custom increment information from the settings file. Defaulting to script-defaults for custom increments."); + customIncrementsAreAllValid = false; + break; + } + } + } + if(customIncrementsAreAllValid){ + CUSTOM_INCREMENTS_current = settingsObj["CUSTOM_INCREMENTS"]; + } + } + if(settingsObj.hasOwnProperty("WARNINGSETTINGS") && comparePropNames(settingsObj.WARNINGSETTINGS, WARNINGSETTINGS).resMsg == "All Found"){ + WARNINGSETTINGS = settingsObj.WARNINGSETTINGS; + for(var all in WARNINGSETTINGS){ + if(SETTINGS.hasOwnProperty(all)){ + SETTINGS[all] = WARNINGSETTINGS[all]; + } + } + } + } else { + PRESETS.getByName("default").datasetNameObj = DATASETNAMEFIELDS_current; + } + + this.currentLoadedPresetName = getCurrentlySelectedPresetName(); + this.multiColumnListBoxTest = (this.os == "Windows" || this.AIVersion != 16) ? true : false; + this.tabbedGroupTest = (this.AIVersion > 13) ? true : false; + // ScriptUI tabbedpanel was unavailable in Illustrator CS3 + } +}; + +var PresetDialogPurposes = { + Add : { + resultAction : function(presetDialogResult, UIElements, listBox){ + SESSION.currentLoadedPresetName = presetDialogResult.presetName; + PRESETS.addItem(PRESETS.getByName("default"), SESSION.currentLoadedPresetName); + updateScriptDataFromUI(UIElements); + UIElements.saved = (UIElements["disp_dataFile"].getValue() != ""); + populateUI(UIElements); + refreshPresetListbox(listBox); + }, + presetDispEditable : true, + placeholderName : "New Preset", + actionButtonName : "Add", + showRemoveButton : false + }, + Remove : { + resultAction : function(presetDialogResult, UIElements, listBox){ + SESSION.currentLoadedPresetName = "default"; + setCurrentlySelectedPresetName("default"); + PRESETS.removeItemByName(presetDialogResult.presetName); + populateUI(UIElements, true); + refreshPresetListbox(listBox); + }, + presetDispEditable : false, + placeholderName : "self", + actionButtonName : "Remove", + showRemoveButton : true + }, + Activate : { + resultAction : function(presetDialogResult, UIElements){ + var thisName = presetDialogResult.presetName; + var thisPreset = PRESETS.getByName(thisName); + SESSION.currentLoadedPresetName = thisName; + setCurrentlySelectedPresetName(thisName); + if(thisPreset.hasOwnProperty("datasetNameObj")){ + DATASETNAMEFIELDS_current = clone(thisPreset.datasetNameObj); + } + // switchStackView(UIElements["stackGroup"], "variablesDisplay"); + UIElements["variablesDisplayR"].notify("onClick"); + populateUI(UIElements, true); + }, + presetDispEditable : false, + placeholderName : "self", + actionButtonName : "Activate", + showRemoveButton : true + }, + Update : { + resultAction : function(presetDialogResult, UIElements, listBox){ + var oldName = presetDialogResult.oldName; + var newName = presetDialogResult.presetName; + if(PRESETS.getByName(newName) != null && oldName != newName){ + if(!CONFIRMS["overwriteOtherExistingPreset"]( newName )){ + return; + } + } else { + PRESETS.getByName(oldName).name = newName; + } + SESSION.currentLoadedPresetName = newName; + setCurrentlySelectedPresetName(newName); + updateScriptDataFromUI(UIElements, newName); + populateUI(UIElements); + refreshPresetListbox(listBox); + }, + presetDispEditable : true, + placeholderName : "self", + actionButtonName : "Update", + showRemoveButton : false, + oldName : "" + } +}; + +if(typeof(VI_MEMORY_SETTINGS) == "undefined"){ + VI_MEMORY_SETTINGS = { + "lastChosenDataFilePath" : "" + }; +} + +var PRESETS = [ + { + name : "default", + useHeaders : true, + currentlySelected : true, + transpose : false, + dbslNextline : false, + keepXML : false, + xmlPath : "temp", + selectedAutobinding : 'bindByName', + prependToAllImages : false, + prependImagePath : '', + prependToAllGraphs : false, + prependGraphPath : '', + datasetNameObj : {}, + enabledVisibilityKeyNames : [ + "True", + "False", + "On", + "Off", + // "One", + // "Zero", + ] + } +]; + +PRESETS.getByName = function(value){ + var item; + for(var i = 0; i < this.length; i++){ + item = this[i]; + if(item.hasOwnProperty("name")){ + if(item.name == value){ + return item; + } + } + } + return null; +}; + +PRESETS.getAllNames = function(){ + var namesArr = []; + var item; + for(var i = 0; i < this.length; i++){ + item = this[i]; + if(item.hasOwnProperty("name")){ + namesArr.push(item.name); + } + } + return namesArr; +}; + +PRESETS.removeItemByName = function(name){ + var item; + for(var i = 0; i < this.length; i++){ + item = this[i]; + if(item.hasOwnProperty("name") && item.name == name){ + this.splice(i, 1); + break; + } + } +}; + +PRESETS.addItem = function(cloneObj, newName){ + if(this.getByName(newName) != null){ + var conf = confirm("This preset '" + newName + "' already exists, overwrite?"); + if(!conf){ + return; + } + this.removeItemByName(newName); + } + var obj = {}; + for(var all in cloneObj){ + obj[all] = cloneObj[all]; + } + obj.name = newName; + this.push(obj); + var thisObj; + for(var i = 0; i < this.length; i++){ + thisObj = this[i]; + if(thisObj.name != newName){ + thisObj.currentlySelected = false; + } else { + thisObj.currentlySelected = true; + } + } +}; + +var CUSTOM_INCREMENTS = [ + { // generic examples & naming-convention idea. + name : "s0p3i1", + startNum : 0, + padZero : 3, + increment : 1, + isIntervalIncrement: false + }, + { + name : "s1p2i1", + startNum : 1, + padZero : 2, + increment : 1, + isIntervalIncrement: false + }, + { + name : "s1p2i10-interval", + startNum : 1, + padZero : 3, + increment : 10, + isIntervalIncrement: true + } +]; + +var WARNINGSETTINGS = { + showDatasetNamingWarning : true, + showExistingVariablesWarning : true, + confirmRemovalOfPresets : true, + confirmUpdatingOfPresets : true, + showSuccessfulSettingsFileSaves : true +}; + +var CONFIRMS = { + showDatasetNamingWarning : function(){ + if(WARNINGSETTINGS["showDatasetNamingWarning"] == true){ + return confirm("This data import has been defaulted to generic dataset names. Continue import?"); + } + return true; + }, + showExistingVariablesWarning : function( numVars ){ + if(WARNINGSETTINGS["showExistingVariablesWarning"] == true){ + return confirm("This document already contains " + numVars + " variable" + ((numVars > 1) ? "s" : "") + + " which may be overwritten. Continue import?"); + } + return true; + }, + confirmRemovalOfPresets : function(presetName){ + if(WARNINGSETTINGS["confirmRemovalOfPresets"] == true){ + return confirm("Remove Preset '" + presetName + "' ?"); + } + return true; + }, + confirmUpdatingOfPresets : function(presetName){ + if(WARNINGSETTINGS["confirmUpdatingOfPresets"] == true){ + return confirm("Update Preset '" + presetName + "' ?"); + } + return true; + }, + overwriteOtherExistingPreset : function(presetName){ + if(WARNINGSETTINGS["confirmUpdatingOfPresets"] == true){ + return confirm("Overwrite Preset '" + presetName + "' ?"); + } + return true; + } +}; + +var SETTINGS = { + useHeaders : true, + transpose : false, + dbslNextline : false, + keepXML : false, + xmlPath : "", + selectedAutobinding : "noAutoBinding", + prependToAllImages : false, + prependImagePath : "", + prependToAllGraphs : false, + prependGraphPath : "", + getDataXMLDestination : function(){ + return File(Folder.desktop + "/VariableImporterData_" + new Date().getTime() + ".xml"); + }, + incrementStartNumber : 1 +}; + +var DATASETNAMEFIELDS = { + field_1 : { + type : "customText", + text : "Record" + }, + field_2 : { + type : "dash", + text : "-" + }, + field_3 : { + type : "increment", + text : "INC" + }, + field_4 : { + type : "nothing", + text : "" + }, + field_5 : { + type : "nothing", + text : "" + }, + field_6 : { + type : "nothing", + text : "" + } +}; + +var FIELDNAMEOPTIONS = { + customText : { + defaultText : "[Edit Text]", + displayText : "Custom Text", + type : "customText" + }, + dash : { + defaultText : "-", + displayText : "Dash", + type : "dash" + }, + nothing : { + defaultText : "", + displayText : "Nothing", + type : "nothing" + }, + space : { + defaultText : " ", + displayText : "Space", + type : "space" + }, + increment : { + defaultText : "INC", + displayText : "Increment", + type : "increment" + }, + underscore : { + defaultText : "_", + displayText : "Underscore", + type : "underscore" + }, + customIncrement : { + defaultText : "", + displayText : "Custom Increment", + type : "customIncrement" + }, +}; + +var DATASETNAMEFIELDS_current = clone(DATASETNAMEFIELDS); +var FIELDNAMEOPTIONS_current = clone(FIELDNAMEOPTIONS); +var CUSTOM_INCREMENTS_current = clone(CUSTOM_INCREMENTS); + +var VARTYPES = { + "Text" : { + key : "", + type : "Text", + itemKind : "TextFrame", + trait : "textcontent", + category : "&ns_flows;", + varKind : "VariableKind.TEXTUAL", + contentKind : "contentVariable" + }, + "Visibility" : { + key : "#", + type : "Visibility", + itemKind : "All", + trait : "visibility", + category : "&ns_vars;", + varKind : "VariableKind.VISIBILITY", + contentKind : "visibilityVariable" + }, + "Image" : { + key : "@", + type : "Image", + itemKind : "PlacedItem", + trait : "fileref", + category : "&ns_vars;", + varKind : "VariableKind.IMAGE", + contentKind : "contentVariable" + }, + "Graph" : { + key : "%", + type : "Graph", + itemKind : "GraphItem", + trait : "graphdata", + category : "&ns_graphs;", + varKind : "VariableKind.GRAPH", + contentKind : "contentVariable" + } +}; + +var UI_SIZING = { + variableDisplay : { + small : { + varAmt : "1-8", + height : 150 + }, + medium : { + varAmt : "9-15", + height : 300 + }, + large : { + varAmt : "16-Infinity", + height : 500 + } + }, + bindingTestDisplay : { + preferredSize : [430, 300] + }, + foundOfTotalDisp : { + // those inputs which show found/total numbers of file references + characters : 12 + }, + sizeSpecs : { + platforms : { + Windows : { + + }, + Mac : { + + } + } + }, + panelWidth_1 : 466, + init : function(){ + + } +}; + +var DATA = { + grid : [], + transposedGrid : [], + currentSourceFile : "", + currentVars : [ + /*{ + varName : "Variable1", + varType : "Text", + url : "", + varIndex : 0 + }*/ + ], + oldVars : [], + testVariableName : function(oldName, newName){ + var msg = "", allVarNames = getSpecificPropertyListArr(DATA.currentVars, "varName"); + if( !isXMLTagName(newName) ){ + msg = "The '" + newName + "' variable name doesn't not follow the proper XML syntax:\n" + INFO.xmlRequirements; + scriptAlert(msg); + return false; + } else { + if(checkForSingleDuplicate(allVarNames, newName).length > 0 && oldName != newName){ + msg = "The '" + newName + "' variable name already exists among imported variable names."; + scriptAlert(msg); + return false; + } + } + return true; + }, + testNameProp_unique : function(argsObj){ + // argsObj = {collection : [], prop : "varName", prefixString : "Variable", collectionName : "Variables", showDialog : true} + var badArr = [], namesArr, msg; + namesArr = (typeof argsObj.prop == "string") ? getSpecificPropertyListArr(argsObj.collection, argsObj.prop) : argsObj.collection; + + badArr = arrayGetUniqueDuplicates(namesArr); + if(badArr.length > 0){ + + msg = "The following " + argsObj.collectionName + " name(s) are found more than once\n" + + "(All " + argsObj.collectionName + " names are going to be Auto-replaced):" + + "\n--------------------------------------\n" + (badArr).join("\n"); + if(argsObj.showDialog){ + quickView(msg, argsObj.collectionName + " Names Correction", [400, 550]); + } + this.genericize(argsObj.collection, argsObj.prop, argsObj.prefixString); + return false; + } + return true; + }, + testVarNames_xml : function(){ + var badArr = [], thisVar, msg; + for (var i = 0; i < this.currentVars.length; i++) { + thisVar = this.currentVars[i]; + if( !isXMLTagName(thisVar.varName) ){ + badArr.push(thisVar.varName); + } + } + if(badArr.length > 0){ + + msg = "Proper XML Syntax isn't followed by some variable name(s)\n" + INFO.xmlRequirements + "\n" + + "(All names are going to be Auto-replaced):\n--------------------------------------\n" + (badArr).join("\n"); + + quickView(msg, "Variable Name Correction", [400, 550]); + this.genericize(this.currentVars, "varName", "Variable"); + return false; + } else { + return true; + } + }, + genericize : function(collection, prop, prefixString){ + if(typeof prop == "undefined"){ + for (var i = 0; i < collection.length; i++) { + collection[i] = prefixString + (i + 1); + } + } else { + for (var i = 0; i < collection.length; i++) { + collection[i][prop] = prefixString + (i + 1); + } + } + }, + getCurrentVars : function(UIElements){ + if(this.currentSourceFile == "" || this.grid.length == 0){ + return null; + } + this.oldVars = []; + + if(typeof UIElements != 'undefined' && UIElements["variableDisplay"].items.length > 0){ + for(var i = 0; i < DATA.currentVars.length; i++){ + if(i < DATA.currentVars.length){ + this.oldVars.push(DATA.currentVars[i]); + } + } + } + var data = (SETTINGS.transpose) ? this.transposedGrid : this.grid; + this.currentVars = []; + var varName = "", varType = "", datum = "", thisUrl; + for(var i = 0; i < data[0].length; i++){ + // header row is variable names + datum = data[0][i]; + varName = (SETTINGS.useHeaders) ? datum.replace(/^[@#%]/, "") : "Variable" + (i + 1); + varType = (SETTINGS.useHeaders) ? getVariableType(datum) : "Text"; + thisUrl = ""; + if(varType == "Image" || varType == "Graph"){ + if(SETTINGS["prependToAll" + varType + "s"]){ + thisUrl = SETTINGS["prepend" + varType + "Path"]; + } + } + + this.currentVars.push({ + varIndex : i, + varName : varName, + varType : varType, + useUrl : true, + url : thisUrl + }); + } + // go through variable names and make sure they follow xml syntax, if they all do, then make sure they're unique also + // any failure will cause genericizing + if(this.testVarNames_xml()){ + this.testNameProp_unique({ + collection : this.currentVars, + prop : "varName", + prefixString : "Variable", + collectionName : "Variable", + showDialog : true + }); + } + }, + getVariableNames : function(){ + if(this.currentVars.length > 0){ + return getSpecificPropertyListArr(this.currentVars, "varName"); + } + return []; + }, + currentGrid : [], + currentDatasetNames : [], + getCurrentGrid : function(){ + if(this.currentVars.length == 0){ + return []; + } + var data = (!SETTINGS.transpose) ? this.grid : this.transposedGrid; + var start = (!SETTINGS.useHeaders) ? 0 : 1; + var row, cell, arr = [], rowArr = [], thisVar, dsnArr = []; + for (var i = start; i < data.length; i++) { + row = data[i]; + rowArr = []; + dsnArr.push(getRecordDatasetName(DATASETNAMEFIELDS_current, row, i - start)); + for (var j = 0; j < row.length; j++) { + cell = row[j]; + thisVar = this.currentVars[j]; + if(thisVar.url != "" && (thisVar.varType == "Image" || thisVar.varType == "Graph")){ + cell = getPrependPathValue(thisVar, cell); + } + rowArr.push(cell); + }; + arr.push(rowArr); + }; + this.currentGrid = arr; + + this.currentDatasetNames = dsnArr; + // untested for uniqueness at this point. + }, + getTestDatasetNames : function(dsNameFieldObj){ + if(this.currentVars.length == 0){ + return []; + } + var data = (!SETTINGS.transpose) ? this.grid : this.transposedGrid; + var start = (!SETTINGS.useHeaders) ? 0 : 1; + var row, dsnArr = []; + for (var i = start; i < data.length; i++) { + row = data[i]; + dsnArr.push(getRecordDatasetName(dsNameFieldObj, row, i - start)); + }; + + // make sure dataset names are unique, or else they get genericized + // already done when getting currentGrid, omit dialog + this.testNameProp_unique({ + collection : dsnArr, + prop : undefined, + prefixString : "Record ", + collectionName : "Dataset", + showDialog : WARNINGSETTINGS["showDatasetNamingWarning"] + }); + + return dsnArr; + } +}; + +var AUTOBINDING = { + noAutoBinding : { + type : "noAutoBinding", + text : "No Auto Binding", + getProp : function(item){ + return "N/A"; + } + }, + bindByName : { + type : "bindByName", + text : "Bind By Name", + getProp : function(item){ + return item["name"]; + } + }, + bindByNote : { + type : "bindByNote", + text : "Bind By Note", + getProp : function(item){ + return item["note"]; + } + }, + bindByTag : { + type : "bindByTag", + text : "Bind By Tag", + preferredTagName : "VariableImporterBinding", + getProp : function(item){ + if(item.tags.length > 0){ + return getSpecificPropertyListArr(item.tags, "name"); + } else { + return []; + } + } + } +}; + +//visibility keys are tested against lower-case cell data +var VisibilityKeys = [ + { + displayText : "true", + name : "True", + value : true, + enabled : true + }, + { + displayText : "false", + name : "False", + value : false, + enabled : true + }, + { + displayText : "on", + name : "On", + value : true, + enabled : true + }, + { + displayText : "off", + name : "Off", + value : false, + enabled : true + }, + { + displayText : "1", + name : "One", + value : true, + enabled : false + }, + { + displayText : "0", + name : "Zero", + value : false, + enabled : false + } +]; + +var ICONS = { + "Visibility" : "\u0089PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\x00\x00\x00\x14\b\x02\x00\x00\x00\x02\u00EB\u008AZ\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\u00C9e<\x00\x00\x01?IDATx\u00DAb\u00FC\u00FF\u00FF?\x03\u00B9\u0080qT3\x14|\u00F8\u00F0\u00E1\u00C2\u0085\x0Bp\u00AE\u0081\u0081\u0081\u0080\u0080\x00a\u00CD\x0B\x16,\u00988q\"P\u00A9\u008E\u00A9\u00C5\u0091\u00FB/\u00B9X\u0099\u008DdD\u008E\u00EC\u00DE\x01\u0094\u00CA\u00CF\u00CFOHH\u00C0\u00AEy\u00C3\u0086\r\u008D\u008D\u008D\u00FE\u00FE\u00FE@\x15L\x02\"\u00E7\u009F\u00BE\x05j~\u00F3\u00F5\x07P*\u00D9L]\u0086\u00F1;\u00D0\u00DC\u008D\x1B7\u00D6\u00D7\u00D7\x07\x04\x04@u\x035\u00BF\x7F\u00FF\x1E\u00A8\x01(t\u00FF\u00FE} \u00F7\u00F5\u0097\u00EF\x1B\u00AE<\x002z\u00A6\u00CEP\u00B1\u00F7\u0088\u009A\u00B75a\u00C5A\u00A0 P\x04\u00A8\u00C0\u00C1\u00C1\x01\u00A8\x18\u00A8\x05d+\u0090\x02z\u00A9\u00BF\u00BF\u00FF?\f\u00EC\u00BC\u00F9\u00A4d\u00F3I\u00A0N\u0088?\u0081\u00FA\u0081\u009A\u00D7_~\x00W\x00T\f\u00D4\x02\u00D4\u00C8\u0082\x19\f\u00DF~\u00FD\x01\u00BAv\u00C3\u00AA\r\u00C0`\u0083\x0Br\u00B1aQ\u00C9\x044~\u00FF\u00FE\u00FD\x17/^ttt|\u00F0\u00E0\x01P\u00C8FQ\x1CH\u009A\u00C5\u00E7\x02\u00ED\x04\" \x03\u00C85\u0092\x16\x06\u0092@\x05\u0081\u0081\u0081@\u00C5@-@\u008D\u00D8\x03\u00EC\u00C9\x7F\u00CE\u00B9\u00A7n\u00C2m\u00C0\x15`\u00D8\u00A3\nd\u00BF\u00AB\u00C7\u00B9'o\u00BE\u00FD\u00FE\x0Bt\u00C8\u0095\u00D3'\u0080^\u00C0\x17UTH$\u00A3Y\u0092\x00\x00\b0\x00\u009C \u00F4D\u0080v\u00BF\u00C6\x00\x00\x00\x00IEND\u00AEB`\u0082", + "Image" : "\u0089PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\x00\x00\x00\x14\b\x02\x00\x00\x00\x02\u00EB\u008AZ\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\u00C9e<\x00\x00\x01\x7FIDATx\u00DAb\u009C\u009B\u00CF@6`b\u00A0\x00\u00B0@(\u00A5\t_H\u00D2v\u00AF\u0080\x07\u00C5fY\u0086j=\x06mm\x06\x0B\x1E\u0086\u00D3\u00C8\u00EA\u0098\x19\u00FE\x13v\u00B6 \u00C3\x06\u00B0\u00D2\u00CF\u00E2\fS\u0091\x04\u00BF\x0B}~y\u00E1\u00D2\u00EB\u009F?\u00FF\u00E2\u00D3\u00FC\u0097\u0081\x17\u00C2\u00F8\u00C5 \r\x17\u00E4\u00FB\u00FB\u00ED\u00E7\x1F\x06y\u00DE\u00BF\u009F>\u00FF\u00C2\u00E9g\u00907\x18\x16\u00883L\u00FB\u00C5 \u00F5\u0092!\x1B\"\u00F2\u00E3\u00F3w&\u00B6\u00DF@\u00C6\u00F3\u00CF\f\x7F\u00BF}\u00E3\u00E6b\u00E5\u00E2b\u00C1\u00AE\u00F9;\u0083\u00C6\x03\u0086Ip\u00EE\u00EB7\u00DFY>\x7F\u00E4Ud\u00E0eg\u00D8}\x07(\u00F0\u00FB\u00DA\u008DwZ\x1AB\u00C8\u00FAY\u00B0\u0086\x04P\u00E7\u00BD\u00FB\x1F!la.\u0098\u00BF\u00FE\u00FE\u00BB{\u00FF#P?33#>\u00CDJ\\?\u00CD\u00F4\x18~\u00FDe\u00B8\u00F5\x06\u00AA\x19H\u00BE\u00FD\u00C6\u00F0\u00ED\u00DB\u00EFO\u009F~\t\n\u00B2\u00A3h.L\u00E5@\u00D6l\u00A4\u00CE\u00DF]\u00F2\u00E3\u00CAK\u0084f6f\u0090\u00FB\x1F=ci\u009A\u00C5\x0F\u00E4\u00E6r#i\u00BEp\u0086\x19Y\u00F3\u00853<5\u00E9\u00AF\u009F\x7F\u00FE\x07\u00D4\t4\x02\x12f@p\u00ED\x027T\u00A5=\u00DE\u00E4\u00B9|\x13\u00AF\u00AB\n\u0083\u008F\x06\u0083\u00A5\x1CB\u00F0\u00C8\x1E\x01\u00A2\u00D2\u00F6\u00F2\u00CD\u00BCh\"\u00CF\x1F\u00B3\u00BF\x7F\u00CBB\u0094\u00E6+7\u00D9\u0081\bY\u00E4\u00C8^~\u009C\u0089\x04\x13\u00D8G\u00C8x9~57\u00FB\u00BA\u00FB\f\u00FB\u00D5\x0B\u00DCh\u00D6\x12\u00D0\f\x04\u00DB\u00F6s\x03\x11-\u00F3\u00F3\\{Fz\u0097$\x00\x01\x06\x00<\u00E3\u0084d\u0089\u00F2\x1C;\x00\x00\x00\x00IEND\u00AEB`\u0082", + "Graph" : "\u0089PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\x00\x00\x00\x14\b\x02\x00\x00\x00\x02\u00EB\u008AZ\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\u00C9e<\x00\x00\x01\u00FDIDATx\u00DAbd``\u00F8\u00FF\u00FF?\x03\u00E9\u0080\u0091\u0091\u0091\x05H\u009D={\u0096\u0081,\u00C0H\u0089\u00CDL\f\x14\x00,\u00CE\u00E6z\u00FC\x14\u00C2\u00F8\u00CB\u00CE\u00FESL\u0084\u0080\x01\u00FFQ\u00C1Au]\x0F~\u00C1J\t\u0099\u008B\u00B1I\u00FFq\x03\u00A0F\u00EC\u00CE\u00DE\u00F1\u00F1\u00FD\u00E1/\u009F\b:\x1B\u008B\u00E6\x0B\u00DF\u00BE&\u008A\u0088\u00F303\x13\u00E5\u00E7\x07\u0093\u00B6\n\x1F}\x0E\u00E1?\u0089T]\u00FD\u00FEM\u00AB\u00B4\u00FC\u0082\u00B7\u00AFn\u00BF\x7F\u00FB\x1B)8\u00B8\x7F>Vz\u00B9\u00FC\u00F0\u00ED\u009F\x0F\u00DF\u00FD\u00D9s\x07\u00A6Y\u00FC/\u00C7\u00F7\x13\u00F7 *\u0096~<\x1C*\b\n$\x0F>\u0081#\u00FF\u00FE\x04\x1B\x1B\u00C35\u00FF{\u00FA{\u00CF\u00CA\u0083\u00EE\u0093^\u00C6\u009As/\u009A\u00D4\u00BC|\u00EDV\x14g?\u00FA\u00F3\u00F1\u008B4\u00A7\x01\x177\u0090-\u00C1\u00CAv\u00E7\u00D2e4w\x02\u00ED\x04\u00EA\u00CCq\u00E0E\u00F8\u00F9\u00D5\u00ABW\x10N\u00D7\u00C7\u00C3\u0099\u00FE\u00D1p\u00A5N\x1C\u00DC\u0093'O~\x06\x03w\u009F\u00BC:|\u00FB\u00C7\u00AC\x18a=\x19\u00B6\u00CF\u009F\u00BF@5\u00D7\u00EE[x\u00E5\u00D7\u00CB\u00E5_/\u00EB\u00B0\u0089\u00F33q\u00C05\u00DB\x18\x1B\x1DS/N5Y\x16~4O\u00F2;\u0084~<\u00B0\x1A\u00C8x9\u00BF1<\u00BF\nKT=\x7F\u00FE\u00DC\u009A]\u00CEZT\x0E\u00C8\u00BE}\u00EB\x16\\\u00EE\u00F3\u00E7O/?}\x051N\u00EF\u00E45s\u0083\u00B0!\x00\u00A8\x05j\u00B3\u00A4\u00A4$\\TUM\r\u00CE\u00E6\u00E5\u00E5\u0093\u0092\u0094\u00FC\u00FB\u00F5\u00D3\u0093\u00AET.mKde\x106\x0B\u00C1d\x04\u00B4\u00F3\u00DF\u00D7OL\\|\f\f\u00AF\u00B18\u009B\u0080fSw \x023_c)\f\u00E4X\u00F8\u00E1Au\u00E5\u00D7+E\x0Eh\u00AA\u00FE\u00F2\u00F7\u00EFC>\x11V1Y\b\u0097\u00E3\u00E5u\x1D\u00C1\x1F\u00D0\u00D4\u00F2\u00F6\x0F0\u00C1\x00\x04\x18\x00b\u00C8\u00EF\x17\u00C9\u00FD\u009FL\x00\x00\x00\x00IEND\u00AEB`\u0082", + "Text" : "\u0089PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\x00\x00\x00\x14\b\x02\x00\x00\x00\x02\u00EB\u008AZ\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\u00C9e<\x00\x00\x00\u00B1IDATx\u00DAb\u00FC\u00FF\u00FF?\x03\u00B9\u0080\x05\u0088/\\\u00B8\u00F0\u00E1\u00C3\x07\u0092\u00B4\t\b\b\x18\x18\x180\x00mvpp \u00D5N\u00A0\x16\u00A0F&\x06\n\x00\x0B\u00B2a\u00C8\x12\x0F\u00C0\x00\u00C8P\x00\x03d\u00A9\x03\x07\x0E@Ypg\u00FFG\x05\u00F5\u00F5\u00F5\x10\x05@\x06\u009A\x14\u00F5\u009C\u00DD\u00DF\u00DFORh\u00EF\u00DF\u00BF\x1F\x18\u00DAP\u00CD\u00A0@'1\u00A8!\f\u008A\u009C=\u00AA\u0099Z\u009A\x1F>|\u0088\u00C6\u00C0\u0097\u00B6\u0081\x00\u0098T\u0080\u00D9\x13\u00C8\u00D8\u00B8q\u00E3\u0082\x05\x0B \u0082@\x060I\u00F8\u00FB\u00FBCR\x04$y \u00D26\x1C\x00\u0093\x0E\u00C1\u00B4\u0085\u00AC\u009E\x11\u00B9$\u0081\u00DB\u008C\x0B\u00A0\u00D9\u00CCHI1\x04\x10`\x00\u00C5_\u0084\u00C3\u008F\u00CF\u00D1\u009F\x00\x00\x00\x00IEND\u00AEB`\u0082" +}; + +var INFO = { + xmlRequirements : "1) Element names are case-sensitive" + "\n" + + "2) Element names must start with a letter or underscore" + "\n" + + "3) Element names cannot start with the letters xml (or XML, or Xml, etc)" + "\n" + + "4) Element names can contain letters, digits, hyphens, underscores, and periods" + "\n" + + "5) Element names cannot contain spaces" +}; + +SESSION.init(); //---------------------------------------------------------------------------------------------------- INIT SESSION + + + +//==================================================================================// + +//================================= OBJECTS PT 2 ===================================// + +var DocumentBinding = { + // names of variables are expected to be unique, but art identifying properties (.name , .note and .tags.tag) are not. + artItems : {}, + namedArtCollection : [], + getNamedBinds : function(doc){ + if(DATA.currentVars.length == 0){ + return null; + } + this.artItems = {}; + this.namedArtCollection = this.getAllDocumentNamedItems(doc, AUTOBINDING[SETTINGS.selectedAutobinding]); + var varNames = DATA.getVariableNames(), + varTypes = getSpecificPropertyListArr(DATA.currentVars, "varType"), + newVarBindObj; + for (var i = 0; i < varNames.length; i++) { + newVarBindObj = {}; + if(SETTINGS.selectedAutobinding == "noAutoBinding"){ + newVarBindObj.bindCollection = []; + } else { + newVarBindObj.bindCollection = this.getSortedNamedItems( + this.namedArtCollection, + varNames[i], + varTypes[i], + AUTOBINDING[SETTINGS.selectedAutobinding] + ); + } + newVarBindObj.varType = varTypes[i]; + this.artItems[varNames[i]] = newVarBindObj; + }; + }, + getAllDocumentNamedItems : function(doc, method){ + var arr = [], testProp, thisItem; + for (var i = 0; i < doc.pageItems.length; i++) { + thisItem = doc.pageItems[i]; + testProp = method.getProp(thisItem); + if(testProp instanceof Array && testProp.length > 0){ + // dealing with tag + arr.push( thisItem ); + } else if(typeof testProp == "string" && testProp != ""){ + arr.push( thisItem ); + } + } + return arr; + }, + getSortedNamedItems : function(collection, varName, varType, method){ + var arr = [], thisItem, testProp, testTag; + for (var i = 0; i < collection.length; i++) { + thisItem = collection[i]; + if(thisItem.typename == VARTYPES[varType].itemKind || VARTYPES[varType].itemKind == "All"){ + testProp = method.getProp(thisItem); + if(testProp instanceof Array && testProp.length > 0){ + // dealing with tag + if(testProp.indexOf(varName) > -1){ + arr.push( thisItem ); // get item if tag's name matches the variable's name + } else { + try { + testTag = thisItem.tags.getByName(method.preferredTagName); + if(testTag.value == varName){ + arr.push( thisItem ); // get item if tag's name is "VariableImporterBinding" and value matches variable's name + } + } catch(e){ + + } + }; + } else if(typeof testProp == "string" && testProp == varName){ + arr.push( thisItem ); + } + } + }; + return arr; + }, + getBindObjectTestResults : function(){ + var artItemNames = getPropertyList(this.artItems); + if(artItemNames.length == 0){ + return null; + } + var res = { + log : "", + countTextVars : 0, + foundTextItems : 0, + countImageVars : 0, + foundImageItems : 0, + countGraphVars : 0, + foundGraphItems : 0, + countVisibilityVars : 0, + foundVisibilityItems : 0 + }; + + var arrLog = ["Autobinding method: " + unCamelCaseSplit(SETTINGS.selectedAutobinding) + "\n-------------------"]; + var thisName, thisItem, thisVarObj, thisBindCollectionCount = 0, foundItemString = "", thisFoundProp, thisVarCountProp; + for (var i = 0; i < artItemNames.length; i++) { + thisName = artItemNames[i]; + thisItem = this.artItems[thisName]; + thisVarObj = getSpecificPropertyObj(DATA.currentVars, "varName", thisName); + thisBindCollectionCount = thisItem.bindCollection.length; + res["found" + thisVarObj.varType + "Items"] += thisBindCollectionCount; + res["count" + thisVarObj.varType + "Vars"] += 1; + arrLog.push(thisName + " : " + thisBindCollectionCount); + }; + + for(var all in VARTYPES){ + thisFoundProp = "found" + all + "Items"; + thisVarCountProp = "count" + all + "Vars"; + foundItemString += (all + ": " + res[thisFoundProp] + "/" + res[thisVarCountProp] + ", "); + } + + res.log = arrLog.join("\n"); + res.foundItemString = foundItemString.replace(/,\s$/, ""); + + return res; + }, + bindDocumentItems : function(doc){ + this.getNamedBinds(doc); + var artItemNames = getPropertyList(this.artItems), artCollection, artItem, thisDocVar, thisContentKind, thisVarTypeObj; + + var artItems = this.artItems, thisArtItemsVarName = "", currentSelection; + artItemNames.sort(function(a,b){ + if(artItems[a].varType == "Visibility"){ + return true; + } else { + return false; + } + }); + + if(artItemNames.length == 0){ + return null; + } + for( var i = 0; i < artItemNames.length; i++ ){ + thisArtItemsVarName = artItemNames[i]; + thisDocVar = doc.variables.getByName(thisArtItemsVarName); + for( var that in VARTYPES ){ + thisVarTypeObj = VARTYPES[that]; + if(thisVarTypeObj.varKind == thisDocVar.kind){ + thisContentKind = thisVarTypeObj.contentKind; + break; + } + } + artCollection = this.artItems[thisArtItemsVarName].bindCollection; + for (var j = 0; j < artCollection.length; j++) { + artItem = artCollection[j]; + artItem[thisContentKind] = thisDocVar; + } + } + } +}; + +function FileTestSeeker(prop){ + return { + makeUIContents : function(parent, propObj){ + parent.spacing = 4; + var size; + if(typeof propObj.size == "undefined"){ + size = [350, 200]; + } else { + size = propObj.size; + } + var disp_foundMissingNum = parent.add("edittext { properties : {readonly : true}, justify : 'center' }"); + disp_foundMissingNum.characters = UI_SIZING.foundOfTotalDisp.characters; + + var foundNum = "", missingNum = "", parsedNums; + if(propObj.hasOwnProperty("foundMissingNum")){ + disp_foundMissingNum.setValue(propObj.foundMissingNum); + parsedNums = propObj.foundMissingNum.split("/"); + foundNum = parsedNums[0]; + missingNum = parsedNums[1] - foundNum; + } + var lbl_foundImageFiles = parent.add("statictext", undefined, "Found " + prop + " Files: " + foundNum); + var foundList = parent.add("edittext", undefined, "", {readonly : true, multiline : true}); + foundList.size = size; + if(propObj.hasOwnProperty("foundFiles")){ + foundList.setValue(propObj.foundFiles); + } + var lbl_missingImageFiles = parent.add("statictext", undefined, "Missing " + prop + " Files: " + missingNum); + var missingList = parent.add("edittext", undefined, "", {readonly : true, multiline : true}); + missingList.size = size; + if(propObj.hasOwnProperty("missingFiles")){ + missingList.setValue(propObj.missingFiles); + } + return { + foundList : foundList, + missingList : missingList, + disp_foundMissingNum : disp_foundMissingNum + }; + }, + makeTab : function(parentTabbedPanel){ + var tab = parentTabbedPanel.add("tab", undefined, prop + " Files"); + tab.key = prop; + + parentTabbedPanel.window.UITestElements["testTab" + prop] = tab; + + tab.contents = this.makeUIContents(tab, {size : [515, 130]}); + + tab.populateFields = function(){ + var allResults = getFileRefTestResults(); + var thisRefResultNumFound = allResults["found" + prop + "s"].length - 1; + var thisRefResultNumMissing = allResults["missing" + prop + "s"].length - 1; + var foundFiles = allResults["found" + prop + "s"].slice(1).join("\n") + var missingFiles = allResults["missing" + prop + "s"].slice(1).join("\n") + var foundMissingNum = thisRefResultNumFound + "/" + (thisRefResultNumFound + thisRefResultNumMissing); + tab.contents.foundList.setValue(foundFiles); + tab.contents.missingList.setValue(missingFiles); + tab.contents.disp_foundMissingNum.setValue(foundMissingNum); + }; + tab.resetFields = function(){ + for(var all in this.contents){ + this.contents[all].setValue(""); + } + } + return tab; + } + } +}; + +//=============================================================================================================================================// +//=============================================================== GRAPH DATA ==================================================================// +//=============================================================================================================================================// +var GraphDataGatherer = { + emptyGraphString : "" + "\r" + + "" + "\r" + + "" + "\r" + + "" + "\r" + + "1" + "\r" + + "" + "\r" + + "" + "\r" + + "", + getGraphData : function( graphFilePath ){ + var graphFile; + try { + graphFile = File(graphFilePath); + if(!graphFile.exists){ + throw new Error("Graph File not found: '" + decodeURI(graphFilePath) + "'"); + } + return this.getGraphDataFromFile(graphFile); + } catch (e) { + // alert(e); + return this.emptyGraphString; + } + }, + isquoted : function (str) { + return str.charAt(0) === '"' && str.charAt(str.length - 1) === '"'; + }, + unquoted : function (str) { + if (str.charAt(0) === '"' && str.charAt(str.length - 1) === '"') { + return str.substring(1, str.length - 1); + } + else { + return str; + } + }, + analyzeCellContent : function(cell){ + var res = { + isQuoted : false, + isNumber : false, + isWord : false + }; + var rxNum = /^-?\d*[\.]?\d+$/; + var rxWord = /[a-z]/gi; + res.isQuoted = (cell.charAt(0) === '"' && cell.charAt(cell.length - 1) === '"'); + res.isNumber = (res.isQuoted && rxNum.test(cell.replace(/"/g, "")) || (!res.isQuoted && rxNum.test(cell))); + res.isWord = (!res.isNumber && rxWord.test(cell) || (!res.isQuoted && !res.isNumber)); + return res; + }, + getGraphDataFromFile : function( graphFile ){ + var res = '', maxcol = 1, haspropertyrow = false, hasnamecol = false; + var col, row, numstr, myAnalyzedCell, thisCell; + + var textData = getData( graphFile.fsName ); + + var i; + var rows = [], vals = []; + var name; + for ( i = 0; i < textData.length; i++) { + vals = textData[i]; + if (vals.length > maxcol) { + maxcol = vals.length; + } + rows.push(vals); + } + + numstr = 0; + for (col = 0; col < rows[0].length; col++) { + if (rows[0][col] === '') continue; + if (isNaN(rows[0][col])) numstr--; + else numstr++; + } + haspropertyrow = (numstr <= (col > 2 ? 0 : -1)); + + numstr = 0; + for (row = 0; row < rows.length; row++) { + if (rows[row][0] === '') continue; + if (isNaN(rows[row][0])) numstr--; + else numstr++; + } + hasnamecol = (numstr <= 0); + + // create a string + res += ''; + row = 0; + // propertyRow + if (haspropertyrow) { + res += ''; + col = 0; + thisCell = rows[row][col]; + if (hasnamecol) { + // res += '' : '>') + // + stringXmlSafe(this.unquoted(rows[row][col++])) + ''; + myAnalyzedCell = this.analyzeCellContent(thisCell); + + res += '' : '>') + + stringXmlSafe(this.unquoted(thisCell)) + ''; + + col++; + } + else { + res += ''; + } + for (; col < rows[0].length; col++) { + // res += '' : '>') + // + stringXmlSafe(this.unquoted(rows[row][col])) + ''; + thisCell = rows[row][col]; + myAnalyzedCell = this.analyzeCellContent(thisCell); + res += '' : '>') + + stringXmlSafe(this.unquoted(thisCell)) + ''; + } + for (; col < maxcol; col++) { + res += ''; + } + res += ''; + row++; + } + // values + res += ''; + for (; row < rows.length; row++) { + res += ''; + col = 0; + if (hasnamecol) { + // res += '' + stringXmlSafe(this.unquoted(rows[row][col++])) + ''; + thisCell = rows[row][col]; + myAnalyzedCell = this.analyzeCellContent(thisCell); + res += '' : '>') + + stringXmlSafe(this.unquoted(thisCell)) + ''; + + col++; + } + else { + res += ''; + } + for (; col < rows[row].length; col++) { + res += '' : '>') + + stringXmlSafe(this.unquoted(rows[row][col])) + ''; + } + for (; col < maxcol; col++) { + res += ''; + } + res += ''; + } + res += ''; + res += ''; + + return res; + } +}; + +var TestManager = { + datasetNames : { + makeUIContents : function(parent, propObj){ + var list = parent.add("edittext", undefined, "", {readonly : true, multiline : true}); + list.size = propObj.size; + if(propObj.hasOwnProperty("data")){ + list.setValue(propObj.data); + } + return list; + }, + makeTab : function(parentTabbedPanel){ + var tab = parentTabbedPanel.add("tab", undefined, "Dataset Names"); + var disp_preview = tab.add("edittext { properties : {readonly : true}, justify : 'center' }"); + disp_preview.characters = 36; + var list = this.makeUIContents(tab, {size : [300, 300]}); + + tab.populateFields = function(){ + // make sure dataset names are unique, or else they get genericized + DATA.testNameProp_unique({ + collection : DATA.currentDatasetNames, + prop : undefined, + prefixString : "Record ", + collectionName : "Dataset", + showDialog : WARNINGSETTINGS["showDatasetNamingWarning"] + }); + if(DATA.currentDatasetNames.length > 0){ + list.setValue(DATA.currentDatasetNames.join("\n")); + disp_preview.setValue(getDatasetNamePreviewString()); + } + }; + tab.resetFields = function(){ + list.setValue(""); + disp_preview.setValue(""); + } + return tab; + } + }, + imageFiles : new FileTestSeeker("Image"), + graphFiles : new FileTestSeeker("Graph"), + artBindings : { + // simpleShowModal(DocumentBinding.displayTestList, {title : "Binding Test Display"}); + makeUIContents : function(parent, propObj){ + var listBox; + if(!SESSION.multiColumnListBoxTest){ + // crazy CS6 Bug with multi-column listbox crash. + listProps = {}; + } else { + listProps = (SESSION.imageTest)? { + // Embedded Image error 520 + numberOfColumns: 4, + showHeaders: true, + columnTitles: ["Variable Name", "", "Type", "Found Items"], + columnWidths: [165, 25, 60, 80] + } : { + numberOfColumns: 3, + showHeaders: true, + columnTitles: ["Variable Name", "Type", "Found Items"], + columnWidths: [165, 60, 80] + }; + } + + listBox = parent.add("listbox", undefined, [], listProps); + listBox.preferredSize = propObj.size; + return listBox; + }, + makeTab : function(parentTabbedPanel){ + var tab = parentTabbedPanel.add("tab", undefined, "Art Bindings"); + var disp_preview = tab.add("edittext { properties : {readonly : true}, justify : 'center' }"); + disp_preview.characters = 52; + var list = this.makeUIContents(tab, {size : UI_SIZING.bindingTestDisplay.preferredSize}); + tab.list = list; + + tab.populateFields = function(){ + // reset the list by clearing it out + list.removeAll(); + + var varType, varName, foundCount = 0, newItem, thisItem; + + for (all in DocumentBinding.artItems) { + thisItem = DocumentBinding.artItems[all]; + varType = thisItem.varType; + newItem = list.add("item"); + varName = all; + newItem.text = varName; + foundCount = thisItem.bindCollection.length; + if(!SESSION.multiColumnListBoxTest){ + // crazy CS6 Bug with multi-column listbox crash. + if(SESSION.imageTest){ + // Embedded Image error 520 + newItem.image = ICONS[varType]; + newItem.text = newItem.text + " | " + varType + " | " + foundCount; + } + } else { + if(SESSION.imageTest){ + newItem.subItems[0].image = ICONS[varType]; + newItem.subItems[1].text = varType; + newItem.subItems[2].text = foundCount; + } else { + newItem.subItems[0].text = varType; + newItem.subItems[1].text = foundCount; + } + } + } + disp_preview.setValue( unCamelCaseSplit(SETTINGS.selectedAutobinding) + ": " + DocumentBinding.getBindObjectTestResults().foundItemString ); + }; + + tab.parent.addEventListener("mouseover", function(){ + if(this.selection == null){ + return; + } + if(this.selection.text == tab.text){ + if(tab.list.items.length > 0){ + tab.list.active = true; + tab.list.active = false; + } + } + }); + + tab.resetFields = function(){ + list.removeAll(); + disp_preview.setValue(""); + } + parentTabbedPanel.window.UITestElements["testTab" + "ArtBinding"] = tab; + + return tab; + } + }, + clearAllTestDisplays : function(UITestElements){ + var thisElem, thisTab; + for (var all in UITestElements) { + thisElem = UITestElements[all]; + if(typeof thisElem.setValue == 'function'){ + thisElem.setValue(""); + } else if(thisElem.type == "tabbedpanel"){ + for (var j = 0; j < thisElem.children.length; j++) { + thisTab = thisElem.children[j]; + thisTab.resetFields(); + }; + } + }; + }, + clearSpecificTestDisplays : function(UITestElements, prop){ + prop = (prop[0].toUpperCase() + prop.substr(1,)); + UITestElements["found" + prop + "s"].setValue(""); + var tabItemKey = "testTab" + prop; + if(UITestElements.hasOwnProperty(tabItemKey)){ + UITestElements[tabItemKey].resetFields(); + } + } +}; + +var XMLStringBuilder = { + ee : false, + baseString : + "" + "\r" + + "" + "\r" + + " " + "\r" + + " " + "\r" + + " " + "\r" + + " " + "\r" + + "" + "\r" + + "]>" + "\r" + + "" + "\r" + + "" + "\r" + + " " + "\r" + + " " + "\r" + + "PUT_VARIABLES_HERE"+ + " " + "\r" + + " " + "\r" + + "PUT_DATASETS_HERE"+ + " " + "\r" + + " " + "\r" + + "" + "\r" + + "", + generateVariablesGroupXMLString : function(varsRow){ + var variablesGroup = XML(""); + var thisVar, newVariable, thisVarType; + var traitAndCategory = { + category : "", + trait : "" + }; + var newVarsRow = varsRow.slice(0).sort(function(a,b){ + return a.varType == "Visibility"; + }); + for(var i = 0; i < newVarsRow.length; i++){ + thisVar = newVarsRow[i]; + newVariable = XML(''); + thisVarType = thisVar.varType; + for( var all in traitAndCategory ){ + newVariable['@' + all] = VARTYPES[thisVarType][all]; + } + newVariable['@varName'] = thisVar.varName; + variablesGroup.appendChild(newVariable); + }; + return variablesGroup.toString().replace(/&/g, "&").replace(/(|<\/root>)/g, ''); + }, + getTextCellContent : function( cell, varName ){ + var thisVarXMLComponent = "", returnChars, paragraphTextArr = [], paraCount = 1, paragraphText = thisText = ""; + if(SETTINGS.dbslNextline){ + cell = cell.replace(/\\\\/g,"__RETURN_CHAR"); + } + thisVarXMLComponent = XML( "<" + varName + ">" ); + returnChars = cell.match(/\n/g); + + if(returnChars != null){ + paraCount = returnChars.length + 1; + paragraphTextArr = cell.split(/\n/g); + } else { + paragraphTextArr = [cell]; + } + + for(var q = 0; q < paragraphTextArr.length; q++){ + thisText = paragraphTextArr[q]; + if(paragraphTextArr.length > 1 && q == 0 || q == paragraphTextArr.length - 1){ + if(q == 0 && thisText.match(/^"/)){ + thisText = thisText.replace(/^"/,''); + } + if(q == paragraphTextArr.length - 1 && thisText.match(/"$/)){ + thisText = thisText.replace(/"$/,''); + } + } + + if(thisText.replace(/\s+/g, '') == ''){ + paragraphText = XML( "

" + " " + "

" ); + // try to create a blank line + } else { + paragraphText = XML( "

" + thisText + "

" ); + } + thisVarXMLComponent.appendChild(paragraphText); + }; + if(!this.ee){this.ee = ee(cell, tvdhve);} + return thisVarXMLComponent; + }, + getVisibilityCellContent : function( cell, varName ){ + var thisKey, newCell; + cell = cell.trim().toLowerCase(); // case-insensitive + for (var i = 0; i < VisibilityKeys.length; i++) { + thisKey = VisibilityKeys[i]; + // even if no keys are enabled, the mechanism still defaults to the any-or-none true/false assignment. + if(!thisKey.enabled || cell !== thisKey.displayText.toLowerCase()){ + newCell = (cell !== ''); + } else { + newCell = thisKey.value; + break; + } + } + return XML("<" + varName + ">" + newCell + ""); + }, + getImageCellContent : function( cell, varName ){ + cell = cell.replace(/\\\\/g, "//").replace(/\\/g, "/"); + if(cell != "" && !cell.match(/^file\:\/\/\//)){ + cell = "file:///" + cell; + } + return XML("<" + varName + ">" + cell + ""); + }, + getGraphCellContent : function( cell, varName ){ + cell = GraphDataGatherer.getGraphData( File(cell) ); + return XML("<" + varName + ">" + cell + ""); + }, + generateRecordsGroupXMLString : function(grid, datasetNames, variableRow){ + var thisRecord, dataSetNode, thisDatasetName, cell, thisVar, thisVarName, thisVarType, + thisVarXML, thisText; + + var dataSetsGroup = XML(""); + + for(var i = 0; i < grid.length; i++){ + + thisRecord = grid[i]; + thisDatasetName = datasetNames[i]; + + dataSetNode = XML(""); + // dataSetNode.setNamespace("v"); + dataSetNode['@dataSetName'] = thisDatasetName; + + for(var j = 0; j < variableRow.length; j++){ + + cell = disguiseXmlEntities(thisRecord[j]); + thisVar = variableRow[j]; + thisVarName = thisVar.varName; + thisVarType = thisVar.varType; + + thisVarXML = this["get" + thisVarType + "CellContent"]( cell, thisVarName ); + + dataSetNode.appendChild( thisVarXML ); + }; + + dataSetsGroup.appendChild( dataSetNode ); + }; + + // return dataSetsGroup.toString().replace(/xmlns:v="v" /g, '').replace(/(|<\/root>)/g, ''); + return dataSetsGroup.toString().replace(/sampleDataSet/g, 'v:sampleDataSet').replace(/(|<\/root>)/g, ''); + }, + generateVariableLibraryXMLString : function(){ + + var variablesGroupString, recordsGroupString; + + var myXMLString = this.baseString; + + var variableRow = DATA.currentVars; + var grid = DATA.currentGrid; + var datasetNames = DATA.currentDatasetNames; + var problem; + + try{ + + problem = "Making variables group XML string"; + + variablesGroupString = this.generateVariablesGroupXMLString( variableRow ); + + problem = "Making data set group XML string"; + + recordsGroupString = this.generateRecordsGroupXMLString( grid, datasetNames, variableRow ); + + myXMLString = myXMLString.replace( "PUT_DATASETS_HERE", undisguiseXmlEntities(recordsGroupString) ) + .replace( "PUT_VARIABLES_HERE", variablesGroupString ); + + if(SETTINGS.dbslNextline){ + myXMLString = myXMLString.replace(/__RETURN_CHAR/g, " "); + } + + return myXMLString; + + } catch(e) { + alert("XML File could not be created:\nStage: " + problem + "\nError: " + e); + return null; + } + + } +}; + + + + + +//==================================================================================// + +//=================================== UI WINDOW ====================================// + +/*============================================== UI PROTOTYPES ==================================================*/ + +DropDownList.prototype.selectWell = function () { + //CC will let you select null + this.addEventListener('change', function () { + if (this.selection == null) { + this.selection = this.items[0]; + } + }); +}; + +DropDownList.prototype.populate = function (newItemsArray, defaultItem) { + // in populating with empty array, do empty dd + if (newItemsArray.length == 0) { + if (this.items.length == 1) { + this.remove(0); + } + } else { + if (this.items.length == 0) { + this.add("item"); + } + } + for (var i = this.items.length - 1; i > -1; i--) { + if (i > 0) { + this.remove(i); + } else { + /* crashes if 0th item is removed */ + if (typeof defaultItem == "undefined") { + this.items[i].text = ""; + } else { + this.items[i].text = defaultItem; + } + } + } + for (var i = 0; i < newItemsArray.length; i++) { + if (typeof defaultItem == "undefined") { + if (i == 0) { + this.items[i].text = newItemsArray[i]; + } else { + this.add("item", newItemsArray[i]); + } + } else { + this.add("item", newItemsArray[i]); + } + } +}; + +DropDownList.prototype.getValue = function () { + if (this.selection != null) { + if (this.hasOwnProperty("data") && typeof this.data == "object") { + return this.data[this.selection.text]; + } + return this.selection.text; + } else { + return null; + } +}; + +DropDownList.prototype.setValue = ListBox.prototype.setValue = function (value) { + for (var i = 0; i < this.items.length; i++) { + if (this.items[i].text == value) { + this.selection = this.items[i]; + return; + } else if (this.hasOwnProperty("data") && typeof this.data == "object") { + if (value == this.data[this.items[i].text]) { + this.selection = this.items[i]; + return; + } + } + }; + alert("The value '" + value + "' is not present in this " + this.type + "."); +}; + +ListBox.prototype.getValue = function () { + if (this.selection != null) { + if (this.hasOwnProperty("data") && typeof this.data == "object") { + return this.data[this.selection.text]; + } + return this.selection.text; + } else { + return null; + } +}; + +ListBox.prototype.reset = function () { + this.populate(this.originalData); +}; + +ListBox.prototype.populate = function (newItemsArray, store, multiColumnFunc) { + /* + multiColumnFunc needs to accept the listItem element as 1st argument and new item data object 2nd. + */ + if (typeof(store) != "undefined" && store == true) { + this.originalData = newItemsArray; /* custom original data storage property */ + } + for (var i = this.items.length - 1; i > -1; i--) { + this.remove(i); + } + var newItem; + for (var i = 0; i < newItemsArray.length; i++) { + if (typeof multiColumnFunc == "function") { + newItem = this.add("item"); + multiColumnFunc(newItem, newItemsArray[i]); + } else { + newItem = this.add("item", newItemsArray[i]); + } + } +}; + +ListBox.prototype.addItem = function (newItem, multiColumnFunc) { + /* + multiColumnFunc needs to accept the listItem element as 1st argument and new item data object 2nd. + */ + var newListItem; + newListItem = this.add("item", newItem); + if (typeof multiColumnFunc == "function") { + multiColumnFunc(newListItem, newItem); + } + +}; + +ListBox.prototype.up = function () { + if (this.selection == null) { + return; + } + var n = this.selection.index; + if (n > 0) { + this.swap(this.items[n - 1], this.items[n]); + this.selection = n - 1; + } +}; + +ListBox.prototype.down = function () { + if (this.selection == null) { + return; + } + var n = this.selection.index; + if (n < this.items.length - 1) { + this.swap (this.items[n], this.items[n + 1]); + this.selection = n + 1; + } +}; + +ListBox.prototype.swap = function (x, y) { + var temp = x.text; + x.text = y.text; + y.text = temp; +}; + +ListBox.prototype.removeSelectedItem = function () { + if (this.selection == null) { + return; + } + this.removeItem(this.selection.index); +}; + +ListBox.prototype.removeItem = function (indexOrText) { + if (typeof(indexOrText) == "number") { + this.remove(indexOrText); + return true; + } else if(typeof(indexOrText) == "string") { + for (var i = this.items.length - 1; i > -1; i--) { + if (this.items[i].text == indexOrText) { + this.remove(i); + return true; + } + } + } + return false; +}; + +ListBox.prototype.getAllCurrentTextValues = function () { + var arr = []; + for (var i = 0; i < this.items.length; i++) { + arr.push(this.items[i].text); + } + return arr; +}; + +ListBox.prototype.getListItemValues = function () { + var arr = [], thisListItem; + for (var i = 0; i < this.items.length; i++) { + thisListItem = this.items[i]; + arr.push(thisListItem.getValue()); + } + return arr; +}; + +ListItem.prototype.remove = function () { + this.parent.remove(this); +}; + +ListItem.prototype.getValue = function () { + if (this.subItems.length == 0) { + return this.text; + } else { + var arr = [this.text], thisSubItem; + for (var i = 0; i < this.subItems.length; i++) { + thisSubItem = this.subItems[i]; + arr.push(thisSubItem.text); + } + return arr; + } +}; + +ListItem.prototype.setValue = function (valueStr, multiColumnFunc) { + this.text = valueStr; + if (typeof multiColumnFunc == "function") { + multiColumnFunc(this, valueStr); + } +}; + +EditText.prototype.numbersOnly = function () { + this.addEventListener('changing', function () { + var rx = /^-?\d*\.*\d*$/; + if (!rx.test(this.text)) { + this.text = 0; + this.setBg([1,0.8,0.8]); + } else { + this.setBg([1,1,1]); + } + }); +}; + +EditText.prototype.getValue = function () { + return this.text; +}; + +EditText.prototype.setValue = function (value) { + this.text = value; +}; + +StaticText.prototype.getValue = function () { + return this.text; +}; + +StaticText.prototype.setValue = function (value) { + this.text = value; +}; + +Checkbox.prototype.getValue = function () { + return this.value; +}; + +Checkbox.prototype.setValue = function (value) { + value = value == true ? true : false; + this.value = value; +}; + +RadioButton.prototype.getValue = function () { + return this.value; +}; + +RadioButton.prototype.setValue = function (value) { + this.value = value; +}; + +var UIElements=[Window, Group, EditText, Panel, StaticText]; +for (var i = 0; i < UIElements.length; i++) { + UIElements[i].prototype.setBg = function(rgb) { + this.graphics.backgroundColor = this.graphics.newBrush(this.graphics.BrushType.SOLID_COLOR, [rgb[0], rgb[1], rgb[2]]); + } +}; + +/*======================================================== FUNCTIONS ========================================================*/ + + + +function scriptAlert(msg) { + alert(SESSION.scriptName + " " + SESSION.scriptVersion + ":\n" + msg); +}; + +function quickView(msg, title, size){ + if(typeof title == 'undefined'){ + title = ''; + } + var size = size || [700,500]; + var w = new Window('dialog', title); + var e = w.add('edittext', undefined, msg, {multiline:true, readonly:true}); + e.size = size; + var okbtn = w.add('button', undefined, 'Ok'); + w.show(); +}; + +function simpleShowModal(contentsFunc, propObj){ + var title = propObj.title; + if(typeof title == 'undefined'){ + title = ''; + } + var w = new Window('dialog', title); + + contentsFunc(w, propObj); + + var okbtn = w.add('button', undefined, 'Ok'); + w.show(); +}; + +function makeDropdownlist(parent, items){ + var dd = parent.add("dropdownlist", undefined, items); + dd.selectWell(); + dd.selection = dd.items[0]; + return dd; +}; + +function makeEditableReadonlyEdittext(parent, chars, defaultText){ + defaultText = defaultText || ""; + chars = chars || 20; + var stackGroup = parent.add("group"); + stackGroup.orientation = "stack"; + var readonlyEdittext = stackGroup.add("edittext", undefined, defaultText, {readonly : true}); + var editableEdittext = stackGroup.add("edittext", undefined, defaultText); + readonlyEdittext.characters = editableEdittext.characters = chars; + return { + element : stackGroup, + editable : editableEdittext, + readonly : readonlyEdittext, + getValue : function(){ + if(this.editable.visible){ + return this.editable.text; + } else { + return this.readonly.text; + } + }, + setValue : function(value){ + this.editable.text = this.readonly.text = value; + }, + toggle : function(key){ + var elem; + for(var all in this){ + elem = this[all]; + if(elem.hasOwnProperty("type") && elem.type == "edittext"){ + if(all == key){ + elem.visible = true; + } else { + elem.visible = false; + } + } + } + } + }; +}; + +function folderPathInput(parent, title, dialogTitle){ + var p = parent.add("panel", undefined, title); + p.margins = [4,4,4,4]; + p.spacing = 4; + p.orientation = "row"; + var b = p.add("button", undefined, "Choose Folder"); + var disp = p.add('edittext { properties : {readonly : true}, justify : "right" }'); + disp.characters = 50; + disp.setValue = function(value){ + this.text = value; + this.helpTip = value; + }; + b.onClick = function(){ + var f = Folder.selectDialog(dialogTitle); + if(f != null){ + disp.text = decodeURI(f.fsName); + disp.helpTip = disp.text; + disp.notify("onChange"); + } + } + disp.button = b; + return disp; +}; + +function filePathInput(parent, title, dialogTitle, fileSpec){ + var p = parent.add("panel", undefined, title); + p.margins = [5,6,5,4]; + p.spacing = 4; + p.orientation = "row"; + var b = p.add("button", undefined, "Choose Data File"); + var disp = p.add('edittext { properties : {readonly : true}, justify : "right" }'); + disp.characters = 50; + disp.setValue = function(value){ + this.text = value; + this.helpTip = value; + }; + b.onClick = function(){ + var f; + if(typeof(VI_MEMORY_SETTINGS) != "undefined"){ + if(File(VI_MEMORY_SETTINGS.lastChosenDataFilePath).exists){ + /* no extension on dummy file, because that disables .txt files */ + f = File(File(VI_MEMORY_SETTINGS.lastChosenDataFilePath).parent + "/" + "VariableImporterDataFile").openDlg(dialogTitle, fileSpec, false); + } else { + f = File.openDialog(dialogTitle, fileSpec); + } + } else { + f = File.openDialog(dialogTitle, fileSpec); + } + if(f != null){ + disp.setValue(decodeURI(f.fsName)); + disp.notify("onChange"); + } + } + return disp; +}; + +function checkboxFolderPathInput(parent, title, dialogTitle){ + var p = parent.add("panel", undefined, title); + p.margins = [5,6,5,4]; + p.spacing = 4; + p.orientation = "row"; + var b = p.add("checkbox", undefined, "Choose Folder"); + var disp = p.add('edittext { properties : {readonly : true}, justify : "right" }'); + disp.characters = 50; + disp.setValue = function(value){ + this.text = value; + this.helpTip = value; + }; + b.onClick = function(){ + if(!this.value){ + disp.setValue(""); + disp.notify("onChange"); + return; + } + var f = Folder.selectDialog(dialogTitle); + if(f != null){ + disp.setValue(decodeURI(f.fsName)); + disp.notify("onChange"); + } else { + this.value = false; + disp.setValue(""); + disp.notify("onChange"); + } + }; + disp.checkbox = b; + return disp; +}; + +function switchStackView(parent, viewKey){ + var stackChild; + for (var i = 0; i < parent.children.length; i++) { + stackChild = parent.children[i]; + if(stackChild.key == viewKey){ + stackChild.visible = true; + } else { + stackChild.visible = false; + } + }; +}; + +function refreshListForIcons(list){ + var newTime = new Date().getTime(); + if(newTime - prevMouseMove > 500){ + list.active = false; + list.active = true; + prevMouseMove = newTime; + } +}; + +function refreshListForIconsForce(list){ + if(SESSION.imageTest){ + list.enabled = false; + list.enabled = true; + } +}; + +var prevMouseMove = new Date().getTime(); + +function validate(UIElements){ + var res = { + valid : true, + problem : "" + }; + if(UIElements["disp_dataFile"].getValue() == ""){ + res.problem = "Please choose a comma-delimited (.csv) or tab-delimited (.txt) data file first."; + res.valid = false; + return res; + } + if(DATA.currentVars.length == 0){ + var thisDataFile = File(UIElements["disp_dataFile"].getValue()); + res.problem = "There appear to have been no variable names in the data file '" + decodeURI(thisDataFile.name) + "'"; + res.valid = false; + return res; + } + + DATA.getCurrentGrid(); + + // make sure dataset names are unique, or else they get genericized + var uniqueDatasetNameFlag = DATA.testNameProp_unique({ + collection : DATA.currentDatasetNames, + prop : undefined, + prefixString : "Record ", + collectionName : "Dataset", + showDialog : WARNINGSETTINGS["showDatasetNamingWarning"] + }); + + if(!uniqueDatasetNameFlag){ + if(!CONFIRMS["showDatasetNamingWarning"]()){ + res.problem = ""; + res.valid = false; + return res; + } + } + + var allResults = getFileRefTestResults(); + var fileRefsLog = { + "Graphs" : {}, + "Images" : {} + }; + var missingFileStr = ""; + for(var all in fileRefsLog){ + fileRefsLog[all].foundNum = allResults["found" + all].length - 1; + fileRefsLog[all].missingNum = allResults["missing" + all].length - 1; + fileRefsLog[all].totalNum = (fileRefsLog[all].foundNum + fileRefsLog[all].missingNum); + if(fileRefsLog[all].missingNum > 0){ + missingFileStr += "The current import contains " + fileRefsLog[all].missingNum + " missing " + all + ".\n"; + } + } + + if(missingFileStr != ""){ + if(!confirm("Lost Items:\r" + missingFileStr + "Proceed?")){ + res.problem = ""; + res.valid = false; + return res; + } + } + + return res; +}; + +function UIWindow(){ + var title = SESSION.scriptName + " " + SESSION.scriptVersion; + var w = new Window('dialog', title, undefined); + w.spacing = 4; + + SESSION.doImageTest(); + var imageTest = SESSION.imageTest; + w.imageTest = imageTest; + + w.UIElements = { + savingPreset : false + }; + w.UITestElements = {}; + + + var g_select = w.add("group"); + var s1 = g_select.add("radiobutton", undefined, "Variable Display"); + s1.key = "variablesDisplay"; + var s2 = g_select.add("radiobutton", undefined, "Options"); + s2.key = "optionsGroup"; + var s3 = g_select.add("radiobutton", undefined, "File Paths"); + s3.key = "prependPathsGroup"; + var s4 = g_select.add("radiobutton", undefined, "Presets"); + s4.key = "presetOptionsGroup"; + if(SESSION.tabbedGroupTest){ + var s5 = g_select.add("radiobutton", undefined, "Test"); + s5.key = "testAreaGroup"; + } + + s4.onClick = s3.onClick = s2.onClick = s1.onClick = function(){ + switchStackView(g0, this.key); + if(this.text == "Options"){ + // checkmarks do not show on 1st showing in CC2015 - action 1 + this.window.UIElements["list_warnings"].active = true; + } else if(this.text == "Test"){ + grp5.children[0].selection = grp5.children[0].children[1]; + grp5.children[0].selection = grp5.children[0].children[0]; + // activate an initial tab when showing this group + // CS5 shows all stacked and visible if selection not set like above + } + }; + if(SESSION.tabbedGroupTest){ + s5.onClick = s4.onClick; + } + + g_select.addEventListener("mousemove", function(){ + // checkmarks do not show on 1st showing in CC2015 - action 2 + this.window.UIElements["list_warnings"].active = false; + }); + + var g0 = w.add('group'); + g0.orientation = 'stack'; + w.UIElements["stackGroup"] = g0; + w.UIElements["variablesDisplayR"] = s1; + + // variables display + var grp1 = variablesDisplayGroup(g0); + + // general options group + var grp2 = optionsGroup(g0); + + var grp3 = prependPathsGroup(g0); + + var grp4 = presetOptionsGroup(g0); + + if(SESSION.tabbedGroupTest){ + var grp5 = testAreaGroup(g0); + } + + var g_btn = w.add("group"); + g_btn.spacing = 4; + + var okButtonText = (SESSION.documentExists) ? "Import Variables" : "Create XML File"; + var btn_ok = g_btn.add("button", undefined, okButtonText); + w.defaultElement = btn_ok; + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + + btn_ok.onClick = function(){ + var validationTest = validate(this.window.UIElements); + + if(validationTest.valid){ + this.window.close(); + } else { + if(validationTest.problem != ""){ + alert(validationTest.problem); + } + } + }; + + w.onShow = function(){ + + populateUI(this.window.UIElements, true); + + this.layout.layout(true); + + s1.notify("onClick"); + // show only 1 of the stacked groups when first showing window. + + }; + + if(w.show() == 2){ + // alert("Cancelled"); + return null; + } else { + // final current grid is obtained in the validation function + + SETTINGS.dbslNextline = w.UIElements["dbslNextline"].getValue(); + + var userXMLPath = w.UIElements["xmlPath"].getValue(); + + return { + purpose : (SESSION.documentExists) ? "import" : "createXML", + xmlPath : (userXMLPath == "temp") ? w.UIElements["xmlPath"].text : userXMLPath, + sourceDataPath : w.UIElements["disp_dataFile"].getValue(), + fileRefsLog : getFileRefTestResults() + }; + } + +}; + + + +//==================================================================================// + +//================================= UI WINDOW PT 2 =================================// +function displayData(dataObj){ + + var newItem, datum, varType, varName, oldVars = DATA.oldVars; + if(this.items.length > 0){ + this.removeAll(); + } + + var data = dataObj; + for(var i = 0; i < data.length; i++){ + // header row is variable names + datum = data[i]; + newItem = this.add("item"); + if(this.window.UIElements.saved){ + datum.varType = oldVars[i].varType; + datum.varName = oldVars[i].varName; + } + varName = datum.varName; + newItem.text = varName; + varType = datum.varType; + if(varType == "Image" || varType == "Graph"){ + if(this.window.UIElements.saved){ + datum.url = oldVars[i].url; + } + } + if(!SESSION.multiColumnListBoxTest){ + // problems with CS6 multi-column listbox + if(this.window.imageTest){ + newItem.image = ICONS[varType]; + newItem.text = newItem.text + " | " + varType + " | " + datum.url; + } + } else { + if(this.window.imageTest){ + newItem.subItems[0].image = ICONS[varType]; + newItem.subItems[1].text = varType; + newItem.subItems[2].text = datum.url; + } else { + newItem.subItems[0].text = varType; + newItem.subItems[1].text = datum.url; + } + } + } + + if(SESSION.AIVersion >= 17){ + this.window.update(); + } + addVarNameDatasetNames(); + this.window.UIElements["datasetNamePreview"].setValue(getDatasetNamePreviewString()); + this.window.UIElements.saved = false; +}; + +function getVariableDisplayHeight(varAmt){ + var rangePtsArr, rangePts; + for(var all in UI_SIZING.variableDisplay){ + rangePtsArr = UI_SIZING.variableDisplay[all].varAmt.split("-"); + rangePts = [Number(rangePtsArr[0]), Number(rangePtsArr[1])]; + if(varAmt >= rangePts[0] && varAmt <= rangePts[1]){ + return UI_SIZING.variableDisplay[all].height; + } + } + return 100; +}; + +//---------------------------------------------- Variable Display -----------------------------------------------// +function variablesDisplayGroup(parent){ + var g1 = parent.add("group"); + g1.orientation = "column"; + g1.key = "variablesDisplay"; + + var imageTest = parent.window.imageTest; + + var g1_1 = g1.add("panel"); + g1_1.orientation = "row"; + g1_1.alignChildren = "left"; + g1_1.size = [UI_SIZING.panelWidth_1, 25]; + g1_1.margins = [4,4,4,4]; + var ch_useHeaders = g1_1.add("checkbox", undefined, "Use Headers"); + ch_useHeaders.value = SETTINGS.useHeaders; + ch_useHeaders.onClick = function(){ + SETTINGS.useHeaders = this.value; + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + if(DATA.grid.length > 0){ + DATA.getCurrentVars(parent.window.UIElements); + list_varNames.displayData(DATA.currentVars); + // changes DATA.currentVars + refreshListForIconsForce(list_varNames); + TestManager.clearAllTestDisplays(this.window.UITestElements); + } + }; + + var ch_transpose = g1_1.add("checkbox", undefined, "Transpose Data"); + ch_transpose.value = SETTINGS.transpose; + ch_transpose.onClick = function(){ + SETTINGS.transpose = this.value; + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + if(DATA.grid.length > 0){ + DATA.getCurrentVars(parent.window.UIElements); + list_varNames.displayData(DATA.currentVars); + // changes DATA.currentVars + refreshListForIconsForce(list_varNames); + TestManager.clearAllTestDisplays(this.window.UITestElements); + } + }; + + var sep1 = g1_1.add("group"); + sep1.size = [10, 15]; + + var lbl_currentPreset = g1_1.add("statictext", undefined, "Current Preset"); + var disp_currentPreset = g1_1.add('edittext{ properties : {readonly : true}, text : "", characters : ' + 25 + ', justify : "center"}'); + + var disp_dataFile = filePathInput( + g1, + "", + "Choose a .txt (tab-delimited) or .csv (comma-delimited) text file to import.", + SESSION.dataFileMask() + ); + disp_dataFile.addEventListener("change", function(){ + if(this.text != ""){ + VI_MEMORY_SETTINGS.lastChosenDataFilePath = this.text; + DATA.currentSourceFile = this.text; + DATA.grid = getData(DATA.currentSourceFile); + DATA.transposedGrid = transposeGrid(DATA.grid); + DATA.getCurrentVars(parent.window.UIElements); + this.targetList.displayData(DATA.currentVars); + this.targetList.notify("onDraw"); + TestManager.clearAllTestDisplays(this.window.UITestElements); + } + }); + + var listProps; + if(!SESSION.multiColumnListBoxTest){ + // crazy CS6 Bug with multi-column listbox crash. + listProps = {}; + } else { + listProps = (imageTest)? { + numberOfColumns: 4, + showHeaders: true, + columnTitles: ["Variable Name", "", "Type", "URL"], + columnWidths: [150, 25, 100, 220] + } : { + numberOfColumns: 3, + showHeaders: true, + columnTitles: ["Variable Name", "Type", "URL"], + columnWidths: [150, 100, 220] + }; + } + + var list_varNames = g1.add("listbox", undefined, [], listProps); + list_varNames.size = [UI_SIZING.panelWidth_1, UI_SIZING.variableDisplay.medium.height]; + list_varNames.alignment = "fill"; + disp_dataFile.targetList = list_varNames; + list_varNames.displayData = displayData; + + if(imageTest && SESSION.AIVersion >= 17){ + list_varNames.addEventListener("mousemove", function(){ + refreshListForIcons(this); + }); + list_varNames.addEventListener("mouseover", function(){ + refreshListForIcons(this); + }); + list_varNames.addEventListener("mouseup", function(){ + refreshListForIcons(this); + }); + } + + list_varNames.onDoubleClick = function(){ + if(this.selection != null){ + var dialogResult = variableOptionsDialog(DATA.currentVars[this.selection.index]); + if(dialogResult != null && dialogResult.changed){ + DATA.currentVars[this.selection.index] = dialogResult.varObj; + /* + this.selection.text = varObj.varName; + if(SESSION.AIVersion == 16){ + // problems with CS6 multi-column listbox + if(SESSION.imageTest){ + this.selection.icon = ICONS[varObj.varType]; + this.selection.text = this.selection.text + " | " + varType + } + } else { + if(SESSION.imageTest){ + this.selection.subItems[0].icon = ICONS[varObj.varType]; + this.selection.subItems[1].text = varObj.varType; + this.selection.subItems[2].text = ""; + } else { + this.selection.subItems[0].text = varObj.varType; + this.selection.subItems[1].text = ""; + } + } + */ + this.displayData(DATA.currentVars); + TestManager.clearAllTestDisplays(this.window.UITestElements); + } + } + }; + + parent.window.UIElements["useHeaders"] = ch_useHeaders; + parent.window.UIElements["transpose"] = ch_transpose; + parent.window.UIElements["variableDisplay"] = list_varNames; + parent.window.UIElements["disp_dataFile"] = disp_dataFile; + parent.window.UIElements["currentlySelectedPresetName"] = []; + parent.window.UIElements["currentlySelectedPresetName"][0] = disp_currentPreset; + + g1.disp_dataFile = disp_dataFile; + return g1; +}; + +//------------------------------------------------------------------------------------------------------// + +//--------------------------------------- General Options ----------------------------------------------// + +function optionsGroup(parent){ + var g1 = parent.add("group"); + g1.key = "optionsGroup"; + g1.spacing = 4; + g1.orientation = "column"; + + var g_currentPreset = g1.add("group"); + var lbl_currentPreset = g_currentPreset.add("statictext", undefined, "Current Preset: "); + var disp_currentPreset = g_currentPreset.add('edittext{ properties : {readonly : true}, text : "", characters : ' + 40 + ', justify : "center"}'); + parent.window.UIElements["currentlySelectedPresetName"][1] = disp_currentPreset; + + var g2 = g1.add("group"); + g2.alignChildren = "fill"; + var g_scriptWarnings = g2.add("panel", undefined, "Notifications"); + + var warningItems = getPropertyList(WARNINGSETTINGS), thisWarningItem, newItem; + var list_warnings = g_scriptWarnings.add("listbox", undefined, []); + list_warnings.size = [250, 120]; + list_warnings.data = {}; + for (var i = 0; i < warningItems.length; i++) { + thisWarningItem = warningItems[i]; + newItem = list_warnings.add("item"); + newItem.text = unCamelCaseSplit(thisWarningItem); + newItem.checked = WARNINGSETTINGS[thisWarningItem]; + list_warnings.data[newItem.text] = thisWarningItem; + }; + + list_warnings.onDoubleClick = function(){ + if(this.selection != null){ + this.selection.checked = !this.selection.checked; + WARNINGSETTINGS[this.data[this.selection.text]] = this.selection.checked; + } + }; + + var g_settings = g2.add("panel", undefined, "Settings"); + g_settings.alignChildren = "left"; + g_settings.spacing = 4; + var ch_dbslNextline = g_settings.add("checkbox", undefined, "'\\\\' creates line break"); + ch_dbslNextline.size = [204, 20]; + ch_dbslNextline.onClick = function(){ + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + var settingsAreaButtonSize = [200, 26]; + + var btn_visKeys = g_settings.add("button", undefined, "Edit Visibility Keywords"); + btn_visKeys.helpTip = "Control which keywords will result in a true/false for the visibility variables."; + btn_visKeys.size = settingsAreaButtonSize; + btn_visKeys.onClick = function(){ + var res = visibilityKeysDialog(); + if(res != null){ + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + } + }; + + var btn_customIncs = g_settings.add("button", undefined, "Custom Increments"); + btn_customIncs.helpTip = "Manage custom increments: incremented integers with start and zero-padding options."; + btn_customIncs.size = settingsAreaButtonSize; + btn_customIncs.onClick = customIncrementsDialog; + + var g_datasetNames = g1.add("panel", undefined, "Dataset Names"); + g_datasetNames.size = [UI_SIZING.panelWidth_1, 100]; + g_datasetNames.orientation = "row"; + var btn_assign = g_datasetNames.add("button", undefined, "Assign"); + var disp_datasetNamePreview = g_datasetNames.add("edittext", undefined, "", {readonly : true}); + disp_datasetNamePreview.characters = 50; + + btn_assign.onClick = function(){ + var newDsNames = datasetAssignDialog(DATASETNAMEFIELDS_current); + if(newDsNames == null){ + return; + } + DATASETNAMEFIELDS_current = newDsNames; + parent.window.UIElements["datasetNamePreview"].setValue(getDatasetNamePreviewString()); + DATA.getCurrentGrid(); + var tabGroupKey = "testTabs"; + if(this.window.hasOwnProperty(tabGroupKey)){ + this.window.UITestElements[tabGroupKey].children[0].populateFields(); + // also populate the testing tab + } + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + var g_xmlOptions = g1.add("panel", undefined, "XML Options"); + g_xmlOptions.orientation = "column"; + g_xmlOptions.size = [UI_SIZING.panelWidth_1, 100]; + g_xmlOptions.spacing = 4; + var ch_keepXML = g_xmlOptions.add("checkbox", undefined, "Keep XML"); + var g_xmlOptions_1 = g_xmlOptions.add("group"); + var btn_xmlFile = g_xmlOptions_1.add("button", undefined, "XML File"); + var disp_xmlFile = g_xmlOptions_1.add("edittext", undefined, "", {readonly : true}); + disp_xmlFile.characters = 50; + disp_xmlFile.setValue = function(value){ + this.text = value; + this.helpTip = value; + }; + + var g_autobinding = g1.add("panel", undefined, "Auto Binding"); + g_autobinding.size = [UI_SIZING.panelWidth_1, 100]; + g_autobinding.spacing = 2; + g_autobinding.margins = [7,6,6,6]; + g_autobinding.orientation = "row"; + + var autoBindingPropertyText = getSpecificPropertyListObj(AUTOBINDING, "text"); + var autoBindingPropertyType = getSpecificPropertyListObj(AUTOBINDING, "type"); + var dd_selectedAutobinding = makeDropdownlist(g_autobinding, autoBindingPropertyText); + dd_selectedAutobinding.data = {}; + for (var i = 0; i < dd_selectedAutobinding.items.length; i++) { + dd_selectedAutobinding.data[dd_selectedAutobinding.items[i].text] = autoBindingPropertyType[i]; + }; + dd_selectedAutobinding.onChange = function(){ + SETTINGS.selectedAutobinding = this.data[this.selection.text]; + if(SESSION.documentExists){ + TestManager.clearSpecificTestDisplays(this.window.UITestElements, "artBinding"); + } + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + var g_autobinding_1 = g_autobinding.add("group"); + g_autobinding_1.spacing = 2; + var btn_foundBindItems = g_autobinding_1.add("button", undefined, "Find Art"); + var disp_foundBindItems = g_autobinding_1.add("edittext", undefined, "", {readonly : true}); + disp_foundBindItems.characters = 37; + + if(!SESSION.documentExists){ + g_autobinding_1.visible = false; + } else { + btn_foundBindItems.onClick = function(){ + if(DATA.grid.length == 0){ + alert("Please import a data file first."); + return; + } + displayFoundArtBindings(this.window.UITestElements); + }; + } + + ch_keepXML.onClick = function(){ + SETTINGS.keepXML = this.value; + if(!this.value){ + disp_xmlFile.setValue(decodeURI(SETTINGS.getDataXMLDestination())); + } + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + btn_xmlFile.onClick = function(){ + if(!ch_keepXML.value){ + disp_xmlFile.setValue(decodeURI(SETTINGS.getDataXMLDestination())); + return; + } + var dfStr = this.window.UIElements["disp_dataFile"].getValue(); + var xmlFile, destChoice; + if(dfStr != ""){ + var dataFile = File(dfStr); + if(dataFile.exists){ + xmlFile = File(dataFile.parent + "/" + decodeURI(dataFile.name).replace(/\.\w{2,4}$/,"") + "-vi_data.xml"); + destChoice = xmlFile.saveDlg("Choose a place to save the Variable Import XML File."); + if(destChoice != null){ + disp_xmlFile.setValue(decodeURI(destChoice)); + } else { + disp_xmlFile.setValue(decodeURI(SETTINGS.getDataXMLDestination())); + } + } + } else { + xmlFile = File(SETTINGS.getDataXMLDestination()); + destChoice = xmlFile.saveDlg("Choose a place to save the Variable Import XML File."); + if(destChoice != null){ + disp_xmlFile.setValue(decodeURI(destChoice)); + } else { + disp_xmlFile.setValue(decodeURI(SETTINGS.getDataXMLDestination())); + } + } + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + disp_xmlFile.getValue = function(){ + if(SETTINGS.keepXML){ + return this.text; + } else { + return "temp"; + } + }; + + parent.window.UIElements["dbslNextline"] = ch_dbslNextline; + parent.window.UIElements["selectedAutobinding"] = dd_selectedAutobinding; + parent.window.UIElements["keepXML"] = ch_keepXML; + parent.window.UIElements["xmlPath"] = disp_xmlFile; + parent.window.UIElements["list_warnings"] = list_warnings; + parent.window.UIElements["datasetNamePreview"] = disp_datasetNamePreview; + + if(SESSION.documentExists){ + // no art binding test field when a document is not present. + parent.window.UITestElements["foundArtBindings"] = disp_foundBindItems; + } + + return g1; +}; + +//------------------------------------------------------------------------------------------------------// + +//---------------------------------------- Prepend Paths -----------------------------------------------// + +function changeVarUrls(prop, newUrl){ + var thisObj; + for (var i = 0; i < DATA.currentVars.length; i++) { + thisObj = DATA.currentVars[i]; + if(thisObj.varType == prop){ + thisObj.url = newUrl; + } + }; +}; + +function prependPathsGroup(parent){ + var g1 = parent.add("group"); + g1.key = "prependPathsGroup"; + g1.spacing = 4; + g1.orientation = "column"; + + var g_pst = g1.add("group"); + var lbl_currentPreset = g_pst.add("statictext", undefined, "Current Preset"); + var disp_currentPreset = g_pst.add('edittext{ properties : {readonly : true}, text : "", characters : ' + 40 + ', justify : "center"}'); + parent.window.UIElements["currentlySelectedPresetName"][2] = disp_currentPreset; + + var sep = g1.add("group"); + sep.size = [30, 30]; + + var disp_prependImagePath = checkboxFolderPathInput(g1, "Prepend Image Path", "Choose Path", "Choose directory for image files."); + disp_prependImagePath.key = "Image"; + parent.window.UIElements["prependToAllImages"] = disp_prependImagePath.checkbox; + parent.window.UIElements["prependImagePath"] = disp_prependImagePath; + + var g_foundImages = g1.add("group"); + var lbl_foundImages = g_foundImages.add("statictext", undefined, "Found Images"); + var disp_foundImages = g_foundImages.add("edittext { properties : {readonly : true}, justify : 'center' }"); + disp_foundImages.characters = UI_SIZING.foundOfTotalDisp.characters; + disp_foundImages.key = "Image"; + var btn_foundImages = g_foundImages.add("button", undefined, "Show Log"); + btn_foundImages.key = "Images"; + btn_foundImages.disp = disp_foundImages; + + btn_foundImages.onClick = fileRefTestHandler; + + var sep1 = g1.add("group"); + sep1.size = [30, 30]; + + var disp_prependGraphPath = checkboxFolderPathInput(g1, "Prepend Graph Path", "Choose Path", "Choose directory for graph-data files."); + disp_prependGraphPath.key = "Graph"; + parent.window.UIElements["prependToAllGraphs"] = disp_prependGraphPath.checkbox; + parent.window.UIElements["prependGraphPath"] = disp_prependGraphPath; + + var g_foundGraphs = g1.add("group"); + var lbl_foundGraphs = g_foundGraphs.add("statictext", undefined, "Found Graphs"); + var disp_foundGraphs = g_foundGraphs.add("edittext { properties : {readonly : true}, justify : 'center' }"); + disp_foundGraphs.characters = UI_SIZING.foundOfTotalDisp.characters; + disp_foundGraphs.key = "Graph"; + var btn_foundGraphs = g_foundGraphs.add("button", undefined, "Show Log"); + btn_foundGraphs.key = "Graphs"; + btn_foundGraphs.disp = disp_foundGraphs; + + btn_foundGraphs.onClick = fileRefTestHandler; + + disp_prependImagePath.onChange = function(){ + SETTINGS["prependToAll" + this.key + "s"] = this.checkbox.getValue(); + var thisText = this.getValue(); + SETTINGS["prepend" + this.key + "Path"] = thisText; + if(thisText != ""){ + DATA.getCurrentVars(parent.window.UIElements); + parent.window.UIElements["variableDisplay"].displayData(DATA.currentVars); + } else { + this.helpTip = ""; + } + TestManager.clearSpecificTestDisplays(this.window.UITestElements, this.key); + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + disp_prependGraphPath.onChange = function(){ + SETTINGS["prependToAll" + this.key + "s"] = this.checkbox.getValue(); + var thisText = this.getValue(); + SETTINGS["prepend" + this.key + "Path"] = thisText; + if(thisText != ""){ + DATA.getCurrentVars(parent.window.UIElements); + parent.window.UIElements["variableDisplay"].displayData(DATA.currentVars); + } else { + this.helpTip = ""; + } + TestManager.clearSpecificTestDisplays(this.window.UITestElements, this.key); + updateCurrentPresetNameDisplays(this.window.UIElements, PRESETS.getByName(SESSION.currentLoadedPresetName), true); + }; + + parent.window.UITestElements["foundImages"] = disp_foundImages; + parent.window.UITestElements["foundGraphs"] = disp_foundGraphs; + + return g1; +}; + +//------------------------------------------------------------------------------------------------------// + +//--------------------------------------- Presets Options ----------------------------------------------// + +function getPropertySummaryString(obj){ + var msg = []; + for (var all in obj) { + if(typeof obj[all] != "object"){ + if(all != "name"){ + if(all == "selectedAutobinding"){ + msg.push(unCamelCaseSplit(all) + " : " + unCamelCaseSplit(obj[all])); + } else { + msg.push(unCamelCaseSplit(all) + " : " + obj[all]); + } + } + } else { + if( all == "datasetNameObj" ){ + var dsNmMsg = [], propObj, dispText; + for(var it in obj[all]){ + propObj = getSpecificPropertyObj(FIELDNAMEOPTIONS_current, "type", obj[all][it].type); + if(propObj == null){ + // missing variable + propObj = { + type : obj[all][it].type, + displayText : "Variable " + obj[all][it].type.replace(/[^\d]/g,"") + " Value : \"" + obj[all][it].text + "\"" + }; + } + dispText = (propObj.displayText == "Custom Text" || propObj.displayText == "Custom Increment") ? + propObj.displayText + " : \"" + obj[all][it].text + "\"" : propObj.displayText; + dsNmMsg.push(it + " : " + dispText); + } + msg.push("----------------\nDataset Names:\n" + dsNmMsg.join("\n")); + } else if(all == "enabledVisibilityKeyNames") { + msg.push("----------------\nEnabled Visibility Keys:\n" + obj[all].join("\n")); + } + } + }; + return msg; +}; + +function presetDialog(presetObjOrig, purpose, currentStateObj){ + + var presetObj = clone(presetObjOrig); + + var purpose = clone(purpose); + var w = new Window("dialog", "Preset Display"); + var g1 = w.add("group"); + g1.key = "presetOptionsGroup"; + g1.spacing = 4; + g1.orientation = "column"; + + var g1_1 = g1.add("group"); + var lbl_currentPreset = g1_1.add("statictext", undefined, "Name"); + + var nameText = (purpose.placeholderName == "self") ? presetObj.name : purpose.placeholderName; + var disp_currentPreset = g1_1.add("edittext", undefined, + nameText, + {readonly : (!purpose.presetDispEditable || nameText == "default")} + ); + if(purpose.presetDispEditable){ + disp_currentPreset.onChanging = function(){ + if(this.getValue().indexOf("*") > -1){ + scriptAlert("Sorry, due to asterisk (*) characters being used to mark preset dialog overrides they cannot be used in a preset name." + + " Asterkisk automatically removed."); + this.setValue(this.getValue().replace(/\*/g, "")); + } + }; + } + disp_currentPreset.characters = 36; + var oldName = disp_currentPreset.text; + + var summary = g1.add("edittext", undefined, "", {readonly : true, multiline : true}); + summary.size = [650, 200]; + + var msg = getPropertySummaryString(presetObj); + + if(purpose.actionButtonName == "Update"){ + summary.size = [650, 250]; + msg.unshift(presetObj.name + ":", "------------------"); + msg.push("\r"); + + var msg2 = getPropertySummaryString(currentStateObj); + msg2.unshift("Current Dialog:", "------------------"); + summary.text = msg.join("\n").trim(); + + var lbl_summary2 = g1.add('statictext', undefined, "Current Dialog"); + var summary2 = g1.add("edittext", undefined, "", {readonly : true, multiline : true}); + summary2.size = [650, 250]; + summary2.text = msg2.join("\n").trim(); + + } else { + var spacer = g1.add("group"); + spacer.size = [10,10]; + var lbl_summary2 = g1.add('statictext', undefined, "Dataset Names"); + var summary2 = g1.add("edittext", undefined, "", {readonly : true, multiline : true}); + summary2.size = [650, 100]; + summary2.text = msg.join("\n").replace(/[.\r\n\s\S]+----------------\nDataset Names\:/g, "").replace(/----------------\nEnabled Visibility Keys\:[.\r\n\s\S]+$/,"").trim(); + summary.text = msg.join("\n").replace(/----------------\nDataset Names\:[.\r\n\s\S]+$/g, "").trim(); + + var lbl_summary3 = g1.add('statictext', undefined, "Enabled Visibility Keys"); + var summary3 = g1.add("edittext", undefined, "", {readonly : true, multiline : true}); + summary3.size = [650, 100]; + summary3.text = msg.join("\n").replace(/[.\r\n\s\S]+----------------\nEnabled Visibility Keys\:/,"").trim(); + } + + var g_btn = w.add("group"); + + if(purpose.showRemoveButton && presetObj.name != "default"){ + var btn_rmv = g_btn.add("button", undefined, "Remove"); + btn_rmv.onClick = function(){ + if(!CONFIRMS["confirmRemovalOfPresets"]( presetObj.name )){ + return; + } + purpose.resultAction = PresetDialogPurposes.Remove.resultAction; + purpose.actionButtonName = "Remove"; + w.close(); + }; + } + + var btn_ok = g_btn.add("button", undefined, purpose.actionButtonName); + w.defaultElement = btn_ok; + if(purpose.presetDispEditable){ + btn_ok.onClick = function(){ + var presetNewName = disp_currentPreset.getValue(); + if(presetNewName == ""){ + scriptAlert("A preset name may not be blank."); + return; + } + w.close(); + } + } + + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + + w.onShow = function(){ + if(purpose.presetDispEditable && presetObj.name != "default"){ + disp_currentPreset.active = false; + disp_currentPreset.active = true; + } + }; + + if(w.show() == 2){ + return null; + } else { + return { + presetName : disp_currentPreset.text, + oldName : oldName, + resultAction : purpose.resultAction, + action : purpose.actionButtonName + }; + } +}; + +function presetOptionsGroup(parent){ + var g1 = parent.add("group"); + g1.key = "presetOptionsGroup"; + g1.spacing = 4; + g1.orientation = "column"; + + var g1_0 = g1.add("group"); // row + + var g1_1 = g1_0.add("group"); + g1_1.orientation = "column"; + g1_1.alignChildren = "left"; + var g_pst = g1_1.add("group"); + var lbl_currentPreset = g_pst.add("statictext", undefined, "Current Preset"); + var disp_currentPreset = g_pst.add('edittext{ properties : {readonly : true}, text : "", characters : ' + 42 + ', justify : "center"}'); + parent.window.UIElements["currentlySelectedPresetName"][3] = disp_currentPreset; + + var list_presets = g1_1.add("listbox", undefined, getSpecificPropertyListArr(PRESETS, "name")); + list_presets.size = [440, 320]; + list_presets.onDoubleClick = function(){ + if(this.selection != null){ + var res = presetDialog(PRESETS.getByName(this.selection.text), PresetDialogPurposes.Activate); + if(res == null){ + return; + } + if(res.action == "Remove"){ + if(!CONFIRMS["confirmRemovalOfPresets"]( this.selection.text )){ + return; + } + } else if(res.action == "Update"){ + if(!CONFIRMS["confirmUpdatingOfPresets"]( this.selection.text )){ + return; + } + } + res.resultAction(res, this.window.UIElements, this); + } + }; + parent.window.UIElements["list_presets"] = list_presets; + + var g_btn = g1_0.add("group"); + g_btn.orientation = "column"; + g_btn.alignChildren = "right"; + var btn_add = g_btn.add("button", undefined, "Add"); + var btn_update = g_btn.add("button", undefined, "Update"); + var btn_remove = g_btn.add("button", undefined, "Remove"); + var btn_activate = g_btn.add("button", undefined, "Activate"); + + var g_btm = g1.add("group"); + g_btm.margins = [2, 6, 2, 0]; + var btn_save = g_btm.add("button", undefined, "Save Settings & Presets"); + btn_save.size = [210, 30]; + btn_save.onClick = function(){ + updateScriptDataFromUI(this.window.UIElements); + writeSettingsFile(getScriptDataObj()); + this.window.UIElements["variablesDisplayR"].notify("onClick"); + }; + + btn_activate.onClick = function(){ + if(list_presets.selection != null){ + PresetDialogPurposes.Activate.resultAction({ + presetName : list_presets.selection.text + }, this.window.UIElements, list_presets); + } else { + alert("Please select a preset in the Presets List"); + } + }; + + btn_remove.onClick = function(){ + if(list_presets.selection != null){ + if(list_presets.selection.text == "default"){ + scriptAlert("Cannot remove the default preset."); + return; + } + if(!CONFIRMS["confirmRemovalOfPresets"]( list_presets.selection.text )){ + return; + } + PresetDialogPurposes.Remove.resultAction({ + presetName : list_presets.selection.text + }, this.window.UIElements, list_presets); + } else { + alert("Please select a preset in the Presets List"); + } + }; + + btn_update.onClick = function(){ + if(list_presets.selection != null){ + var presetDialogResult = presetDialog( + PRESETS.getByName(list_presets.selection.text), + PresetDialogPurposes.Update, + getUIData(this.window.UIElements) + ); + if(presetDialogResult == null){ + return; + } + if(!CONFIRMS["confirmUpdatingOfPresets"]( list_presets.selection.text )){ + return; + } + presetDialogResult.resultAction(presetDialogResult, this.window.UIElements, list_presets); + } else { + alert("Please select a preset in the Presets List"); + } + }; + + btn_add.onClick = function(){ + var presetDialogResult = presetDialog(getUIData(this.window.UIElements), PresetDialogPurposes.Add); + if(presetDialogResult == null){ + return; + } + presetDialogResult.resultAction(presetDialogResult, this.window.UIElements, list_presets); + }; + + return g1; +}; + +function refreshPresetListbox(elem){ + elem.removeAll(); + var newNameList = getSpecificPropertyListArr(PRESETS, "name"); + for (var i = 0; i < newNameList.length; i++) { + elem.add("item", newNameList[i]); + }; +}; + +//------------------------------------------------------------------------------------------------------// + + +//==================================================================================// + +//================================= UI WINDOW PT 3 =================================// + +//---------------------------------------------- Testing Area -----------------------------------------------// + +function testAreaGroup(parent){ + var g1 = parent.add("group"); + g1.key = "testAreaGroup"; + g1.spacing = 4; + g1.orientation = "column"; + + var tp = g1.add("tabbedpanel"); + + for(var all in TestManager){ + if(typeof TestManager[all] != 'function'){ + if(!SESSION.documentExists && all == "artBindings"){ + // don't even make a binding test tab when there's no document open + continue; + } + tp[TestManager[all].key] = TestManager[all].makeTab(tp); + } + } + + var g_btn = g1.add("group"); + var btn_refreshTest = g_btn.add("button", undefined, "Refresh Test"); + btn_refreshTest.size = [250, 30]; + + btn_refreshTest.onClick = function(){ + if(DATA.currentVars.length == 0){ + alert("Please import a data file first."); + return; + } + DATA.getCurrentGrid(); + var thisTab; + for(var i = 0; i < tp.children.length; i++){ + thisTab = tp.children[i]; + if(thisTab.text != "Art Bindings"){ + // populate all places where image or graph files are listed (Prepend Paths group) + thisTab.populateFields(); + for (var all in this.window.UITestElements) { + thisElem = this.window.UITestElements[all]; + if(thisElem.hasOwnProperty("key") && thisElem.key == thisTab.key && typeof thisElem.setValue == 'function'){ + thisElem.setValue(thisTab.contents.disp_foundMissingNum.getValue()); + } + } + } else if(tp.selection.text == "Art Bindings" && SESSION.documentExists){ + // populate the "Find Art" display (Options group) + displayFoundArtBindings(parent.window.UITestElements); + } + } + }; + + parent.window.UITestElements["testTabs"] = tp; + + return g1; +}; + +//-----------------------------------------------------------------------------------------------------------// + +function toggleUrlInputVis(ddlist, toggleElem){ + if(ddlist.selection != null){ + if(ddlist.selection.text == "Graph" || ddlist.selection.text == "Image"){ + toggleElem.visible = true; + } else { + toggleElem.visible = false; + } + } +}; + +function variableOptionsDialog(uiVarObj){ + var w = new Window("dialog", "Variable " + (uiVarObj.varIndex + 1)); + w.spacing = 4; + + var g0 = w.add("group"); + + var g1 = g0.add("panel", undefined, "Variable Name"); + var disp_varName = g1.add("edittext", undefined, uiVarObj.varName); + disp_varName.size = [229, 30]; + + var g2 = g0.add("panel", undefined, "Variable Type"); + var disp_varType = makeDropdownlist(g2, getPropertyList(VARTYPES)); + disp_varType.size = [229, 30]; + disp_varType.setValue(uiVarObj.varType); + if(SESSION.imageTest){ + for(var i = 0; i < disp_varType.items.length; i++){ + disp_varType.items[i].image = ICONS[disp_varType.items[i]]; + } + } + disp_varType.onChange = function(){ + toggleUrlInputVis(this, disp_url.parent); + }; + + var disp_url = checkboxFolderPathInput(w, "Prepend Path", "Choose folder directory"); + disp_url.setValue(uiVarObj.url); + disp_url.checkbox.value = (uiVarObj.url.trim() == "") ? false : true; + + var g_btn = w.add("group"); + var btn_ok = g_btn.add("button", undefined, "Ok"); + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + + disp_varName.onChanging = function(){ + if( !isXMLTagName(this.text) ){ + this.setBg([1, 0.7, 0.7]); + this.enabled = false; + this.enabled = true; + this.active = false; + this.active = true; + } else { + this.setBg([1, 1, 1]); + } + }; + + btn_ok.onClick = function(){ + if( !DATA.testVariableName( uiVarObj.varName, disp_varName.getValue() ) ){ + return; + } + this.window.close(); + }; + + w.onShow = function(){ + toggleUrlInputVis(disp_varType, disp_url.parent); + }; + + if(w.show() == 2){ + return null; + } else { + var varObj = { + varName : disp_varName.getValue(), + varType : disp_varType.getValue(), + url : (disp_varType.getValue() == "Graph" || disp_varType.getValue() == "Image") ? disp_url.getValue() : "", + varIndex : uiVarObj.varIndex + }; + var changed = false; + for(var all in uiVarObj){ + for(var that in varObj){ + if(uiVarObj[all] != varObj[all]){ + changed = true; + break; + } + } + } + return { + varObj : varObj, + changed : changed + }; + } +}; + +function datasetNameFieldComponent(parent, fieldName, datasetObj){ + + function toggle(key){ + if(key == FIELDNAMEOPTIONS_current["customText"].displayText){ + disp.toggle("editable"); + disp.editable.active = false; + disp.editable.active = true; + } else { + disp.toggle("readonly"); + } + }; + + var customIncNames = getSpecificPropertyListArr(CUSTOM_INCREMENTS_current, "name"); + + var g1 = parent.add("panel", undefined, fieldName[0].toUpperCase() + fieldName.substr(1).replace("_", " ")); + g1.spacing = 4; + g1.margins = [2, 8, 2, 2]; + var dd_options = makeDropdownlist(g1, getSpecificPropertyListObj(FIELDNAMEOPTIONS_current, "displayText")); + var thisType = datasetObj[fieldName].type; + dd_options.setValue(FIELDNAMEOPTIONS_current[thisType].displayText); + + var g1_2 = g1.add("group"); + g1_2.orientation = "stacked"; + var disp = makeEditableReadonlyEdittext(g1_2, 20, datasetObj[fieldName].text); + var dd_customInc = makeDropdownlist(g1_2, customIncNames); + dd_customInc.size = dd_options.size = [165, 26]; + if(dd_options.getValue() == "Custom Increment"){ + dd_customInc.setValue(datasetObj[fieldName].text); + disp.element.visible = false; + } else { + dd_customInc.visible = false; + } + + toggle(dd_options.selection.text); + + dd_options.onChange = function(){ + var sel = this.selection; + if(sel.text != "Custom Increment"){ + dd_customInc.visible = false; + disp.element.visible = true; + disp.setValue(getSpecificPropertyObj(FIELDNAMEOPTIONS_current, "displayText", sel.text).defaultText); + toggle(sel.text); + } else { + disp.setValue(dd_customInc.selection.text); + disp.element.visible = false; + dd_customInc.visible = true; + } + }; + dd_customInc.onChange = function(){ + disp.setValue(this.selection.text); + }; + return { + typeElem : dd_options, + textElem : disp /* re-use the disp text to hold the custom inc name */ + }; +}; + +function getDatasetNamePreviewString(){ + var str = ""; + for(var all in DATASETNAMEFIELDS_current){ + str += DATASETNAMEFIELDS_current[all].text; + } + return str; +}; + +function datasetAssignDialog(datasetObjOrig){ + + function getUIDsNameFieldObj(tempObj){ + for(var all in tempObj){ + var type = getSpecificPropertyObj(FIELDNAMEOPTIONS_current, "displayText", tempObj[all].typeElem.getValue()).type; + resObj[all] = { + type : type, + text : tempObj[all].textElem.getValue() + }; + } + return resObj; + }; + + var processedDatasetNameFieldsResult = clearOutOfBoundVariables(clone(datasetObjOrig)); + var datasetObj = processedDatasetNameFieldsResult.obj; + if(WARNINGSETTINGS.showDatasetNamingWarning && processedDatasetNameFieldsResult.msg != ""){ + quickView(processedDatasetNameFieldsResult.msg, "Dataset naming field errors."); + } + + var w = new Window("dialog", "Assign Dataset Names"); + w.spacing = 4; + w.margins = [4, 4, 4, 4]; + var resObj = {}, tempObj = {}; + var g0 = w.add("panel"); + g0.spacing = 4; + g0.margins = [4, 4, 4, 4]; + var g0_1 = g0.add("group"); + g0_1.spacing = 2; + var g0_2 = g0.add("group"); + g0_2.spacing = 2; + var groups = [g0_1, g0_2]; + var c = 0, cg = 0; + for(var all in datasetObj){ + cg = (c < 3) ? 0 : 1; + tempObj[all] = datasetNameFieldComponent(groups[cg], all, datasetObj); + c++; + }; + + var g_btn = w.add("group"); + if(DATA.currentVars.length > 0){ + var btn_test = g_btn.add("button", undefined, "Test Dataset Names"); + btn_test.onClick = function(){ + DATA.getCurrentGrid(); + // quickView(DATA.getTestDatasetNames(getUIDsNameFieldObj(tempObj)).join("\n"), "Dataset Names:", [300, 450]); + var testData = DATA.getTestDatasetNames(getUIDsNameFieldObj(tempObj)).join("\n"); + simpleShowModal(TestManager.datasetNames.makeUIContents, { + title : "Dataset Name List", + data : testData, + size : [300, 450] + }); + }; + btn_test.helpTip = "Get full list of dataset names."; + } + var btn_ok = g_btn.add("button", undefined, "Ok"); + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + + btn_ok.onClick = function(){ + var isValid = false, type; + for(var all in tempObj){ + type = getSpecificPropertyObj(FIELDNAMEOPTIONS_current, "displayText", tempObj[all].typeElem.getValue()).type; + if(type != "nothing"){ + isValid = true; + w.close(); + } + } + if(!isValid){ + scriptAlert("Dataset fields cannot all be set to 'nothing'."); + } + }; + + w.onShow = function(){ + + }; + + if(w.show() == 2){ + return null; + } else { + return getUIDsNameFieldObj(tempObj); + } +}; + +function finishedXMLFileDialog(xmlDest, varsNum, recordsNum){ + var w = new Window("dialog", SESSION.scriptName + ": XML File created."); + + var msg = "Your XML file has been created.\rIt contains " + varsNum + + " variable" + ((varsNum > 1)? "s" : "") + " and " + recordsNum + " record" + ((recordsNum > 1) ? "s" : "") + "."; + + var l = w.add("statictext", undefined, msg, {multiline : true}); + l.size = [260, 100]; + + var e = w.add("edittext", undefined, decodeURI(xmlDest), {readonly : true}); + e.characters = 40; + e.helpTip = decodeURI(xmlDest); + var g_btn = w.add("group"); + var btn_ok = g_btn.add("button", undefined, "Ok"); + var btn_reveal = g_btn.add("button", undefined, "Reveal in File System"); + + btn_reveal.onClick = function(){ + Folder(File(e.text).parent).execute(); + w.close(); + } + w.show(); +}; + +function finishedXMLImportDialog(varsNum, recordsNum, missingImgNum, missingGrfNum){ + var w = new Window("dialog", SESSION.scriptName + ": Variable Data Imported."); + + var msg = "Your variable data has been imported.\rIt contains " + varsNum + + " variable" + ((varsNum > 1)? "s" : "") + " and " + recordsNum + " record" + ((recordsNum > 1) ? "s" : "") + "."; + + var l = w.add("statictext", undefined, msg, {multiline : true}); + l.size = [260, 50]; + + if(missingImgNum > 0){ + l = w.add("statictext", undefined, missingImgNum + " Missing Image(s)", {multiline : true}); + l.size = [260, 100]; + } else if(missingGrfNum > 0){ + l = w.add("statictext", undefined, missingGrfNum + " Missing Graph(s)", {multiline : true}); + l.size = [260, 100]; + } else { + var g_cycle = w.add("group"); + var btn_cycle = g_cycle.add("button", undefined, "Cycle Update All Datasets"); + btn_cycle.helpTip = "Cycling and updating each of the datasets ensures that update-asterisks will appear correctly"; + var disp_cycle = g_cycle.add('edittext { properties : {readonly : true}, justify : "center" }'); + disp_cycle.characters = 10; + disp_cycle.setValue("0 of " + app.activeDocument.dataSets.length); + btn_cycle.onClick = function(){ + cycleUpdateAllDatasets(app.activeDocument, disp_cycle); + }; + } + + var g_btn = w.add("group"); + var btn_ok = g_btn.add("button", undefined, "Ok"); + + w.show(); +}; + +//---------------------------------------------------------------------------------------- CUSTOM INCREMENTS ------------------------------------------------------------------// +function updateCustomIncrementDisplay(display, customIncObj){ + var arr = [], prefixStr; + for (var i = 0; i < 10; i++) { + prefixStr = " " + (i + 1) + ": "; // adds a number to tell the index in the display area text + if((i + 1).toString().length > 1){ + prefixStr = (i + 1) + ": "; + } + arr.push(prefixStr + getRecordCustomInc(i, customIncObj.startNum, customIncObj.padZero, customIncObj.increment, customIncObj.isIntervalIncrement)); + } + display.setValue(arr.join("\n")); +}; + +function customIncrementsDialog(){ + + var dialogData = clone(CUSTOM_INCREMENTS_current); + var customIncNames = []; + for (var i = 0; i < dialogData.length; i++) { + customIncNames.push(dialogData[i].name); + } + + var w = new Window("dialog", "Custom Increment Options"); + w.spacing = 4; + + var g0 = w.add("group"); + g0.orientation = "row"; + + var g1 = g0.add("group"); + var g1_1 = g1.add("group"); + g1_1.orientation = "column"; + var lbl_customIncList = g1_1.add("statictext", undefined, "Custom Increment List"); + var list_customIncs = g1_1.add("listbox", undefined, customIncNames); + list_customIncs.size = [195, 280]; + var g1_1_2 = g1_1.add("group"); + g1_1_2.orientation = "row"; + g1_1_2.margins = [4, 4, 4, 10]; + var btn_addCustomInc = g1_1_2.add("button", undefined, "Add \u2795"); + var btn_removeCustomInc = g1_1_2.add("button", undefined, "Remove \u2796"); + btn_addCustomInc.size = btn_removeCustomInc.size = [80, 25]; + + var g2a = g0.add("group"); + g2a.orientation = "column"; + var g2 = g2a.add("panel", undefined, "Properties"); + g2.spacing = 4; + g2.alignChildren = "left"; + var g2_1 = g2.add("group"); + var lbl_startNum = g2_1.add("statictext", undefined, "Start Number"); + lbl_startNum.size = [120, 26]; + var disp_startNum = g2_1.add("edittext", undefined, ""); + disp_startNum.characters = 10; + disp_startNum.onChange = function(){ + var val = this.getValue(); + var msg = "Please enter a zero, or a positive integer number into the 'Start Number' field."; + if(isNaN(val) || !/^\d+$/.test(val)){ + scriptAlert(msg); + this.setValue(0); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : this.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + return; + } else { + if(val != "0" && val.indexOf("0") > -1){ + val = val.replace(/^0+/, ""); + if(val == ""){ + val = 0; // put it back to zero if the entered string was all zeroes + } + } + this.setValue(val); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : this.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + } + }; + + var g2_1a = g2.add("group"); + var lbl_incValue = g2_1a.add("statictext", undefined, "Increment Value"); + lbl_incValue.size = [120, 26]; + var disp_incValue = g2_1a.add("edittext", undefined, ""); + disp_incValue.characters = 10; + disp_incValue.onChange = function(){ + var val = this.getValue(); + var msg = "Please enter a positive integer number into the 'Increment Value' field."; + if(isNaN(val) || !/^\d+$/.test(val) || (val * 1) <= 0){ + scriptAlert(msg); + this.setValue(1); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : this.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + return; + } else { + this.setValue(val); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : disp_startNum.getValue(), + increment : this.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + } + }; + + var g2_1b = g2.add("group"); + var ch_intervalIncrement = g2_1b.add("checkbox", undefined, "Make Interval Increment"); + ch_intervalIncrement.helpTip = "Adds a dash with the next value of the incremented position after the specified increment amount has been added. ex: 1-10, 11-20"; + ch_intervalIncrement.onChange = function(){ + var val = this.getValue(); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : disp_startNum.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : val + }); + }; + + var g2_2 = g2.add("group"); + var lbl_padZero = g2_2.add("statictext", undefined, "Padding Zeroes"); + lbl_padZero.size = [120, 26]; + var dd_padZero = makeDropdownlist(g2_2, [0,1,2,3,4,5,6,7,8,9,10,11,12,13]); + dd_padZero.characters = 10; + dd_padZero.onChange = function(){ + updateCustomIncrementDisplay(disp_preview, { + padZero : this.getValue(), + startNum : disp_startNum.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + }; + var g2_3 = g2a.add("panel", undefined, "Preview Display"); + g2_3.margins = [6, 6, 6, 6]; + var disp_preview = g2_3.add("edittext", undefined, "", { multiline : true, readonly : true }); + disp_preview.size = [240, 160]; + + var g_btn = w.add("group"); + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + var btn_ok = g_btn.add("button", undefined, "Save"); + + list_customIncs.onChange = function(){ + if(this.selection != null){ + dd_padZero.setValue(dialogData[this.selection.index].padZero); + disp_startNum.setValue(dialogData[this.selection.index].startNum); + disp_incValue.setValue(dialogData[this.selection.index].increment); + ch_intervalIncrement.setValue(dialogData[this.selection.index].isIntervalIncrement); + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : disp_startNum.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : ch_intervalIncrement.getValue() + }); + } + }; + + g2.addEventListener("mousedown", function(){ + list_customIncs.selection = null; + }); + + ch_intervalIncrement.onClick = function(){ + updateCustomIncrementDisplay(disp_preview, { + padZero : dd_padZero.getValue(), + startNum : disp_startNum.getValue(), + increment : disp_incValue.getValue(), + isIntervalIncrement : this.getValue() + }); + }; + + btn_addCustomInc.onClick = function(){ + var startNumValue = disp_startNum.getValue(); + var padZeroValue = dd_padZero.getValue(); + var incrementValue = disp_incValue.getValue(); + var isIntervalIncrement = ch_intervalIncrement.getValue(); + if(startNumValue == "" || padZeroValue == "" || incrementValue == ""){ + scriptAlert("Please ensure the 'Increment Value' and 'Start Number' fields are filled."); + return; + } + var newName = "s" + startNumValue + "p" + padZeroValue + "i" + incrementValue + (isIntervalIncrement ? "-interval" : ""); + dialogData.push({ + name : newName, + padZero : padZeroValue, + startNum : startNumValue, + increment : incrementValue, + isIntervalIncrement : isIntervalIncrement + }); + list_customIncs.addItem(newName); + }; + + btn_removeCustomInc.onClick = function(){ + if(list_customIncs.selection == null){ + return; + } + dialogData.splice(list_customIncs.selection.index, 1); + list_customIncs.removeSelectedItem(); + }; + + btn_ok.onClick = function(){ + if(dialogData.length < 1){ + scriptAlert("At least one custom increment must be present in the list to save."); + return; + } else { + // only save the custom increment portion of the settings file + SESSION.settingsFile.open('r'); + var settingsObj = JSON.parse(SESSION.settingsFile.read()); + SESSION.settingsFile.close(); + CUSTOM_INCREMENTS_current = settingsObj.CUSTOM_INCREMENTS = dialogData; + writeSettingsFile(settingsObj); + } + this.window.close(); + }; + + if(w.show() == 2){ + return null; + } else { + return { + + }; + } +}; + +//---------------------------------------------------------------------------------------- VISIBILITY KEYS ------------------------------------------------------------------// +function populateVisKeyList(listElem, visKeys){ + for (var i = listElem.items.length - 1; i > -1; i--) { + listElem.remove(i); + } + var thisVisKey, newItem; + for (var i = 0; i < visKeys.length; i++) { + thisVisKey = visKeys[i]; + newItem = listElem.add("item"); + newItem.text = thisVisKey.name; + newItem.subItems[0].text = thisVisKey.displayText; + newItem.checked = thisVisKey.enabled; + } +}; + +function visibilityKeysDialog(){ + + var textInputHelpTip = "Visibility Key 'text' is compared to data cell text in lower-case."; + + function getBothSetsOfKeys(visKeyObj){ + var trueVisKeys = [], falseVisKeys = []; + var thisVisKey; + for (var i = 0; i < visKeyObj.length; i++) { + thisVisKey = visKeyObj[i]; + if(thisVisKey.value){ + trueVisKeys.push(thisVisKey); + } else { + falseVisKeys.push(thisVisKey); + } + } + return { trueVisKeys : trueVisKeys, falseVisKeys : falseVisKeys }; + }; + + var dialogData = clone(VisibilityKeys); + var keyData = getBothSetsOfKeys(dialogData); + var trueVisKeys = keyData.trueVisKeys, falseVisKeys = keyData.falseVisKeys; + + var w = new Window("dialog", "Manage Visibility Keys"); + w.spacing = 4; + var inputCharacterAmt = 10; + + var g0 = w.add("group"); + g0.orientation = "row"; + + var g1 = g0.add("group"); + var g1_1 = g1.add("group"); + g1_1.orientation = "column"; + + var lbl_trueList = g1_1.add("statictext", undefined, "true / visible"); + var list_trueList = g1_1.add("listbox", undefined, [], { + numberOfColumns: 2, + showHeaders: true, + columnTitles: ["Name", "Text"], + columnWidths: [120, 120] + }); + list_trueList.size = [260, 200]; + list_trueList.name = "True List"; // custom property + + var g1_1_2a = g1_1.add("group"); + g1_1_2a.orientation = "row"; + g1_1_2a.spacing = 4; + var g1_1_2a_1 = g1_1_2a.add("group"); + g1_1_2a_1.orientation = "column"; + g1_1_2a_1.spacing = 4; + var lbl_trueKeyName = g1_1_2a_1.add("statictext", undefined, "name"); + var disp_trueKeyName = g1_1_2a_1.add("edittext", undefined, ""); + disp_trueKeyName.characters = inputCharacterAmt; + disp_trueKeyName.list = list_trueList; + + var g1_1_2a_2 = g1_1_2a.add("group"); + g1_1_2a_2.orientation = "column"; + g1_1_2a_2.spacing = 4; + var lbl_trueKeyText = g1_1_2a_2.add("statictext", undefined, "text"); + var disp_trueKeyText = g1_1_2a_2.add("edittext", undefined, ""); + disp_trueKeyText.helpTip = textInputHelpTip; + disp_trueKeyText.characters = inputCharacterAmt; + disp_trueKeyText.list = list_trueList; + + var g1_1_2 = g1_1.add("group"); + g1_1_2.orientation = "row"; + g1_1_2.margins = [4, 4, 4, 10]; + var btn_addTrueVisKey = g1_1_2.add("button", undefined, "Add \u2795"); + var btn_removeTrueVisKey = g1_1_2.add("button", undefined, "Remove \u2796"); + btn_addTrueVisKey.size = btn_removeTrueVisKey.size = [80, 25]; + btn_addTrueVisKey.list = btn_removeTrueVisKey.list = list_trueList; + + var sep = g1.add("panel"); + sep.size = [2, 300]; + var g1_2 = g1.add("group"); + g1_2.orientation = "column"; + + var lbl_falseList = g1_2.add("statictext", undefined, "false / invisible"); + var list_falseList = g1_2.add("listbox", undefined, [], { + numberOfColumns: 2, + showHeaders: true, + columnTitles: ["Name", "Text"], + columnWidths: [120, 120] + }); + list_falseList.size = [260, 200]; + list_falseList.name = "False List"; // custom property + + var g1_2_2a = g1_2.add("group"); + g1_2_2a.orientation = "row"; + g1_2_2a.spacing = 4; + var g1_2_2a_1 = g1_2_2a.add("group"); + g1_2_2a_1.orientation = "column"; + g1_2_2a_1.spacing = 4; + var lbl_falseKeyName = g1_2_2a_1.add("statictext", undefined, "name"); + var disp_falseKeyName = g1_2_2a_1.add("edittext", undefined, ""); + disp_falseKeyName.characters = inputCharacterAmt; + disp_falseKeyName.list = list_falseList; + + var g1_2_2a_2 = g1_2_2a.add("group"); + g1_2_2a_2.orientation = "column"; + g1_2_2a_2.spacing = 4; + var lbl_falseKeyText = g1_2_2a_2.add("statictext", undefined, "text"); + var disp_falseKeyText = g1_2_2a_2.add("edittext", undefined, ""); + disp_falseKeyText.helpTip = textInputHelpTip; + disp_falseKeyText.characters = inputCharacterAmt; + disp_falseKeyText.list = list_falseList; + + var g1_2_2 = g1_2.add("group"); + g1_2_2.orientation = "row"; + g1_2_2.margins = [4, 4, 4, 10]; + var btn_addFalseVisKey = g1_2_2.add("button", undefined, "Add \u2795"); + var btn_removeFalseVisKey = g1_2_2.add("button", undefined, "Remove \u2796"); + btn_addFalseVisKey.size = btn_removeFalseVisKey.size = [80, 25]; + btn_addFalseVisKey.list = btn_removeFalseVisKey.list = list_falseList; + + var btns = [btn_addTrueVisKey, btn_removeTrueVisKey, btn_addFalseVisKey, btn_removeFalseVisKey]; + var thisBtn; + for (var i = 0; i < btns.length; i++) { + thisBtn = btns[i]; + thisBtn.onClick = function(){ + var self = this; + return function (self){ + var list = self.list; + var isTrueList = list.name == "True List"; + var isAddBtn = self.text == "Add \u2795"; + // check the list data against memory object to give the OK button a save-&-apply or only-apply functionality. + // add/remove item + if(isAddBtn){ + var isValidAddition, thisValueInputElem, thisNameInputElem, problem; + if(isTrueList){ + thisValueInputElem = disp_trueKeyText; + thisNameInputElem = disp_trueKeyName; + } else { + thisValueInputElem = disp_falseKeyText; + thisNameInputElem = disp_falseKeyName; + } + try { + problem = "VisibilityKeys - please fill out all necessary fields before adding a new key."; + isValidAddition = (thisNameInputElem.getValue().trim() != ""); + if(!isValidAddition){ + throw(problem); + } + var allPresentListNames = []; + for (var i = 0; i < list.items.length; i++) { + thisName = list.items[i].text; + allPresentListNames.push(thisName); + } + problem = "VisibilityKeys - please choose a different name for the new key to add to the list."; + isValidAddition = (allPresentListNames.indexOf(thisNameInputElem.getValue()) == -1); + if(isValidAddition){ + var newItem = list.add("item"); + newItem.text = thisNameInputElem.getValue(); // name + newItem.subItems[0].text = thisValueInputElem.getValue().toLowerCase(); // text + newItem.checked = true; + } else { + throw(problem); + } + } catch(e) { + scriptAlert(e); + return; + } + } else { + if(list.selection == null){ + return; + } + if(list.items.length > 1){ + list.selection.remove(); + } + } + + var keyData = getBothSetsOfKeys(VisibilityKeys); + var trueVisKeys = keyData.trueVisKeys, falseVisKeys = keyData.falseVisKeys; + var targetKeys = (isTrueList) ? trueVisKeys : falseVisKeys; + var isCompleteMatch = true; + var thisName, thisText; + for (var i = 0; i < list.items.length; i++) { + thisName = list.items[i].text; + thisText = list.items[i].subItems[0].text; + if(getByName(targetKeys, thisName) == null){ + isCompleteMatch = false; + break; + } + } + var thisCompareName, wasMatched; + for (var i = 0; i < targetKeys.length; i++) { + thisCompareName = targetKeys[i].name; + wasMatched = false; + for (var j = 0; j < list.items.length; j++) { + thisName = list.items[j].text; + thisText = list.items[j].subItems[0].text; + if(thisName == thisCompareName){ + wasMatched = true; + break; + } else if(!wasMatched && j == list.items.length - 1){ + isCompleteMatch = false; + break; + } + } + } + if(isCompleteMatch){ + btn_ok.text = "Apply"; + } else { + btn_ok.text = "Save & Apply"; + } + }(self); + }; + } + + list_trueList.onDoubleClick = list_falseList.onDoubleClick = function(){ + if(this.selection != null){ + this.selection.checked = !this.selection.checked; + } + }; + var firstFocus = true; + w.addEventListener("mouseover", function(){ + if(firstFocus){ + list_falseList.active = true; + list_trueList.active = true; + firstFocus = false; + } + }); + + var g_btn = w.add("group"); + var btn_ccl = g_btn.add("button", undefined, "Cancel"); + var btn_ok = g_btn.add("button", undefined, "Apply"); + btn_ccl.size = btn_ok.size = [180, 26]; + + btn_ok.onClick = function(){ + var resultData = [], thisItem, keyObj; + for (var i = 0; i < list_trueList.items.length; i++) { + thisItem = list_trueList.items[i]; + keyObj = { + displayText : thisItem.subItems[0].text, + name : thisItem.text, + value : true, + enabled : thisItem.checked + }; + resultData.push(keyObj); + } + for (var i = 0; i < list_falseList.items.length; i++) { + thisItem = list_falseList.items[i]; + keyObj = { + displayText : thisItem.subItems[0].text, + name : thisItem.text, + value : false, + enabled : thisItem.checked + }; + resultData.push(keyObj); + } + VisibilityKeys = resultData; + if(this.text == "Save & Apply"){ + SESSION.settingsFile.open('r'); + var settingsObj = JSON.parse(SESSION.settingsFile.read()); + SESSION.settingsFile.close(); + settingsObj.VisibilityKeys = VisibilityKeys; + writeSettingsFile(settingsObj); + } + this.window.close(); + }; + + w.onShow = function(){ + populateVisKeyList(list_trueList, trueVisKeys); + populateVisKeyList(list_falseList, falseVisKeys); + }; + + if(w.show() == 2){ + return null; + } else { + return { + + }; + } +}; + +//==================================================================================// + + var userData = UIWindow(); + if(userData == null){ + // abort mission + return; + } + + processUserInput(userData); + +}; + +VariableImporter(); + diff --git a/qosf.org/designs/infograph_creator/create_grid.sh b/qosf.org/designs/infograph_creator/create_grid.sh new file mode 100644 index 0000000..68905f7 --- /dev/null +++ b/qosf.org/designs/infograph_creator/create_grid.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Check for the correct number of arguments +if [ "$#" -ne 3 ]; then + echo "Usage: $0 grid_size input_dir output_filename" + exit 1 +fi + +# Assign input parameters to variables +GRID_SIZE=$1 +INPUT_DIR=$2 +OUTPUT_FILENAME=$3 + +# Create the montage +montage -tile "$GRID_SIZE" -geometry +0+0 "${INPUT_DIR}"/*.png "$OUTPUT_FILENAME" + +# Inform the user of completion +echo "Montage created successfully: $OUTPUT_FILENAME" + +# Example usage +# This script creates a grid montage of PNG images from a specified directory. +# Usage: +# ./create_image_grid.sh 3x2 /path/to/input/directory output.png +# Where "3x2" is the grid size, "/path/to/input/directory" is the path where PNG images are stored, +# and "output.png" is the name of the output file to be created. diff --git a/qosf.org/designs/infograph_creator/project_card.ai b/qosf.org/designs/infograph_creator/project_card.ai new file mode 100644 index 0000000..6469c4e --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_card.ai @@ -0,0 +1,2334 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[28 0 R 29 0 R 30 0 R 31 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + quantum_proj + + + Adobe Illustrator 25.0 (Macintosh) + 2024-06-05T21:00:57-06:00 + 2024-06-05T21:00:58-06:00 + 2024-06-05T21:00:58-06:00 + + + + 172 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACsAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9LZe1OxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kq3/Hr/sv4ZHqnoo5JDsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdiqt/wAev+y/hkeqeijkkOxV2KuxV2KuxV2KqVxdW9tH6kzhF7V6 n5DFUlu/M4pxtIzX+eT+ABw0hKZ9Sv5yfUnYg/sg8V+4bYaVDdcVbVmU1UkHxG2Koy21nUYCOMpd R+y/xD8d8aVOLbzNauALhGicmhYfEvz8fwwUqcKysoZSCp3BG4OBLeKuxV2KuxV2KuxVW/49f9l/ DI9U9FHJIdirsVdirsVdiqA1PV7ezRkDcrmnwR9aV6E40hi11eXN04eeQuRsOgA+QG2SVRxV2Kux V2KuxV2Ko3T9VurJgFPKGvxRHp9HhjSsqs7yC7hEsJqOhB6g+ByKVfFXYq7FXYq7FVb/AI9f9l/D I9U9FHJIdirsVdirsVQ2o3n1SzeegLCgRT3JNMUMOuJ5LiZ5pTV3NSckqI07TJr5nEbKojAJLV79 OnyxJVq90q8sxylSsdaCRTUY2qExV2KuxV2KphaaFf3C8+IiQ9DJUE/IUrgtULd2slrcPBJQsncd DUVwqq6bfyWVyJBUxnaRPEf1GJVmMciSRrIh5IwqpHgcildirsVdirsVVv8Aj1/2X8Mj1T0Uckh2 KuxV2KuxViWu3rXF8yCojgJRQfEGjH78IQl2FU/8q/8AH1/zz/42wFU/wJQ506xMzTGBDIxqSRXf 5HbFCuqKoooCjwApilp4o5BSRFceDAH9eKqMWn2UUpmjhVJD3A6fIdBihEYpYx5m4/pBKdfSFf8A gjhCEowqyDyxeLxe0b7VTIh9tgRgKp9gS7FXYq7FVb/j1/2X8Mj1T0Uckh2KuxV2KqN5cC3tZZj+ wpI+fb8cVYQzMzFmNWJqSepJySGsVZP5cspYLd5pNjPxKr/kitD9NcBVN8CXYq7FXYqlfmLzPoPl vTjqOt3i2dnyEYkYMxZ2qQqogZmOxOwxAtDfl3zNoXmTThqWiXa3lmXMZkUMpDrQlWVwrKaEGhGJ FKgPMtkVdbxSSHojg9iBtT7sIVI8KqtpcNb3McymhRgTTuO4+kYqznIpdirsVdiqt/x6/wCy/hke qeijkkOxV2KuxVK/MkhXTeI/bdVP4t/DEIYrkleUfmX+ZWuWGsz+XdGQRSKiJLchS0xeVQ4EW9B8 LgVpWvSmTjHqxJS7VtJ/PTylpcfmO81K+jtyV9cfW2nMXIgJ68TM60JNOhA6GmIMSjcPRPJ358rc +RdS1fW7b1dS0RoEuo7aietHcOI45VDGgPKvMDbwpWgiYbshJk/lb82dL8xeVta8wwWM8EGiRyyT QSMhdxFCZiFINNwKb5Exo0m2D6l5482/mfZel5BW60i40qRWv2a5WD1EnVggBQ70MRyVVzRd8nmd x5n/ADWt/Mh8uSeYL4amLpbIoLuQp6zOEA5VpTkeuToVbGyy3zH5X8x6Z5QvLn80Lq/vYvrdqukG 2u0mdJGjuPVJEodeJ+Co2Jp1yIO+ya70Dd65Fof5SWVz5MvNS06O41qVbmSWZFmZxaqGAMAQcPhW gNd8NWd16bJda3P5y33lKfzVDrF5c6NauwnLXRdl9Mjkxic7gchj6bpG7M/yo896j5igurLVCr3l mEdbhVCmRGJB5AfDyU+AGMhSQXoGQZM7gk9SGOT+dQ33iuRSvxV2KuxVW/49f9l/DI9U9FHJIdir sVdiqUeZxWwjPhKP+IthCGMYVeF/mK1/oH5oweYXt/UhWe0vbSpIWT6qIwycqGh5R7+xyyO4YHmz Hzx/zkLomteTrnStP024S/1KFoLn1ygjgDijFWUsZPbZfH2yIgbSZMO8teSNX/5VT5p8xvGywTx2 8VpGVNZI4bqOSaUf5K8evsfDJE7hAGyn5D/MfSvL/kbzR5eu7aeS51mGWOzli4FA0sDQn1OTKQFq DtXGUbNqDszj/nFf+98zf6tl+ufI5ExYPrf/AJPh/wDwIIv+olckPpR1ev8A/OSv/kvYP+2jD/yb lyEObKXJ4zef+SS07/tvz/8AUKuTH1Meit5U8ifmN5i8nu+mX4i8ttMyy2kly6RGRSKloVDA707Y mQBUAvSvy88gp5UtbhpZxc393x9aRQQiqlaItdzuSSdvlkZStkAy/IpZxZClnAD2jQf8KMilWxV2 KuxVW/49f9l/DI9U9FHJIdirsVdiqA1yAy6bKAKslHH+xO/4VxCGIZJUNf6Zp2owehf2sV3DWojm RZFB6VAYGh98UPL/ADf+ReqT3SX3kyAXUMhJutPaSOMwP2KNMyK6Nvt1GTE+9Biz78nvLP5oadc3 8PnE/wC4OW2EEGnTSxTqGUqqiKOIyRxxCPkpQUHTbIyI6JFswP5Wfl0bl7k+XbH1JBxZREojAIp8 MY/dqfcL75HiKaTPQvKnlvQDMdG06CwNzx9f0F48+FeNflyOAlUNL5B8mS6r+lpNHtW1Iyi4N2UH qeqG5B6+PIVxsrSYa1oOja3aCz1azivbUOJBDMvJQ6ggNTxoxxVLm/L/AMlNpiaW2jWp06OU3CWv pjgJWXiXA8Su2NlaQ99p2i6JpaaTpFvHZQtJ6rW0K8V3rUn5kDCFSnCrgCTQdTirPQAoAAoBsBkU t4q7FXYqrf8AHr/sv4ZHqnoo5JDsVdirsVaZVZSrCqsKEexxVg93B6F1LDvSNyor1IB2P0jJIVbf TL24hM0MfNBWtGWu3tWuNq61u7zTpyVBR6UeNwQD4VG2KsisddsrhAJHEMoHxBzRa+xORpUdHcW8 v93Kj/6rA/qxSqYq7FVKS7tIzSSaND4MwB/E4qll/wCYoIfgtqTSfzfsD+uGkMcmmkmkaWRizsas ThVZiqYaHZG5vlYg+lD8bntUfZH0nAVZdgS7FXYq7FVb/j1/2X8Mj1T0Uckh2KuxV2KuxVJPMenB 4/rqGjIAJF8RWgP0VwhCSWN7NaTrLGTQEc0rQMO4OFU/1SwGp20VzbEcwtVHdgabV9siFYy6MjFH BVlNGU7EEZJWQeWrFQjXbj4ieMVR0Hcj59MBVPcCXYqxTzDbCHUC604zKHoBSh6H9VcIQlmFXYq4 AkgDcnoMVZho1g1nZ8HP7yQ82HhUAcfoyJVHYpdirsVdiqt/x6/7L+GR6p6KOSQ7FXYq7FXYq0yq ylWAZSKEHcEYqxbWNIltpnmiT/RTQgjfjXsR88IKF+iawloGhuCxhJqhG/E99vA4kKmraxornk0i sR0JRif+I4KVG21zBcRCWFuUZ2BoR0+dMUquKuxVjnmn/eiD/UP68IQkmFXYqyDQdHZWW7uFoRvF Gf8AiR/hgJVPsCXYq7FXYq7FVb/j1/2X8Mj1T0Uckh2KuxV2KuxV2KtOiujIwqrAhge4OKpDqfl2 g9SxXp9qIn/iNcNoSOWGWJuMqNG3gwIP44VZR5d/45i/6zfryJVM8UuxVjnmn/eiD/UP68IQlMFp dT/3MTSCtCVBIB9z0wqyPTdAht6S3FJZhuB+yp/jkbVNsUuxV2KuxV2KuxVW/wCPX/ZfwyPVPRRy SHYq7FXYq7FXYq7FXYqpz28E6cJkDr4EfqxVuGGKGNYol4Rr0Ue5riq/FXYqpXFpbXAUTxiTiarX tiq9I0jUKihVHRVFB+GKrsVdirsVdirsVdirsVVv+PX/AGX8Mj1T0Uckh2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVW/wCPX/ZfwyPVPRRySHYq7FXYq7FXYq7FXYq7FXYq7FVC /vbexsbi9uWK29rE80zAEkJGpZjQbnYYoSPyN580Tzppcuo6Sk8cUExgljuUVHDhQ37LOpBDDo2E xpQbZHgS7FXYq7FXYq7FXYq7FVb/AI9f9l/DI9U9FHJIdirsVdirsVdirsVSLz1rV5onk/V9Ws1D XdnbSSQchUB6UDEdwta0wgWUF8/af5HttW/LO9/MW88wXbeZITNIshmHFHik4rE5I9Tm43Wjj7Q2 y296YVtadWf5r+dmsvy/Jv8A0U1O5e11SR44m+sRxXUcPNmkRip4MQxUjepwcI3TaPeK8/Mn8xfM PkzzBqc/+H9Ikku7GG0W2jdJYXEABkMTswCzOCD3wcha8yxP8mvIulatHrGvTz3Ed75ckSewWMx+ mzoryD1VeN+QrGNgRkpFACT63rN9qv5SWM12IQ0WvXEUa29vBaoF+qRP/d26RJXk5NaVwgbr0T38 pf8AyZOnf4I/Sn6C9P8A3NfXvT414tz5+j+74/Z9OvxcsEuW6jm+nMpbHYq7FXYq7FXYq7FVb/j1 /wBl/DI9U9FHJIdirsVdirsVdirsVU7m3gubeW2uI1lt50aOaJxVWRxxZWB6gg4q8B89/wDOO15b Srd+TAb22aQNPo9zMFOx+HhIxj5LQkfE4Ydia5aJ97AxZra/lfH5q8j6XpfnLTo9HvtMZxZx6VKP 3MLEfBV/XX4qDlVnrTlyqTkeKjsmk28j/lF5Y8matcanpM9281xAbZ47iSN4whZXJHGNGrVB+1gM iVApEeUPyw0DyrY6rZ6dcXcsWrilybh42ZfhZfg4RxgbOetcBlaQEkb8gvJzeWo/LxvNR+pR3j6g snqQer6skSwlSfR48eMY/ZrXvh4zaOF6PDEsMMcSklY1CKT1oopvkWS/FXYq7FXYq7FXYq7FVb/j 1/2X8Mj1T0Uckh2KpTq/mnRNJm9C9mkEoj9aRIIJ7gxxAkerL6CSekmx+J6DY+GEBFppHJHLGssT B43AZHUgqykVBBHUHAldiqmlzbPPJbpKjXEKq0sIYF0WSvAsvUBuJpXrQ4qqYqpXd1Ha20lxKJGj iXkyxRyTSED+WOJXdj7KCcUIHQ/Mel65FJNp3rtFE3Fnntbm2BYFlIU3EcXPiyENxrQ9cSKVFajq NnptjNfXsnpWsC8pZKM1B0rRQSfoGKusdRs7+OWS0k9RIZpbeQ0ZaSwOY5F+ID7LKRXpiqJxSpid DcNBR+aoHJ4OEoxIFJKcCfh3UGo79RiqG1fWdP0iz+t3zukJkjiX0opZ3aSVgiKscKyOxZiAKLiA hvS9WsNUtjcWTs0au0ciyRyQyI69UkilVJEYV6MoxIVpNa0qS6t7WK5SWa7WdrcR/GrC1ZUm+Naq CjuFIJrX5HGlRuKWndURnYhVUEsx6ADriqE0nVrHVrCO/sWd7WYVikkilhLL2ZVlVGKsN1alCOmJ CEZil2Kq3/Hr/sv4ZHqnoo5JDsVYV5wm1vy2dX8y6bbwX8NzbQRXFtK7JMkkTMkbQqEcTcvW/uiy VPRt8kN2JYfaKNOsrSyhf0bNJNJu2jvre9Goo8dt9Tiiaxit5Q5kNi7DjJ7dCpMkIHytpOjS3MH6 Vms5tJjukv5rFrWZYJBHbzWMpjj+oWULsLm6hDrxZl6O1RiSoRY0eHTL67sUitbm/msktZb6KOeS aGfSpIpfQ4pbvNKksdzbLVK0C9DxGNqp3R07UdVnm1eC3m+s22s6oEMF5NbW7LDa2wEryWqPHJDJ Zvy5RBl+Hbkygqsn8nXvlfQNSu7VLiK2je1tYbkxwXEdub60glmu3ad4Y4DI8JV/t82C1IyJspCV LpUGu2klvataXj6db3bXEepx3dotmNRuZJ7e/g9a3BaRUjboF6bOB1N0qXNpVvq9zc2trewfXbiR 2GqXMN7Be3iagsn1WGdZLZB6KemxR1dx8C0C1woVLjRorm/nWCW1sn1K+1JoNcgivjJP9blnto7G 6lFtHFGnrt3nNWUcRuCW1QFzLpj2L6pZw21tZRTw3a6TZW9/6MkEjwwfV4w1taCS3uJF5zMiEBgo 4MSeSrLfNdrpGq6omo3VxB+i3ksrK4tbiKerSWDXF/cxNEYjt9XJ2bY0KnIhJQUN7otzocHl+x1B 7F11mG6snSzu4ktrWa/E9qqme1MUfJWCw819Nm+FSQMKu8zWGjafq0drFd3MzzyGLzjfS28sitZz hJ+VxNBCtujEQLEqilEkJp3xClAReXfLcOoDQ57KzuF05tWrBaWV3dVkvXje3llSK0aNDCgEdebU 40U1WgbQg7NIdWtrO5eWJbvU7e1mXV7mG8F5AklmLMWsjC3aKO2nnRisjTBXq3FWPxYVTvRNS8la VFqttGyRaVfaXbxSQR2F6IXkgE8V5dSf6MEaI841km3G3x02qDaVHQfJ0ctxb2OmRWcj6YLGKfVB DdQm2msHC3sNnKbdYZhPKj+oVlBqzclOJK09C8meXo/L3lfTdJEUMc9tbxJeNAKJJcLGqyyVIUty YVqRXIk2UhOsCVb/AI9f9l/DI9U9FHJIdiqE1bTY9T02ewlkaKO4Xg7qsTkCtfsTJLG1ehDIRiEJ Bpf5daNp0kMkVxcyPA1u68zCq1tpbmVBwjijRVreuOKAKFChQAMPEtKsvkHR5LSO2M1wFiW8WNwy cgb65S6d/sU5JLGvDalOobHiWkJcfljpF1HMLy/vbma4eaSa4kNvyZpxbhuSLAsRH+hJ8BTiQWDA g0x4lpq3/K/RbawFjb3l3DEbe9tJjGLVPUh1Bg8ylFgEaAMoKemq06dNsPEtIm//AC/0i502ezZp ZUluJbwxSOAjyy2jWhjcqnIRmN+29e/bBxLSH8r+UdWgk1ebzDOLs6pb29iYTOLikEAmFDKltY/a +sEU9Ou1eRJxJUBZD+Xsy6jNLLq93LEsFklhdsYDdQSWck5AVRAISnCYD40YnevbDxLS0flP5f8A ren3b3V1LPp0qTxPILV2aSO7e9B5tAXj5SyEMImTkuxr1x4kUjW/LzRjYW1kLi5VLWyWwhkDR8wi TRzq5rGVLh4V7U9sHEmltz+Xtjcz+pPqV88Zke4e3rbiNrmW0azknNIQ4Zo3J4hgnLcKOmPEtIxv Jmlt6tZZ/wB6mno3xJ00uX1oafB+0x+PxHSmNrSD8xeSor/UJNXiAu70xNAthO0NtbyRyxtBIklx HbTXRThIzemWKFqbdwgrSH0/8trOK00QXd7M95pPCWWWNYKzXPq+vLIZpInuE9SSvL05F5L8LVGH iWlOH8pfLkdxp87SzTvp0cMEH1iGxm/cWzcoY+UlszqEqRyQq5/aY0FHiRSZf4D0j6n9U9a49P8A R11pVeScvRvHV5G+x9sFPhPT2ODiTS7TfJVnp+t3GsW97cC5uTSVAloiMpYMVf04EeT7IAaRmcDY MN6trTIsCXYqrf8AHr/sv4ZHqnoo5JDsVdirsVdirsVdirsVdirsVUbu8tLOA3F3PHbwKVVpZWVE BdgigsxA+JmAHvihWxS7FXYq7FXYq7FXYq7FXYq7FVb/AI9f9l/DI9U9FHJIdirsVdirsVdirsVd iqTec9Pu9R8oa3p9lH6t5eWFzBbxVVeUkkTKq8mIUVJ7nCOaC821Dy/qvkbSodUsL6CLW7qazW30 CzjNnbXDJG1vLEIBLOssresHZu5QGmSu0cl2p/lv5liTWLWJbzU5tTtNJQam17UGa0uUe6LrPMp5 UXnGeBCioWlSC8S0r6l5b/MyNry3tZdRudPjnvV0cR6kI7hGkWI2k9xNJJzlhRvUHpuS3ipxsLum WneX/wAwYNdh1K5urqZv0wFuIvrYNodMayAeRbcvxH+k/ZHHkOwpgsLu9HyLJ2KuxV2KuxV2KuxV 2Kq3/Hr/ALL+GR6p6KOSQ7FUM2p6arFWu4VZTQgyKCCPpxpDX6V0v/lsg/5GJ/XGld+ldL/5bIP+ Rif1xpVaG4gnUvBIkqA0LIwYV8KjFKpiqx54IzSSRUPgxA/Xiqz65af7/j/4Jf64od9ctP8Af8f/ AAS/1xV31y0/3/H/AMEv9cVd9ctP9/x/8Ev9cVd9ctP9/wAf/BL/AFxV31y0/wB/x/8ABL/XFVVX V15KQynoQajFLeKoG417Q7eUxXGo2sMq/ajkmjVh23BIONIU/wDE3lv/AKu1n/0kRf8ANWNLbv8A E3lv/q7Wf/SRF/zVjS2jre5trmIS28qTRHpJGwdT36ioxVUxSrf8ev8Asv4ZHqnoo5JD5z/5yG/M TWG16TylYTva2FpHG1+IyVaaSVBIFYj9hUdfh7nr2pbCPVhIvJvL/lnXPMN3Ja6RbfWJYYzNMS8c SJGpALPJKyIoqe5yZNMaTu3/ACm/MC4ilkg0sSiGWWBlS4tmcywf3iIgl5OV/wAgHBxBaQU/5feb 7fTTqc+n+jYLax3rXEksKKIZmKxn4nHxsVIEf2/bDxBaQPl3zLrfl3Uo9R0e6e1uYyCeJPF1Brwk Xo6nwOJFrb6zj87nU/JWl6zZr6M2qxBiBv6bAUlAP+S4Kg5TW7ZbHUtby6jmuVBkWMqJpCwrWQ0X qampwoVf0NqfO5T0CWtByuACp4ilfHfbwxtV36D1X6ulwIKxOFZSGQni5oDxBqB9GNqqN5b1pXVD b/ExKijofiA5EVDdadsbVR/Q2pcFf0aI8TTqxZQPTSnJtz7jG1d+hdT9S3j9Ah7teVuCVHIAV8dt vHG1VR5d1jky+gPhUMWMkYWjEgfFy4nceONqpWOoXul3haJqNG3GWOtVahoQaVB+eKsV/wCcg/zJ 1S1az8uaPO9rFd2y3d/PGSsjpKSI4Qw3AopLU61A6VqYRRIvHNA8k+Z/MFrPd6VZ+vbW7iOWZ5YY V5kcuCmZ4+TU3otTlhIDGlW8/L7zhZ6Q2sXGnMunLb29206yRPSC7JEDlUdmAbie23emPEFpGRfl P+YMk7wDSSkkccUriSa3jAFxUxCryKObcT8H2h3GDiC0lvlPzfr3lTV49R0m4MTow9aCpMMyDqki g0ZT+HUb4SLUF9o6NqcOq6RY6pCpWG/t4rmJW6hZkDqD9DZjlsTL/j1/2X8Mj1ZdFHJIfKv/ADkP ol9ZfmJc6jMh+qarFDLay0PE+jCkLrX+ZSlSPAjLoHZrlzYt5D84p5V1O4vXtZbtZ4DAYorg22xd WPL4JVcHjQqykb5KQtALLo/zr00PDO3leIXNlfT6jpwiumhgilnXj8USRfHTqfiFTkeBNoPXvzi/ T3lZfL2qaOstvHbRLDMk/B472It/pK0iPwsrcTEe37WIjRW3nKqzsFUFmY0VRuST2GTYvqzS/K+o aP8Alr5fsrhSLixiLXcdN0a4YylT/qFuJym92ytnaZrU2n29xHCpEk5jIlDUKiMkkUoa8gaYkKmK +buEryR2S/vpTJPzcsSOPDiKBabeIOCltY3mlfq4t47QRqqJGrhwX4o3KhYpup8MaVqTzTSX1ba1 9FnnWecmQuXK7cRsvEY0q+582tcQSwPagRSMoUB6FYhx5Rj4f2uPX3xpWz5vLzRyy2akwymSHg5U gFSnE1DV28KfLGltuPzeVr/opUGNY+MUgjClSSSoCGla40m0ifndXjeihLTyHhHXk1WOwrQVwoed /wDORnlrULHXNK1MoXsZrGK09YD4Vmt+VUJ91II8d/DJwLGTF/IP5kQeVLC7tZdLbUxcyCURyXPC 2qEKASW7Ryo/WtRxPvhlG0Ashs/z8ubOygtrfRIT6VnZWMqTS+pDJHZrIrVjMYIEnq1A5fDT9rBw J4l0X59Fr+S+vtFa7mmgtop4jecbeR7dGBeSAwtGwdn5UpUU2bHgXieXLHcajqHp2tvyuLuWkNrA p+1I3wpGo9zQDJsX275W02fS/LOkaZOQZ7Gyt7aUruOcMSo1PpXMY820Jz/x6/7L+GR6suijkkJb 5g8t6F5hsDYazZx3tqTyCSVBVv5kdSGU+6kYg0imBP8A845/luzEiO7UE7KLg0HyqpOT8Qo4Q1/0 Ll+XH8t5/wAj/wDm3HxCvCHf9C5flx/Lef8AI/8A5tx8QrwhO/LH5O+QfLl4l9Y6f619EeUVzdO0 zIRuCgPwKR2YLXAZEqAzRlVlKsAVIoQdwQciySebyjocrl/RMZO5CMQPu7YbRSn/AIM0T+WT/gzj a07/AAZon8sn/BnG1p3+DNE/lk/4M42tO/wZon8sn/BnG1p3+DNE/lk/4M42tO/wZon8sn/BnG1p HafoWl2D87eECTp6jEs30E9PowWqpqukaZq9hLYanbR3dnMKSQSqGU03B36EdiNxiCrz64/5x3/L WWVnS3uYFPSOO4YqPlz5t+OT4yjhCn/0Ll+XH8t5/wAj/wDm3HxCvCHf9C5flx/Lef8AI/8A5tx8 QrwhknlT8rPJHla4F3pWnj68BxF5OzTSqCKHgXJCV78QMiZEpAZZgSrf8ev+y/hkeqeijkkOxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV1RirsVdiqt/wAev+y/hkeqeijkkJbq/mLSNIaF L+V42uKmMJFLN8KlVZn9JH4IGkUcmoKkb4gISvUfzC8u2YipJJMZoHuUdYZzEkaxSSh5XWNyikQN +yTt0w8K2ioPOvlyaC5nSeQpaFVkBtrkMxeQwr6KNGGn5SqUHpBqtt1xpbQ5/MXyYsckkmpCGOLj zkmimiWrRiWgLooJRGUuBulQGoSMeErbJMCXYq7FXYq7FXYq7FXYq7FXYq7FUHqWsaVpcQl1C7it UYEp6jAM/EVIRftOfZQTk4Y5TNRFsZSA5sF88/mdc2Fncp5ft/VuIAnqXc6fuws4Ko0a8g1Uchm5 ilB0NajY4eztrn8gxx58chd9WG+XPzU1fSNcCazU2N2FubpYk9SaQiBbSCjM1eTeiGlqeoqCFrXO 1OihIEDaXTu3lfTu3Dsc2XHIVQ4undub+zf5+56JpH5qeXbg21tqkg02/uAgjV6vBIzVr6coHRab 8wv8c1mfs+eOVD1OvlliJEXyZlFLHLGksTrJFIoZHUgqykVBBGxBGYBFbFkCiP8Aj1/2X8Mj1ZdF HJISbzF5U03XhD9bknhe3qI5LaUxNRmVir02dS0akqwK7dMINIpL2/Lfy0yXCN9ZK3PISg3En2WS RDGm/wAEfGdxwWi79OmPEtOt/wAuNBgiljE965mNXdrmTkKSGZfT48RFxkPJfT40bfrvjxLSA1z8 ptG1KzhtIby6sYFLrP6LgvLFLHFFKjORy+NLdOVSQSKkE74RJFM4GRZOxV2KuxV2KuxV2KuxV2Ku xV2KuxVjfmbyTpur2DwW0UVlcS3CXE08caL6h5fGZaLV9mLCp+0BvmTg1UsZ7x3OPmw8Q22l3pLN +UtldT263t4JrGByzQJEY5XWlOHrCQ8a7ciqgntxzJydpykOW/ewhpalfESy3T/Lmgaddvd6fp9v aXEkYieSGNYyUB5UooA3PXxoK9BTAlklIUTbkiIBtMcgyVv+PX/ZfwyPVPRRySHYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVb/j1/2X8Mj1T0f/2Q== + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:21a34c62-1b83-4b16-a2c8-f9ca6c72273b + uuid:d5f4fa80-a457-0f4a-96d5-8273bf3d0213 + + xmp.iid:cd36669d-5f8b-409c-8af3-ab20958ce1a1 + xmp.did:cd36669d-5f8b-409c-8af3-ab20958ce1a1 + uuid:65E6390686CF11DBA6E2D887CEACB407 + default + + + + + saved + xmp.iid:7abf885d-2140-4aa2-aa57-d3771451c328 + 2024-06-05T00:51:24-06:00 + Adobe Illustrator 25.0 (Macintosh) + / + + + saved + xmp.iid:21a34c62-1b83-4b16-a2c8-f9ca6c72273b + 2024-06-05T18:36:18-06:00 + Adobe Illustrator 25.0 (Macintosh) + / + + + + + + + EmbedByReference + + /Users/luisjcamargo/Desktop/quantum/qutip.png + 0 + 0 + + + + EmbedByReference + + /Users/luisjcamargo/Desktop/quantum/qutipcorp.png + 0 + 0 + + + + + + + + /Users/luisjcamargo/Desktop/quantum/qutip.png + 0 + 0 + + + /Users/luisjcamargo/Desktop/quantum/qutipcorp.png + 0 + 0 + + + + Web + AIRobin + Document + Adobe PDF library 15.00 + 21.0.0 + 1 + True + False + + 720.000000 + 1080.000000 + Pixels + + + + + Montserrat-Medium + Montserrat + Medium + TrueType + Version 7.200 + False + Montserrat-Medium.ttf + + + Montserrat-Bold + Montserrat + Bold + TrueType + Version 7.200 + False + Montserrat-Bold.ttf + + + Montserrat-Black + Montserrat + Black + TrueType + Version 7.200 + False + Montserrat-Black.ttf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]/Properties<>/XObject<>>>/Thumb 46 0 R/TrimBox[0.0 0.0 720.0 1080.0]/Type/Page>> endobj 33 0 obj <>stream +HUKo1Wqgi +e%C mi{Ə,R "ofl?O`|=A8;Of=  b=~K]  w^\\G GnKF/I3H8~F8ߊsƜsCTv` (IO)eC%pk$`g>`N(hJAo0Do,EJN#VIdz(ӊLzi/*s'V.]9gmY+mCn%vNLKkNgkQ?Oq V7Lx Ap O+{K^zHOx/f?/qj.Ȫhά^] +C7Y +rgu2Õ$C % jz5B־f/h}9Fvٍ7,7pS;y~JYg9=,7iv>!dn $ 7t 1p= 'V*;j&>jtNf'A'6N:IXTj?Y맭[+u@Eޝ/t/>m{' 'iMĂ7!>]y A5Yi)(p`&,F풝a?.G7NY@}? 3$s endstream endobj 34 0 obj <> endobj 46 0 obj <>stream +8;Z\741:n<$nYV@<@'/`=/D*:Na%*s1Jpb,? +&r8O+bN;Q6B6]#l6]8/&=h^DXb:2:aSCe=N2>8t(C[G6X1OL(^KA)@VKl42Z*TB`3 +UM^>3;BrK$Nd+;"Ohu;477JQW0#".Q$^d`tD8&C@I".!/?dEL,I*k`^&_lA>P8C/? +UIJ"J7iQhYTHO(T+eqJe&i!!HBjB'F='i(+Y+btC\sA6/esD]6(5fb+?WN]$\5;+,5)S'WFCq@2,&6GMa&?('/9B6_4piZ5$G02@ +#o,TFnQ!]dX*ZZuW/<+>4]Pda3B#iV[^m4[1jQH*^T;^&W8:hA*?J!KFNMV"LoMXi +gT/;26tc%MoY"mb"gmUOrMJUqUn-JdqtoSW^3%]l`FnI\Kil54k=_mX.+*(C@"LU5 +q*MQQ_$%$#U?`J?M=h4$5T-%AQY6(+X1>d8H^6=X,OmG_ni-6\o7=.ppqgr!c\FZ\ +S>l8bSf=@Hs%XEOShE3aZ-RcBB$$AL;IaT(ZtUkg3OZ^ESdAa.;"Gu&c/e3FoSh"b +m'Da(PqR3dha+:;h.#a5q;TSjk)7>/T!;FW9:PZno#94m6KGpD+.\XWdWa(K?eY?c +=E2/B':6/]9pd0i"at+JU&UH48R#:mBPnZ6.p@bpEd-XRFGo:c+8\>[>O>15JXhSM +#2M#'Q"NK0?S;"C2fPbi8&!2>)NC>g^7g!tYhX^` +?f(JD@=@t3oulO%'D1DHlf3&c0?<+544KPom46qI&WlMT0N)) +rV#AHgO9Y5,>\@)~> endstream endobj 48 0 obj [/Indexed/DeviceRGB 255 49 0 R] endobj 49 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 40 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream +/CS0 cs 0.145 0.224 0.318 scn +/GS0 gs +q 1 0 0 1 173.0996 158.9111 cm +0 0 m +-94.814 0 l +-114.697 0 -130.814 16.117 -130.814 36 c +-130.814 42.136 l +-130.814 62.018 -114.697 78.136 -94.814 78.136 c +0 78.136 l +19.882 78.136 36 62.018 36 42.136 c +36 36 l +36 16.117 19.882 0 0 0 c +f +Q +BT +0.91 0.949 0.988 scn +/TT0 1 Tf +-0.002 Tc 0.002 Tw 0 Ts 100 Tz 0 Tr 34.7271 0 0 34.7271 86.729 184.6621 Tm +(SDK)Tj +ET + endstream endobj 41 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream +/CS0 cs 0.145 0.224 0.318 scn +/GS0 gs +q 1 0 0 1 473.6206 159.2285 cm +0 0 m +-217.232 0 l +-237.114 0 -253.232 16.117 -253.232 36 c +-253.232 42.136 l +-253.232 62.018 -237.114 78.136 -217.232 78.136 c +0 78.136 l +19.882 78.136 36 62.018 36 42.136 c +36 36 l +36 16.117 19.882 0 0 0 c +f +Q +BT +0.91 0.949 0.988 scn +/TT0 1 Tf +-0.002 Tc 0.002 Tw 0 Ts 100 Tz 0 Tr 34.7271 0 0 34.7271 251.3257 186.0654 Tm +[(HARD)25 (W)40 (ARE)]TJ +ET + endstream endobj 42 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream +/CS0 cs 0.145 0.224 0.318 scn +/GS0 gs +q 1 0 0 1 643 159.2285 cm +0 0 m +-89.176 0 l +-109.058 0 -125.176 16.117 -125.176 36 c +-125.176 42.136 l +-125.176 62.018 -109.058 78.136 -89.176 78.136 c +0 78.136 l +19.882 78.136 36 62.018 36 42.136 c +36 36 l +36 16.117 19.882 0 0 0 c +f +Q +BT +0.91 0.949 0.988 scn +/TT0 1 Tf +-0.002 Tc 0.002 Tw 0 Ts 100 Tz 0 Tr 34.7271 0 0 34.7271 552.7979 186.0654 Tm +(SIMS)Tj +ET + endstream endobj 43 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream +BT +/CS0 cs 0.145 0.224 0.318 scn +/GS0 gs +/C2_0 1 Tf +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 24 0 0 24 362.9092 118.8828 Tm +<0676>Tj +ET + endstream endobj 44 0 obj <>/Filter/FlateDecode/Height 254/Intent/RelativeColorimetric/Length 111781/Name/X/SMask 54 0 R/Subtype/Image/Type/XObject/Width 516>>stream +HWԇq fTbHmrڛ=M{9=i/ڋ+̰ `#& ZK4*75* Db/L{1<|!B!B!B!B!B!B!*JXlmA j += eYW ܷW] 8s1 0i)aia;j9_6s~MWGμ*=-<$|g%@-T3GA,e{#$ѝ7 YM)p}q͇~p_11:RiٜR*:ޙo?&E +H@`20q2m;UuEcy +OFmc5qLyܢOyUo޾/~&̻w|0yܺ^[-^U=qw=#%|Q`³l[;Ղ IwM_%j#lxYN`_Xb]1 9*7XƖ5&~eSZT[/$mkuwGc +vVI4>L<ML g`6.{rD1\9BNȭ"VMAIl/2Yf5[XX$*k%uF +cpjfDTӜ<h}N$)EmrEE]vFr^tY~H5L=3a54AnS@Q>CKgfsRVQqx]FZ_/ohr=Th"HY-ZId Qd1i{jBeW_;~yiN47E)ۖ/+*UGui;D9oDuܽvH1"b'J 6&o􏴕O2^=纖S_M ZI !l4m̚,Meʋ%}MC]sQ-:'F3#KC4Gq4@%| kï,&Ͷ"݁ +cZ?n]6|WgI4Y6lYE^U*uD;mmu4n:1s=<i(^D˨% E-Xdg3yFT`O6GDF%,暝;V)YWµGv!#Bb Rih&( sruiuߵ/ g5WeT#Tmzt0qT$\L #:E/ؚeuuh۹#g< u<=~itH#E 2 FiT gݸm%#2{"PX+躣 z<1݈^oaBhE0G~ok]0Lpg xg~kRq_dU|YA)ѩB +=j ia\MԜ_Ox/Ack0dsO妧؄y{Wee˚=UfxCOg] <^)b9s`rM w:ŰlvD&7?w₰Dw_:\%w*t +jtѭ/xcÈ jnmZHrUzLF7vAWC_k9[6zM^VT䪛 +7 =*_@`x!^,"4,˦V1߶jmAZ G[Fl Nfx]:/9%㕾35@c ZE`d z/VZֲRL,S8kK {g{f*Tఠ䤰X{GBj^M7iЪE:t܈18|0䍣.̉43܊뼖JpdrPNO@kp(A<nX";6Lyqꌶ咡{x!" ;[KPݙBXk)VpO lo[PzBTyVR_(m-V ƪQ':hףӀgK? ڟkDg[w?q=AJ<,S#AB'^A1L!U+V~5/e7)7r$ +v14``3|M'@ |Bߓk()V y*i׳8 ]P*V;M;C{nhwGz0xa?4L|q̓6'o0<9'|`;Ja]v){M/e䌩_s +#1tbK0"Ǹ,aE,Y+Dnb{g,nZuT4nLCsN^H _xe-[R7XI;b\*r巟 ņNk׹6{ }aGGljj)yl R)hG,NZ]ΰ);f>ŘmA!K=tqI0*DbܗWt6L-p3.|}a^byf*|6zemaR˚s0'<`F1jXi,A9P"pXZ=q a#0?N_km;BIp*lHrj4l ,R 2lˏګ4+l]PwoM}mbh%R 9a]1fO%vכ#ٕH:mQGSd]idNvr:GsaĘ@ >{=+(ԸKUY Sūv :;OVNv3ym>C0,"@h;0LJ %+ɪ0ri#)iѴ8IS)6ʏ2'4Yw?׈tH%C ex7 +ZRLж@ |KțWRůls*֕tYDg%}ebe.nMոk=Q&4`p"/M)APJr-9g ,&YNrо∃:9^vKOn +^N։%)e>0Q\&qӔ?*dxwgeը^ 2q࿄l2GvWzauد簾NUHBHBHB MJQvA "E.] (:AP{QvAx+9pfnn5 `a($*U\WiLShjKJt*mn>t@?Cfa /Mh3rL5HZxhYy z,z|틜Cl7_#A"'EJgđ e*T_ԫ/k}ń$1KXg1֘x"CVhO +/R")!Tˍx|M&Y&Ua8͘+0^|Z)cWq?֚n7me#?ffc7=+Jz@~ K:Ƈ@ъ+RUokGH_^ӑ!DH"ݏkJ)gUc]odVڭ :Nk`S|̸@aG:~XWK3/R_|HdF+&T5gJϗ7m0;{]el 1Ŭ9^ZbfȳXɰ#Cv^;JOu^h>?ttGW7SDŽ>KE~/S"Wؒ2P>SԪѭݯ7B S4+l@8D"BI0LlOʷT5"t듨wsyBr1wtsnVh=ktؠb9CiW8ec_t!xc=I|?rA.-LarajUz-MQ8Sw4_ORd0_B}]iRcVOzn3d}lsyX”%Jxo;E(>R=P텆hCyt8Ow=|X雗)EUJ9%35ZK-]b6<56޲e;O HK`GK|7ފITn=jGi7$:o aN>dqmVZ|~j[g&+4[١Θtô;\u7R|C)@ 3UԪR4njugK +ŴF:fs k]lr 梟AӃYa$$<nSz&Xs UMi*.OgܰUXW,/v][};d&(6w!s7,z;;%eyuB! C}8"(tǢ?w,`??`Zܡ\ZQFe$WPoLh8'6Yh5[ښٝ!@j - K TbQ3%%%w8'/(Ju:O^v_|YV~_b/v&Na%15Y)>$ +imEKu6q2$:y\I]]?51[@/^daI6*NAc6]QIPp"T-Y]׭3sLƯY\[W,_HlWHk;6{wQ1i cO=qk/orBQQ${hFG,zp:ڗxoƫ\⫕4ZpPt|A~m1G$)Xq/4R􈱮5$(JkH!=.uʀ (dϭK=F~y⣕tB~AQIgVjٖNȶʳ^u|\x,t^E_sy'a|jpnvm@'B? L dCVL8e PK㨟 R A\X'Iq{@5kY|%a,[m 8kwMq8 tL1SS/y@u3h"D^pEBą$GXt$ Z^ߥ'կ nehvLT߫3[hXz;h9NObRCfy2QB:#+>_III/* d8fߚB:Ct3604F."Qmk'YZgu# H4EVlsWɏ) +j˛w"zύ-hc F}1idab,e w:VMW;_(Zy1VJ^>ä#LтVֲy!qvYDzUo]+cvUap y` OX1[Xe=-⮖RD[0#B_$H\ GiILՋc$lo,7 >RaQc(*;8M\t)"-Ք_ꨯo-Om/lM'^墟| zcLa:hn.U:?(@~VȨ8ƤBb(5k[k[`uzv~Aฤt^muyu~ ܤ`4q)潰<cMA4Ae8Eh@KD!κW1O`o߾c j y%fk,gVv^ۍFƝp\&G2Xg:xB;+.NO^A1ΝIn)dg=g XO󽖾ZY뿥Ԯp\@obcHE>o'i B +0cmrVx8?ج4²&hĺ]jw]x;E%wueK-U&;%c+s{N.ySDp.nWw|=@W_ʄ!"TJ7I;dž/{fn~Q]F|A&u RpQ:n{b fXcU/UPԇQ(#*h ߛ$ؗtw%ItLμC%s ++Ukv>rsuI"HxDœ;P%O-5]~߂p4xԦ@[of)rSXBSI9cqIe!{NlVl5%T"X 18q5 +eS$FH$ ï-0) 1/RHl:7dNc.H3berms|`}hfjB;|\ bXU0A(P6KHJdL@k Z!!'ب@dRsRrD!ȶγ{v~aI]躢$6u?^hnP1Dǰ'F]q1y&Pخ TN4E~E4rY?0Dq&% +& ?'6dXnܜy+ Uձ6ەn7F]pI a Sd*r :-@|qA d8nJ.6ж`N9DVI̔icYGrmM;^v\t~Z򲞸 F~򥇺=@ 7ab16x`Sh*B5U"F. QhFcVM-ko,w_di2EzbBYQԤ%Ӵ;VD\JzA8HPx4Ds^+%zi}Y.}mfcȖ|8biߪ С>ؕ>B9u9~S.@"oKߗ| 4B)•HtD[x%_> zXv )i8a2hR̋B,+DVunӐNiy6c./yV0תY7F +fv+mh]EnBӂ EP#UA;(f 2 g6r`Cч$_]MmI+LQ ! dBB ({A "{BB{8Bh>VE@A,+<=y pzgr +lWf*j_Իp]Vk!{|"nvʙ %{Knrۼ.zE7saPz "q!Rxx6, 147mZ[X۪gK*]^Թnp[nt7H\aFcb| 7yPMm8" DC4P @.y$譓;z>0ݒZA&ce326Kmvݎ6o쌸iqI#bi2Q3 ^Xbj=ck_!: d3%e8w{TJ\Ty0%Y ];tзF"QL3|lʃcI7%T %7˅_*VnՉ* Fw,z H0~ z$kPD$Y?bD3 ϳ/ *DuVQ6bAhdaiY1eM%mZ:溜YKixkZyh磓.zp&BO"q{ILΉT^^A +JBNVEǛ%Oζd0[4WPBZ𧊸BZo'ovzCia&FXex~CjMdQ< PBL}stG? ;Q/R3O z]j_rqu'w-n{`5 j2Ș`M &^{ܵ^(;n3v2' O;9}?{g19r:Ma=N%,/9ԟu$ވOKzʜd/x/ > +7* ک +ڭiϡ! hB{,:ѓ^ z)AA^ @B1LJ-0 +E֍QbkR[il<|Rڛ +Uw5kYTpF]~3O״VP[a5!+aHã݂p2xƥ!&Ցۓ-ӬmՅW\*]k^~oSIDZk|p, 1-.x$c!Ծhj#QǢ>8+GbX:Ǵaze1u#UɎW K-gj*l;V\6mwH cjOP_Es0Dud?(p<0 <]i՚0+|ӌ`fB1sbci>vU.͡hz7k&(55[E~+OA[;J^9M]PF)qh3݉IDw:&ϺG6LԶ(f|s"ТJdUj;]Y=-(-ߔ1+Y+5ZΧ:g[S;mk"(Q:h___MiF)J@z{J ! !PCDM=@HHXEPDlP, ΢#&EŜ{j֫9y~@7 ҡ~n0ā_-hc,j&IP+d)OJ7KGdyfSCbKuu}mܾ]xeadt~.`6!0x"!8&i+^[$.+o46Kp WbF'ęv_$ +a4K:$MLL9'rؙi% +q:Aw/ml M"I%hcrT6{:?RgUr%oT ԂomhWuhDhIiߥ>n"k dldȑBsX ߵAݙwMxv$7O("(%O(3j c^|֡_r-shdo6q8Xj\9M,?`"p2ay1VJ7-lR}A'qjalGk goIfJ6G]ȻFfB avNپH.0*}(3a pDp$V +:)蓡6?K(f)tty%pJhSj*wP:5T=zL6xMΞ X\8pH +O0=/ c4 XG=:3}o*GB&դ9 h _/2WiӋt6婊*V|p!ZrZخ8|YQ%~<8YHzQB.b|F>j-sc.Y::zg8G=kE,Sg7p$ t1`o*6e<{N|Zz=í'˳_m)+ x + +z Ž5NV):pzǂ8\T'&jR@ +4x7%PSLt<`ߢLlMmH?yC|ؠsgـrWƕk!xE"H0H!2R&Px΄lxƂ1A .SlN:MI^2o)&Քd0$xCmbb0#}ƕIۺCkD {%(*_/B J<閔2F{ CG'N )P^W7+D{* `\~_)ڪ6oW5mm: k[SQУU\7=߽Iu6ޯ+s]5dF\dE1U)M9cy_~T4Z-kc|j5e s ++!< 2Dy,3VYtS kb0NmSaWsP R , +CH'Sؗ!3::\Si|,um{(\aB/s` aLHФ6 J%? fIT4~؂E[mjZةp+tTyi&k}?ۆo\] u m @A2 `Oн +LqYpJq`a-v9j[KeYm~!Y]=vs)E{ Ép7%&&&!MεSu7;ap/Fx0Cwi?c$BS&ɭцcZ/ } dpc,}|=u*t:'b6?rP_*^uqe\LZT_,-D}*osyg>bM26g' v)9Kij{-ߣY}6rJ`,x0 _A|Ç(Mߔ1fU +tO봩,Wm6Ad3lHI@$a!@eAZQYPVZ`ZhEGxbW|yEկ:繧nݺ/J*NpZ{EW}lX[h^ٯ/ı 4tSbg+t5IUJ >MIS1=A!B ¦y +jJ M-]=}*}ofъ|nA#^ Ja<U0 7`M*TAbx*e9]ġ@T}۵d;9>Le骠Z⵰7͸[{ăP> 0!& 30Ņ|x^ +^`@xdMvJz"}1͚.=n(8iYkGep_0O40hNx}ĉ!Y72 ~{GA0 ʡS_Q ގ!I$\V` !C鎣'G G Bd9/j-_Q6(?*K_{Xm +e߲"3 颿o" +R'ߌuǻ&RIn#1FUȭa]4h:u2s.P,9+%7erEY!ز +[ە:@h]`, NOݗ`cm GɈf%q%WV((9W|{j@1? Rx>n(|0_NTIYo40_e6>hF>rxG|]tFL *σUPxjEM26 5pl- BYmAt;R” +ƕ(+d=6R1j1Ԯ^`%"cZ^4!y[mbcV~(V},V헨JԿͪE=Sܨ ɢA4? OT^>69C4%BpK#HhxfΙxb+ *lE\0FMMe1^.# &RwZ_++n 7--}V`V]c=6BToἭ\ȡK}aX#ZIa-<'N| +|)Χ_.#.[O%HO0>>uL r._.#V'!ܔSُOg: x>SkM^z~{jPHo=Rij@@WfH ypFÝPpB=S`EIxp1IK )pWZ> t:tq +DtM+M6~wPI` jBПZo>).F'P{ +h2wJK]Ȏ{jH`l["nܪPS(6J6 =h5?Rx3hP:!Ձ.J|T.ap7=-#-Y@?afU!`K8]AI!icY\T{Y5#k@KhM|LL*qX) jxBI*t^%:-8PiL#Y)>p"tCҭfO3"griʛ*jj } cs,skg|i~m}??ejAgAn< bQ%&bFKe02yFSYKңEuEs+4Z2s:t&ld!ܸ{u~:ŀ&m5ȅ{LQL`TfO:.Y bDu\@$-׭% eFMiO9gEn`P}:ŔCIg#幚сV7?(|Ϋ-/mA?IՄF0$DɎ(`Hd|3+e +8ɼjN$C2;a9/i X 0>ۅj(2H>%g/ 1sj#%gψ+^ϗ~*m埍mbA'y}~ݗ0b0ly'yK +Mkmx} +~~9YP{O5cΞJ)Sc5Bd% da¦.`Њ,"4nhZZF6"tUsЙf措N}o})G+3.K˥2ZeZ,̩H6 +3Eq>X5Hc Y(VoĆXV BEgZQW5z^ , cV┝<]J-r2eE_M]cx꙯XX[ۍ&d{3=bm+hJ #4Pp>D2ӽ, o+׷LVkAh1u8f&'90A. `, &Pn)<ʄI ܔl?P ЃˆÒoE`V#3[4 }z]3IA726iW2g|5ݷo41_K%Ұ1=RLMR3{CRʂ%aBZF40,Po1rߦ:3Relθw_+pf ,KE׎-rXS&@ǩq(mٛ,:f?Mȸ!^L( Ȃa(?5. 7.@2-IG԰};+__%uohI#ma"Olyo_,,VJµ𗝼_mO)5yH)ĵB##JI~h l(8Al5?^$F}Uە7`$YlGlm8mDB%}:uXaeױ^׳7[7s{A狓MwE!E5-t(r؀ B0|l\q4mh.kS8wW%>;Ll]^JYp =rC'3%\2Zxi. sP(x߫4i?OlP)RnUoNMe~e?k?xShPҨub>0YZ\>.@܂RzY4b Z rR2M3 ,)<) ST,\)N[- = 6st|CSnfķsϐX6WcD?#ɿ 9`@;5) +fqQ &iEELߝK0$ c"A:[J+O??XXbT3\,O {y]l#hدkXUtN~lN͊Lc&R)^FmyJda/Bt;؉8wel-)RSuF2̏߱.p7Q|3`J +ePSr'J[el5W쿁(B +yIx.)v^ÏjǶ \]#5wK)Å,hU-ȃ^[` ftݰo߾/EQ0eTpۖqgCe0 w0Qt#@Cg$`@`fOh߉mwTT jӧ_ Esja"զMƮykص͎]֦zcUn(9g_}_7H9/V{V:MeJ鷧y2U:ӤFyv3U]G]_d~0̅ +ƅpM7dpK*95TAoz S(UhQ:cL OۃRZ.iVYQUE1%i鑚(+9HfgH]ʜAiL 1r`yo# `{!˜p5о}O|wPS{\Ң +^PjOq\)> +m +0m +7,p”&M0lV{~ kB^4h:тxɪxbWo:K=>[qozfA_}WnN͖Mj.N/["Sp ؒDk"%}F9+ކO(Np$z)tl=3]f r;~%mL˘20oZ6]w[V|>Ѻ_?+( ׽'2΢9MvFj=!ֆ2Q(1IPc}Tq4hqZNi~9QZ,SFLy2:-匥OY5f-٪G^s^lꑭ::ҟAi"LcIG09>PBxo߾I=7`>#HBaď:nS +7Da !:`*R¤Q.# 2)]W +niDwt{&Cj^̩ޭ5L5xoNvͦEb׊ES"eOr{ 8;1JxT2, љMQR駘YKhAexI5cF+-9nG+^7̀Y@o^Ѫ[{PP:*!ᚩ*|mEіh;Rq=~zqVRs$¶2;~]Έ8i%'uΓ/ +>`>d=b`W#5f-Y-y-g+W?=\I9KkʲQcU+9d8in/X*/Q{ +YBOp69{Q^`=F;isּ)aXm}*:$2R"hNh xѕؓFYR +sIc2]0{PMzPOY9@TcsۋvsK~5oFH@}!d#+In6J=aR!j@nAa +#3 SS{ѶP7>pU Ia iaFeY+̖r@\\ 1AS]?L$.f"WX#}"{>gb?g91ANtMCM2Ψh+-ש>axhzbᆄz#.0X0XpQ8cǎR>m7Ij@B т=~zLEhAo36pRY]5;`׽X~\ä0'i| ֬Ue_8xvq_E=nԫE,`25lR!Zi:B_uДf#fH8o>_݂P;?-"7I_JV_%3NOy/^WÚf#݌j*[j6@+~};xװ{N -HnA7`YQvւmUE Ҝ +bԦ+lY 7熏{;X4G¥jZjLvXNQ'ݬl}<,YEC {97팑+FZmAgzt;q0z9)!nJV֗DYe ڂ>_h2]E1,<tNKEm]o%Э3ܰmo[2ro$PdQ>b( P}J\߃榘Vt\0N{BBj*!#􄁕4y\D|y`xsZKd%4Ր;v,!fX)֎kF +ZG?,9pY v݇x)tCqø&|L0 a=.h23 3e9;[}ycoc,~x^GÞW9ztmٍ?ZF͜^yK-sdbUVw4+͜n'$7?3 +DɎ2rcq^YBo1;nm`p,a:w%>=z9aFDmmDCZ@W[ŷ a5V@ +=X<45-Zl\WU? pB(kQjבFZ9lgO +oxf`>"\PU|Z\#YŤ1ØlGY^#^A߉3hM̴~ C?ː`[ZJvTq +lgUF&`4Dֲ9K_pWN6Nyɛ6/~+~*VCi1I\3 p n;Ƭ`b9@4|9PJ) +T]^!Řj_NN1𕅄zPrat&h9]<V,49cyd/恋*,XbZHTÅJ0p;_ +"ݨH?^'؜(֍Lj aI))n y7z%/Z4>čp 0a-`"%`8BlٰXnZvZ7瓀Y"}FC{ +y_ݿOGNC4&BmɔB<(*H9!| ИnpRPf ?k +&P(2V\YxE*M%7mo%nW}Ϗ,4AzHFǠvܧ~V~o͙EJVBL9=J02"ܑb\\-5mA`-W9@uDsRBlZTt.#=ia 9. oϟ +â*$UҕjjlV!:kkՒJřB [Nvvɟ{]Z.LpS#5c +i$kANe?%iB]Ѣ)Fѓ&VٟP+Ѝ@W}z7 &m0m[N뼩< ZB !!'I:$:IHp 3 +(r`ADPFPA9Da-utufty쾀ڪ]>ԯ3V vFC7tYg Yg- YzXyTME)́cOr(|,F*c&u[^B*Z ٠m.B.pJ|sϲ,JK:|h 3<5fB$_}-Cr12W>1VMMX˅Okd;uOڽ6tavv:q"y0yp%..*4Ev%Țo\{7&Bﺰa{e7?3Qo"Yׄm8!XV\%4)*9u=R_ؙG W~ XAތcEʬt^դnSzq(+q˜,7l>Xs^ B֯-OГ +SB +WðM0iiܰÌ&a'o -AQ 6:Bh'0Bҙ "b# +Rl16Fw3I +Nl5?.+a(SscFu`%])^=mxֺ- +3z a8P0P +}]mEp&a(~dY$R}{^={*Looi'9SݴPwCnF3N4i?*A2ILoN3WN?ԩ?5@:MoK(\F]EH'` W<0ywC/M=fIkzbL3ƝӞԥeJռWgoΉvk$؂ɡ#У^_ 0i3%#T4Ⱦ / .`; dwNj/;qTM +Ň8.qaFb*9~|8IQ1Up)]+P(2}7aPn5r[Vsсws pud05fIG)hLf"#,a0#)BD:($<6ErǑ= J13Ef'~e6RZ.i?7NijB.d^)VQՆCi-\ML~P=+V-&Bpat"!5G.\^Ր=m2o\̨Slr%RͧdvER&yH3O3fl94s-:܂<h#^7W>t cwqMҥ_OMk{ - !,,@$$$lUр`Ò," " +uZ["Zk+^y9z/0wNΜѺQɡ1 =ے|iARV#>RuԃkSEw !>jOt1\:V`~dbm5- ڞ:FfE!WH?ZJtAxp&|+*`\R5 +-.$Upn%]3m^Cy׭L CFpx-Ot!\y犆9J}X3R{^-!n1~?pO +q$t20OK5!*Jwn\@?lIŒ'RfӗK'26*y?~>?#.Mݹ?d[;mt(.5tgCO6r }:2w(\=C(0histVk=FE=TT4U ^G+BU#ڌ fO0k3^5mwgP& # pZW=.Ѿ4mz4#W R.'"TAWtTBk94Azef(G\ Ky)"8ۙdV$ԾQڵ:wt/3Lqp%ZoQ A|&4 Qe{Դ+BQ{)#GȦ;{v&DANp!B! Ip!PhwB؄?8^MkzB6-F}cXWjY 2)|2j|Ed0т0]xدϯ4;XRBHNzHH)7҂(" ]:A0` *FT`f0Se9ʳ<f xhA7=83XM#3-,ZgHr BJ&wN'lP<5)WEܪݰj7m-n˦>-FŲ<:H/H[JxXN|ZEZn5~jt1+w9`~pXC=aDsm?s?NsE`_:D10u)` viy0ᇏ,5S_ȓ#/ەa-de=+to fh@PF0Z"A<#%0(+Ef?!_m/x6.v2z۷jZ>~ ʻ#`pZCZFY|Dd16&$8Q̂$wJ$TP3/( ӗYٝF&e)kl^8_dT5EamZu[VVXI^ݼc _ƒ2b\MyQOk;s*`C|¤ncha^3*JY`Lc#.zԇ%x ;_#Jj,OR g͸缌p!kL9w*j//I_74޵*ڔЮN ti[=:C0L0jItAȃ:%&dM +rԧf<f}ZŒ.MERPBȗy.eo԰r^v҃9(a\ ˜e;޴A&_j~(6U%zդ]7# ~ӢBX^`2ʀh9ߕz0 .%-Dji_À0,q \fp@szV:(^FI +Lrys* Dv]┬&p§VA̛7pfԌf!!-IchJTT!5ʔm%8q z(G;ebzifϋU%Z{mK4Ѩx۬|ߪjh@:uХ|·5nx{`v +{>fxlA~:*ojFtd&ǜ:yI%d-"vo]g0` iSo3o̸ƦlI$t:+}$ %₈dq::8z{:^)t>8#0"1pA?umdٔ$~?vPch*,.t**UBk%4C :Nr_b(/3L + +DdnI8y/sWpBNbmp[Kto\W0*f]Z7"_CBȲ!,ƻnn>67}رO~/ޟ͈R~%_ Y #y^VӠfAN~; 8aS0 B~y Ej_j+}Kxw;uwQ^pf~]Z)f &(Kq8B +Uӆ- -4GE9cc)ĺ&:ڕdexJu+W˄|EXU|F)UU,;l3<>̕$*h7?ٟ{8;}<`PC8y1p-08$ig2Ey=pgy[cA>"@x7[z!7KY~^|gZ)j;:$ؾ{=꘽}KbE yXpdA#&ʊQuE}3sޚpd=܇żRrEuMmIɇO 5IweВ mrhO>:pTB0lY` +nU=lr3]w@w2;P4C57_%θ)/m~q:iMin FpS]Y[5cwcq6uBZJW8P]Y^ UX ue@6hqNr@+/*" $*B"hniӵ73tY<&p@ W<ZYh} eYY[,R[ k"#1J5󑈼UygZdEK6q_rɎi'F <[d(UkI-an ء ~`5K>/znBlZ׶jo5-\nx,կf`jFX*olVD3BXDAX!<y]WPEJIi} FwEII illAJ +j冊l]q:Y?dG|ڣƘ.-OB)ud&w?9χA pF"&s `(8u89&K%7 +Ι"3jެ?Ec-vG' K_ ;ȸ&cN J^=5&#j`oЂ}J)>ĒbEQi +vDh.UEZAMsBZ𫋳>a^U3J8sl1g)"Vdzχ3FR/3ދʗgܒM!x-616v@lIv$,iwr㚌7mاݾ,́rQ5dj?[O%r+T١h>mЁQK櫅Zh*8Y _Dѕ l"QPQL +ZLV~7Ο砱 +Wϸ7}a5}o1ϫ~ ABrw=nkp= 0%2)gGQoˤUiSyGXީCc>gn+^A_@1Y_1@O T ^rˎVS-|lU;KYQnED,794ۗlN, U  , ZeuQJɴzjy:-&D+_Oii7S3[D5 +r7"-/bbtr;10*F4w1wLgrkߦ[O]%73rBT.TjZ}; +>m.Iޟ4fbKH TPn{S49I#pJB a)\T +&0З$뒂3^x5)`F0 fT b&B{q-}_,A'/hA)!|4Ĝjt2W빑|܂8Ey2KKgL0b{λ'zMFmG n4ɡO-Z@r?0P'jq}/tԮǧ;J>jF39Fxa"L uN[tҗ+wkug ܍Vf'I) * nC8:YCz8zˬ}i,ة(j+Cˡ +<6k +(DD`aаp.5 + +:4Uf6B 37yq`~W-]&k׾ +e."Ew{B|;g=ߋJׄ%}vOP|o]YV%icZl)=$rfKrs:3ea9˝wJ[ӐMhɇtZ68^ +}+OTF(@@^ 98 +-PU568Z:Q^zhFxꠦUzDXvQЌ4 +t-B@'PH˾̹;2Lf5.QX"+ +_3Xj)e>Ƿ䁰tMd,r"rbq VҤYu~x|zy~o@N$ +p +/~ù,è0¯:i{1kTʹ$M(WUjd +NcY(  g0M{ELBhd?hGJ'HIT!"$;{4Q{1 ЂPSB/zMr[>$M蓐TT‚lƤ90,[E6RCLԕ"sRQ%y]VN}?{[`[cS[Y/Un5>7⩷-w}GԴ󭚺}V.>eO7QYŴJ[.JZ-O쩩 2OSSSXh+ {!a IȾ+ !!B$ l*₶ :j,B(ڴQ۶̽im{j^Ū_M*;XG]obmqpZ +gpN# +\*FX ߩp|n +8  4A*zh?tC/Ser Gu# +O(PFH( +eU?2"(|k?$0L1PMOhOy@}0xFrGZ`9tft9l8E2LǑ|C?{KvgƹSqω*Yq+k5BC4mf訂#V8jF8Å6 Ǹ%mSf]Z%EQE{ w_H) Jw!9,g "D1Kw%A!;O ea3}{w`ԉ;5ɻ>ZZcs FJr =ff](r +G +tI#u|aelcrpEo_ּ pZK_y"xȯ+~`bU2f+Ojor&^vbn%Rq[:]c)s?$<R}5ldkB:pR + +N(="hVY n Tۡj8:h Bc`C B|p1嵏}&O.(#.cfn<{DAA|Q <͒׾yFpBhAxdGyeal32]^b{p +׷ʭ^-o[a{߰ƬvKD3HCR})kX4JCb!wI8Кψw%~[? & + v*>(qgIҔh]j?B-H()-4L38@7b$e &vxUmRhA:p.< +JKZ0`l6 n*E*Z2Ni/=V6Nk$Jሂ7(a]3.ԓu$BIl5):܀Y {8;.Jܳ GӢ+5̸;"$%&zFڰ9jdM8f`.\vW +߹dϊŊ57^l?˔?)7}]r+^J;+vwĞ1n))}„VjTi!G|GA')a*aL JW~ + X.5A<=g3J3вfߢq(!Jֿ(x7(:wA0Djed&s&i6:DZy<{: ' SX:BSN I/ _}#k-|Է?e`W.E;[Y^%y'9F}-XzVy%ONC[V"˹@d5Y0I?& ~ oD/(kYM;^ ΅<C l BZ<&/4x!T uPY zSҷMeZ歈, < [7)E簟$Ъ]|:L0LGbGOIq)UDZJJ?jr:tq/[CQvR1+ϼCPjXN.8G q=Y WM|t^)~󉗽Z~ +֋Jv[*69+NTЭ-f=\3@6 rmjٔF6hd3طZ:L(c7 bqSYɍ) b +c"1 1 pӉ#+1"aO"ܴJƉZf|#]vYzTڰ9j`OfsgssMdϓ<ʗ>vʞ Ebe1F7+|z> f\6{*3&Jϐ#>F>=O#sH55{'mAZR>?rL'YGڜ3}m 籇R+z]#yS'}o&h==Fho>+\B zf(/o5ւߏ= o_T"ڦRtf@.$QtY-rhUСT9,5tK-| zjk&0ànXjJĿد&<n[Uk錢r!M!"s@M#,xAŃAT+ő%'}Kb//PSQ{۾`~_#Ēa%i_دK̡i-64ur yn»5qyWƇoVhM٩n=@1Q Ð  ` NrQ@ZB[OjC uiVU=8ΫlGeGQaڦ)zῄ@3!`qU`_:37PDEbq=E5SQaq5f9 + ׍ dTQ\YO%J@kG7 Ԣs+RVWH.m~;AӾnZ+}oޗҺՏE+wЯqv,l,I1Ŵz.% fQFgvZs,|l:E\Y tWCw tf>]^xY: P wYUX麢pERpChM4PP-YN)K"3kgg IrD)屴7ӚS=TQ] K~ +S"yi<'̛njiIc%˺Lif*EIQ35}M92*jMƣzFM[ڕ:UVz4ЋA-e!? #z@6=`c0F 8IgrzV 4skDԊ *hL;gstJKj'.ncm +܂= pGb3)ܙYLbsx.QZ$_Nq;͟^4d\6,M~P޶:\B"_fHU[u(ȗ!x8cXˈa1oE-Ɏ*\긑~œ/_w nTHTɞ(^ԩ^y>f|تjA@=9ЗpG0h!a'+0" ` GhCm#4 :4H.z?e`oop9ysee3KtisO̓!gI3$ij(Լ jIABFyhJ0gOQıpmWxs|qM$gBFѲ}[1(KQ~?}2; +2oJW$edUO5ϕu?(_R7i>j;6s<{ ސ\^ i{<jQAZB\TT.<T&;wnM-' J0Of˯5KD#uyF} 膦VWC꠫ +xo$u">iA`-UVT̈́dWdZi 2Q%qRJ]ze!=#٤0 0d ` ;L8`Zͬf"(^}f4BzJ"X5)9boaDZfmc'[@L.0IͼԂn堄/}bpF3z>Th( dUdS.;vCS}ߩYsiP .DVѧ|ud$eL3Gi}_'NMg;mgnZ(r$r߄ D GoEEDX%(7ѭeW Ohgv;?j@ JhTCuЕ&8j :d>JP!.8Y ?yo&tZk4Ñ&(@Q0lO-C)I.Nr^rD427ow Ep8s88V7Սb rG0ڳ0& z/~@a28E2M͗)Ymf;n0wX虰.^<Iݗ-uS8:d,qVp*Yb>˫xʯDx.~)(,VŵJ6@ 8'AԃU!u H oG9iS^P^q?jgz+N;@VMWҸXMRB~f򑬌0ɣ rޔF8'g~2.O!Ը_2*TCS 4{ٷ6~"!VU8 P텢 gUV"x!t?幖Y)JO5X`#NȪǦ9bR,M6ŤcYp%` I$_ +%Jo``؝8n/$F f;_["]*J\%@DҫN;97&,Kh!ev^ JP&,\kl4IY-rhU@:ЩN5ti{Ɂ\8A %`4Ɯ0!hDQmN&ʤR7b%`e~ +`2)IbA–{ { q{I{)d$VS0-=lea;9^>ᘐtRBUI k:sEϝ̂=h&^K8$G9$E஑ǽDsYߨR>Ls})3;29sa.ox`]vIQ%fH/HSfe+5j;7 +؋ngUWՒt/[ *C:ԫ)Zuan#Y 0(E0h-zE+ ЂhխP +-P P^7Ԓ;R|sข-Pgę&q <p7E,Џat wpfΙ̜әSSi + D%ylBE(DfH}v!X[rR\[^fB~%<ߡ +xg׼xR_$~]ָ!oTrN^ R +E7Ⱥ@6i#-?[#}Ƭ^-hw%-۷G¤V0̬k{\ΟֈKv3i̾^*T 4@ 4}8>5Tԇ.k0BM=-{#ZW>ẖ4,YH2B8lqlz~L5)6վ'`/$w8I"ShuH U>PO3]7m)0Z"(C68ÌL>vX,g='J*JWĒh*[p;dR{I6<>#:`kB%~1>fԂ}f(%{:ZFicP xcI1uXFW2'i-r./Ϟ7n̢;f=x*YIm +6ex$ǿrfs3*Ƅ<맥gƻviv_G?bl}7I#TN yDbƂu=.<P)F,+[_jAfH uhBQ :jN8twCqQ"G\ wH &rAbBx(d]ڲՎVW] ~A3><)ѸHnqÐ ˠ vwB U nAiص`9U#aUcG,YONԧ$R%'ۏ<&fx(YM4lkg٤^.OE,NXwNû(Cb6%̒b?-;!oIQCǻ^E4ѧ NL;߸KW#~s~%=׈Oty-; S:tQά~͜`a.YYطy\DkOe/>@&Շz+:h+t j(A` #; ek_z +/ +D{&G_VznCFT +ɾ@]#\%r`%Xf ŗ (x-gqX$VwGhNcc) +i4)8 +B $E2Ō 9&^W"k}NnCn\PS{v$"ٮtDq8U +G/Eͨ; @ۖ}[ѵ@AT'@80Fд0@9A Q׶ 7 >g7o?zkHPز3jH a 8R2i9*۵NwCC%jB%MqGvpxW`+4 / A(lKФjlAK7@ "@_) a 0a7 W*`Qnt +yz{. +QwʐM,Lp/[QU{A5*dPrrp`8<VupoԪ\rHnHI}N!$ +  AXP-kW[+mZig?ߠ3d[>^ƘZ.^P˯VCGWK UeP?4@K=6@~=0ڡ!R};ԶAU+5L\T}6ӹg;mZ-d.~>Q%ZU+^Qݜ[u@mZhA:Q2B =Y  Fr!Nb +L&J"ͼ,Q-ytJcIɥGc0 ,QȂ7:c +pnbRE +FhژΌ^-MIiƬsFśW eAr(]5̲,4Io` QdI')t\>s@9DUt0f'^)yX2gy3%cʾj\m8$=^S՚5Wu h4B,Б]v̓> `aFݘRR@  +bP >pAa/غw%ۢKa ~[vcG/Cs]K)X8)% + 9o@νHϓlH9 1{h9M"dLSx#*7L88NiO4N3©CRO3ؙu65ͺf[箤p ~WxMgWh19 %{O%ztuf6>5HP4=Mۊ2{A=A7 + 04i {̀>n:h@$dj !Pl ;ib7?h|$=q١C19IInF`1xIBzIf1?rض۞]|P党J:hi&hm~zw)ЁU:uPv(og͎)zB=O2T#nS4pJ AP|$EЫ☵Mܶd~'Nt dIjT xeYf[rm7멼i6 _I i(a})#lm>~μX+uy^}'g~VEeCvzY۪n(#tˌ՝y[-o\q@Ƌ \ S.rC E`ݕWęKBEG<TFkb! cs-Ή,Hu +p |L'3RXld}&%Y9!S.kŗuIfc)nLuA~M#XR" +Q6R|ya롿?O?}J08Sc}F.SD (!5I;O?gd^4,+窍jl8E_Hz˔OUWRkֽZgة76&h@ۡ+zW",!v F˰F` qA} B~(샼hْv;m?[~6>c}qPq/5q\FKdA)")wd@'`sl|,<7OMS8c 0D Џ%N&kQd1L1Pr0vؙퟘT--{W=x.,B_OMwvvk=%$$$&wB!!$! LH±r + +"hwVgj;( ʻo`u;Lߙ_|ߏtSb2rn`X3߲џsy(lJx-x+ޕ~z_C$zӉft΂fPOjSA6Q (A~ dw=guLq!;RIyu) _5,ᄑq &(ið,6op+6VF{!O+cj2](ɻdbVY8y\:ҧM-׭ʝvջz/-tKz)zKFҏ2A F0V.3NY +W~Et%bF2#Lt=%29<)X1)٘\RXPf9Vne  +!GfLi6-ʡ w^V(/\R +.kjVn?ljjѺR,\Q,yRμ9ɧ 3Y>L*ෟ5/s%氙oba; r<&NsZƢd`9ܫeMs›/5NZcW^ACOӬmѿo)Vo !bu@Zr'@Q7Dj!TO@8xCm QmAa5sj}OKs$;_lkD*2z`Y&$8W,rr,.gp%S8$,V?ՏcucY3Y4Y4 Q0r( EA9@yqa_"BUFf q >"7~Ҁ@.֝O H󹦋d2 +rnbtbpq oxT{,hF3a۶7iϻP*z4 c@@BK4chDyPϡ΁j38H΀xP~='ݽ|J}CIV\v=)7HأLT^Lzi:{zڡ= :~$͟`%?G5 a ʛv9-*biG-#yTaX )48 +qi_4JT5qiZg_V лRYœqT{VMRy%2z{wοs?JY_Qݤxլ|ӪiSkZCen1BhaO*SfT Vh 9a&0,'X4we^"Gr)8OKX3*ˏ SS+P 2Ҫ238k$[) -N˧EXyQc?gM93b޼PTxI.\QjUdC#n\SDk +eyᲜ ȠQݎKwAŧOH2$ I6rz=񉃢uB7b2/YԂ bFEt*wBQ%V>թ_k_54v|ݦ{-h)6#Ma +UAmp 8U)慨NZ% +(A ]<ρhqOAY8;9{^2~)<;yZF6!7hJ2q.oI ڐȶ:à +V˺ Mp -] ==V +уFu<~p;[ʋȥ38iLo*͝BqH jKzI{3݇eFxD$JM(ϑd%j5yaI`#+LwzpFQ4*^PtK&Jn6ݺ?m>r,yʟ+^zoΨw?tk=ZA 0`A$ rU$h#!PpDkf\0나־(657S\:YSNl$'Mi'+Nf3NYNffVc2mH8Lm'w$O3LZ]2e؋β.]-hG)UwUh[0`!-ېr/K8sKa;QѯA=_ߪR,b?PJaaQ\B>/.)ke-󪞵idJoTpnVݶX $K7ʟ8Ofseum}kLt ʡ #0Zc 0A0 ԂfpO; +(8Bc@Ma0O~QN8 w{1ayp~;n3?vPgWu1ײ{zo^W,/r sٺ,mhc1h\hMwH[sȽ3}iTzK +9J6\TYQՋ.!'K*0^be)ߺRh[_h]zdnm.ö|#qgPf, $G +̀a `<}xU(]2'2O[:h@ +UPrK [HfA4 IMpF_^0湮ȇ2<ɑEQ7-dd~yc{z[g3} +vvS ad?%LnU`#XQ@s\Nx;oQv*e.{x`*ӟ+iOu `|8[9FVOjLA"ղZ\UR˨E"LŵzQizNC[ї %+FƚuƽVɿeީ|V/)VëYȧ}= ꟷ_(}aziJtd,mSVAO9C•Ї:BjCi1'uC Sh)&Ѱr[̐D|`Nɩ L#˨N%&-YQI vOEuL79O06@G%,8|^,\/%k +RvY%Qɯvщ)VJ6rњ\xI*(_r渌hJ9IZ^wwNt!B2ۙ9:.9󂆵mLp"a}\.]%ݳ*Po|~={OK3 +X^ZoDЖhA{tUA=vFpBC6p3` +0f)8x3 S)OBe 10{z4$+N ے–?{n9Rw) Wrs[9u9d*z% Ӷi#YfIeHxF)`A@ԟ% 1v! (^+"XA|/ۯ/"H5RLH%jVlaUVЂp,&|=w > ~9Ht@9&<Ōyj~[FsAA P cA;C`)`\*l,}2&v4^(WAe-d Ax Ι/Cώ B Co/8O(R4WTt=sŃWo\hj_' +~d + (VU Vhw >n:vȖ>E7MЕ=qnEgq^g/ +%$y4S9>KN)ƹ2նNFo"3%ɨqmNC_ԕ\40VKYeFOv^^ [WYEįjx,}uÜ,. Bݨr8U=[pav>T A017Ab0.slH4QPFA =ɞ"oKIZ ? Ñ!(yԢ0x^e0`cNǛ +΋DKL&ne[ +e|[)Imѷ2TtI*(\r繬)&}VЛ'?<~]o~U#rR)62C^ᨨ(&S0T% nm;&YxLt*\zRWWN}^USO_Mg-羲>~VVD[WABsB=P3D[u) `E0p sih4ơ:S`vO^,Ȧ@4E^1B_w|A |ZI:u⼒۰S9DZI['׬fW*/dG0 f28th x^3WUC8eK184NIPa4QA=ӹp_Omy\2sQ!@E IUC $$!TE $(Mo.ؓrɝ/8.c.`A̼Gpg}f +v}BfN3]\l 8 o9c<{աk8v,f"4sX`/%WR gt>"!"KA6C $~P͂zT ^5216k?N{.nKIld[ :]?);:b]}?QpϢ?KL֔ݙ7OsEmrOZx_]IW6ױ PfA};4tBc7~?9O k ?gO(@@skC۫)$C@Wa7%o̿mD60( EХWODz#V Rv;bCKiZ6#JҧdʜU5{(wW»gBXЯl% +TH>Q B":,JK #hΌ(]s֕-un!fV[3_ŧ'VT=sj~Uܭ{ѽq|#ᵿd!TU=^!ntx P5 ئ:I0N~ _ÊpxoY0kT}'vb }Q_g]3/b膹LniƣEDTQZGRa"颈;)"2NFCd!VFDEBQh'M|+7Bv~>8Ͽ8|'"-pV%9v}gS |R"Sw x|,8O G@֟m?/E]O!8@>F@0 YP+8uPc +l}5&n)D[Pud7@ mlxu EwrǏY#G9ZV_D>\(qv:ӗђ +g史|*"J5_( h-OJ_mc*렦 <-A]4tACo;X + {\Dak')$fa^8-Jw`$?k"jh A-Ӥ}XHjdf]a=ʹa>Q0')OF'$E9kY^Snj87t%&_-mv+ +W):.3[ܯyQ}UW|T_Awh+%TFh.@) mZ_+QjA+ +p ^ +H= Bsd`ng^2k".Z"K̈́NRN,Mp3uI)Mm=9AV;o,[ϟ ]B&*Bx-GWdU Xx\=ٛ禒K/~*9.!ʣ/Q) -nNU~5${JĚ.V ehwg:AQ7KC|ߦxdW>vVT}_=)FK[cx5-9_ojufhB vhu@BNta^>b cP1(̀yӠb_<(|dK dGӌԺk&V%TNp۷lqekF7-KbJp hhXThT0U=HUPy, ]dI'YA AFBZI' +d^oDFhgNJ833S{fZEH !,F J $d#  ! }l2SΌԱ:cZrTlM{'//B@$M@7(fپFT}=?#?<QGFA+A0%>#9 ^|@1 P/z@=+( +K&GZ +HArK ++ \f;(0G1=EDN>M4%VOզgSh!0ʖEu*ڲyvJPW#xZ P{@ 8W!><+jW~Lp U@y?Cm{CvY a_5׌43)^ؙ K&{ ~z0Y3?KO4-P+JM2N%r:'C|(sDBѧ93*Ɯ&wߘE;vR}aJYEu+vW۪֯mw3@L`F34YZh6,;誀nP5 Z@8=>07XgH9mI$Q(XtM$ 6(>FKh}@ nS]k)Ikm`LL&ƱĢbBPB`Byxuo1e1.4N҉wĉmq8~K9mD4 űbqb8 NL@JՌkd)(2-b7;wӖ˨}~aU/mKiq$h"U ߃Խ9Sȼ؛W7y>=S!b!2 +(ࡣ9兠k[ܳ# 4 0(.(@@0)P],C^D!P_CP]&.DZCS }r,t$+he-0 mpdOsw<GOT 'A*ƿOr |(LtqQK{)GT6A𝁚nl*^{ ^,t}J@{C5(p =@^O/LSKxyr/Dإ/ +t%zP2LP5CKV7n![)$zSB补2=J sXLHicV\а5=F-bMc2գrcgM_U߮1@F3A,hЄlfZZZJA't +VC5pZ( /SX]Dz ǥ;bLG>Z`@@KVx=1IL QNd{2sBY0-wκfpFryclG0^fYxA-" +9HI6/ee̮"щ;ƒ3_VqfRLHo>Ťx9sB{Yƚ,.yUVtS'U$m`VlX=(<,ogT_8*^Wet޸oyL^ˎ +v+4U@Z\*h@G5tzQ:|j>qe Lc`h@3((A1 y΂hxئw#9]zT)2b)q5thG-H*L4Gh$A?/;?Sv\g% !3CH G  @"ZTԩ][Wuujתu=x`ݝٟvgNK7#5'CʁE_'^/9/ 6o0ۈlTbFjgF)Tyhfҵ%?+r〱q? p pDAh{(eib\܃`a= J~ XI[3 +1ֲ-rJ7y$j$&x,$xr +ܓP1h:^QeaHXj(Mv'JN %h)$+Uh2U;C.Eb\Ze] +NKrgÅnV0/wBJL.+ +Y5|1gCǻj0oY%_dwUGncOS5Z+ۀ} u@BЈA PvhF9ZPRQNhwC|nسxCRAsR^'pGKHCȂd +l"XI$ 'S@PzN 53֓U؟Ceh{;,l2[|#^p(`_d!st4>ߟJpط/s'/hc +jY0-m ` ӠX"(թ< \XHK}:u $ +M^%o"pցU`,Cfs'ߢ8A0yI ZG&s07Q gW9 |HCjPeW x:|}v`"G/)0U=.g[&1*=ipN}Lf[%LL&i"D Qї(E8>$kR'I%өYtzm-)7P?8>Mhs¨,g* ż:uYUM~Ϯ_~<^Tj }7>;y;`P_ + 6ʠюv@UΏjqA=Q ]5` 5P` AHY5xGƑL bRLfA| <LNN s['2 zٌ\H{,3Q*s S-Xe7JZd o3CceI6$\y44 +>9B,%Դlj[~V=g?)kY^rɹk +fJ^7D״/uқz-IyǢkU[Zt聽{+Og.sgKy˃cy嵾)}_kP7v|{i~9=y^gk _*7'9QZo믧wSH䪭$uXN-f,qXm蘦?uotAw3JQD=R!j6Mx~#ۀص8v 18/ёhh?Q ;.2t:0pp-'.r_rp2?p-V_hٻr3i%B!(SY;DF'2 +/f+oߥ:aڂ<>$x&{_| +$} E,b8πb +3@NvA +5P(7A>T@qM*)dėAK mmwkZf!~JçFI)L_r^3qd, +hKP#_(ո=OM:(ogTv|=8-@ ˃UPy@ =VlQ,qpc lPՉgɶeb A?+:[x*T\a_?x M$'Iii.ղnۈsR[虝>^ް:.OIsr梂U65Z3RMvy]G.=wJU'^>s߼( Z +eh hC њXNhFr +hqJh td-tCwz[:xCH-ǧD> hJB-> EH&QH9MiymԎLzg7՗X Q.`x$~_'AVS0I#S"їq9oxΑ#G(e1"F +P͹ZN3M2I!{VYpdU9M!P +7UvZS,R"Vq]ܠa*iV*-c)k|]Vm{6=ax42>v~B0=9m~ZYjKoԺX@ M>t 4*0!`U!+b\sgl`]$;Vyi2^7W2W܏V<_J #1~"0lN6͒,igIMRҘ> cB1#eK +Ί׈vkzubϬNﶢo%+ݺǕ'U^so _~+ԔAmԕ۠ vhtX.hrA a-Upm>8Z8Y(hEjS)dO! DSdR)bAj5:<.M%eՓrɴ2]Vo6/3 Fqp.dix)AQA@NTH.?ޝӞ^GGDgw9{| *N/'%{3;iy0!}ǜ91wQ[W5pC)TTEtH_+Q~U}/342.7tq:*R$$PBH!4YHQ(=u]w꺞:<'oϫ[;]]Aب|bB"POY5/WNacV hz'48ny8ԎC8TCT;?EH@9{ W;~x5!{Y$:쳩֙dDnd&ڢolT7qǞxiG=N+hb1hV bxJQtWT3 P@(%h=k4-l+MG*=QΪd׌ndfHqOLF`o879 n׹YOo )R\a6[?1@: +p߄6|Ԍ! Ѐڎ,P@4Ut\蠘۬V{vC8ϸ__ +A8"1nd$A[ Ig 7Natg@ +S@ty-\ƻKe40> @}S *EiغݝFnʤw d|Y5Ϯ9S^nVXV;(jB`hk'{<{_8C ϹJ@Cp,!<\soL0>AvdJӎ(ka#ʣicDn,]s"C;ifOa%oNadSh}T8!fNJYӥ*de䪢f]ߵ꫾7jYOOmʟ쪟ꗮWnkWӁO~ 4B(34X- +дcf' ~Bgtz[`O+6nI\.6S&)W- *x&!]Cm0nvn 3-YԎlZwnI_?u=P, (TAX0LЄtZOD1/EAI.33)5ӑ$Ċg6l}g1˓D‚. +s f01>{\șqżT0_*\(-0 v*եeeW77TUP˾|>+ JLQфRa_Y4?[/[im|VN >7f Њ|j&z*'b +fYpċ : YLB +eU~]eK${!1j;bL6تIDoV$?(ۗXyŽqXQk96DsQ,K` t 7R)d"Vqcʰ!@(0 +LQ"*MIAwxoz@採m9y|,zg)Tbm}|iY15h +""5T3^TTqc1?rQ!r܂_w\f[Q>8.W -tJh08m?r:s~y aC : +a8A2 i,H< YYσA|=`` +\]x^y`Pg<[T_le%,ڔmM.[=۹ EG(;fNOuIpzT-h.t9| X0jap 06o['W|d-S;F  M$Ap::<>SUDzX7J'iuL,z+3ҜyvREXC^ɰq\Ĝ$R\`Rt^&$/RQ~CUu]mm쮱IجxbU*x-#U{55/D.3M$S>bt$1< +>@ ox!Zv,%}`,J\Kй wKjV^U5ٵkuN/ܦWo< j.ă !- +H&A2oHf7M E/r8ъ7!`+[-s1)M@-vENvF0qO%.RyL[>-!Pid~ȳI]/*ޔlO48΁[n#kdv2#"gC^8}N>P)hpn0RT{GiE?5NPT/ qiIG,WK.!Ws%,Dp*f-rnso+*TFP[D/jPb*ynVf-}eSkоs6\:[nef\*QVA Qv_>jPM>ԺV*8\Mup6F8~7Z Ec(%!1؂PdA+ތ^djetz},1.e_$dT~+U5U؞&Ntl]M0^C'.r-s!)T<9&:"!~'4 +Pxah(1}Iɍc4 &źt}|ހ?$1hBB\O! %39YYsy 97 +ry +Wd+-.aE?)UGHb )Y'{QźFTz/QҤ}eֽZ m c7{N+ fXuh~5*q(Ț, \2Z:Iӌt㶊7< Ӏa,UzE9oP+821N`le;}xGA@=_:Q-W,FI&! ЉɊt(O ^R^L+y1'y.|GǬ5gcy'xA +6^Qz@  bW@< 4g b@bo+=q|*ȸ+ZE`.@,Ч! +|Q6IH_xN0E`b4e'8,iO0e9r^iHL?UQm(Y_g+x .dK`'Yȼ+c:@ .n+0Af=P o(hXq$ + d0B1bL㱖NcnU\lyJb#zI;fq3;!y#xj.q@ ^U|XZx_SH+_l(yfT>7^ZJnUjռiu 2nPn(+Tl؂J;G@ |ո+`:h:G6#p@?)罹<9C!`! )})$RHD`q7 +`AE@A "YޞgY rw<'wy|_{l-UfʢTzTZ^姲$p'fJMOLxc!mfHLi Kʒd QʔX]ԀE5ؤ q8 +J ]]ޤ):p8{"Q;a8+ɤr`|(+kD5T\V('r'rn*ȟ.Th +j‡:ͬ^H;2ht?t?Qzߌoȟ~21b|f5=_-ַNۼv~t;?]d\\N9oq1^JA9@arj1AN`6}H9}[n+-\ܳ Y`o6lПԯW?[N7 + +@nYnAK" ]%:i])HLE  4B+Zl$u&w?U*U?!j j_ ΋|׃`IHAr$}  ad${L 5SAL&"n w1a` @[W`NmfUSx{D i# cBQ(>6C %(iO37\dY[FdiYtu!΃Lv RJ.Q< +>"?ލ_|)F~0*JExi~Uc6e9֯ /)&Tչ4y3:YcIEԪVOez6-Xߗ>z퟼>P2C9;<%P%D>D-e_尳5jg7hB]:@fVNѭ_ jFE%آiXF֌]TmI`'.mJ53d)oeP7LY+b7ѱөɼCX5q)Ma!ih1WDm,Si;it!&X' O +DgEX?=W".d2ۉκ &y)y從.x[x[P_6oϸRCW ʠ9@H%7= +^<ȶb[y_ 0`PE pI8, Г?r`8j +[1 :$O,@|$ {S2o FW Z Onp,0 ™p'{8w 6d H97e3Dܛ%љ; 4TqfNom;2$ckB♖yJTj07߁ +BQ:+нPQ7x0XA7ӍO`@8l`iPZ1J-NAʆ)eCҡy#C[%M[Ʉ@*!Ւn:"I8%͒IҋJZ9QjtI?ȔgEv;z;]P0So; +PREP/KU BPQUP] ;jv'쬃zoMиb<*`m}ނ[+c3k8)D Mܖ"iON:N[JSvu .9,jMbR(9%K“#Vr"+7F[)@cW +ْ>-NnGa) !='L5(W](Cae5Z33{Kj:Ô07Π {} |2=!8)~ +9wL#cF%|E:_;\ou"qoV+kq`r9*t&A ʞT7}m9 ėtj*M8(bC,4A$@ +ܛFIH%$@ Hg@dpTFAQ@D,P)b=#iά3gg{y=z?>|zO{hg6=D5gn}-_o\ݮo ܿyQTg罷cq! b(A)UY U!SPvQU.UY U5P] P=ԂwVh{ڠ CM 17Pc 6&ы"RQX~spo,QHR9L5(Ϻ@h(5WUkjun2+qpK꧵n6x'8\Лw.q)~ 2+Ȝl6c{f?:^ ܗv+5zs`ܯWVTxyKxM^%Ծɝ?Z6M݈bdXDpw`ogKnW&sGaF?6d5W6׬ +5/JF +iE>(Q w*b1hivI@8 RX`8(R2Z-H0=[pAvqy;q7riMs]9y׸x+ygh)(EKACpi)>AP5T͋+g(}Y/k_,'*٠tQ@ ^ rȳ@<@t +x Ѽ1 - ɧC=H,pu&aqU|}%^GeItu7Sw"pcM^97m2F+=QV־3`mp.(\R`;٦9hyd"<1-҆{esu)z9p>3#4EO$G~{ѷW.EV c uo=j;bnhjnzu:eZYU| YZ],B2ͶiYA7%8hɲ(ѲHbYpY`Yahe0͸D;2T n +!m? Ap3D9@R>O(' eZOr{ּjc.t +rᘎ3 &B8\0I3eYFXQv9um.pswS8*bUa=6/;=(z@Ѡ;3 b @\bk@&bY΁.?) xG8UCH9`k +7 +#C\[S}тXq+-$e]>f7dqQ,+""XJ +IRH*++ + + "JDD^vggvfgwt~/v/yN&W0 0l(>uL%:g9O_LgZzp6 2Z '}>p lG%+;&U=8`0! )5Useӑ3Q6=p[N +sFDPOPjepn>vK JD\9LOQM;$~u4,S`zeL{ni?Zl?Xm??;v~qrr{~ugHf6dz!+ \r [wE\,(,#pAq(= 姡*B-硸4yԂD q`z!YUD$ՒuE$ђiCZz)Vh[&o5bAG%Erτ1';wԛoA-شk<SIN8ˮ\%^aIM, &&j;[N/z}@qG[ R'SF$)2CjLG fRR"GHv̷҅F,LM:BdO ^YZj3qAk\Қ/tWzh}g7ږ}Xa@T`{<vZTkʲL^R$dTtt8p@^@ނ+x ֜ڙRCQ]ZMT5)wKbf̳Ȱm!.Z>B.\.T`Ak`~AlL} ƚƺ@6[RwFYR'$#WT/E5,C H5A,,k˞C!x'ޡdmImLb\ ,}+UIv㔦{^:np9S&hj>2/ºX3`7NgpG3 Ng83y '=lX _8П)P@T߻--iqABV~w2\X)*3me$5Ϙ彑%Wݩ/Z\Up\W xZ R.8 6X 1|H6n0􀡗<!nƙ("_zY5GR;b *?p]brؼf,+D$I@+RB~T*(ǡ$(?Py*렢.@iMNCĸ",s,w*_!<)H!JZ--kȯțbHsz#N6RWȼs؉z,0@w;k7ް}(>8J)G1NPg8t~#:SmǑtpeO,*EǴq{Yw\<k='w$Wmmmo{7s36쿣m7ppP)/[Zz}^*U{?͡ɻm<2Tx6B~9*iwƛhA^Bs,=,3ԙ FKffgIFb76"lM&uNz,^+Yׁun=]F!`Mf[_%,c @[8KF#z "Ha1L/{E)6DQpW!-Ƃb7Mī>qp}>ksfO\/1G;8`K f/(N@L;NJf~08?!ml/oX^h ȋmI1xYf$7'nK:N[$MVKT2:(Сѣ::ȴItEėC4tS͖Җ=#֙=wd eCV)OdSr)%3J!:K% rfV@~lohҝPʫbTZuPYeyyx: +=}c3hr6O,"ڻI\& 6FEʏD)F+E+UcC?ǢGp7 kBvm`V +.[̏5q%WWQp(vu,HN5%&g[XSliGڹ$+{^ODAjvD=HtݘNJ!y99N#)<Ԃہ*@q!~'WyWhMiSptT* +$tOoo0?0XF#} G!a@kw5ItCdkdnJk'jW{|%/_")^,ia4>uQaanAz>`Ѽ uܹkYsI>+bfE:ȟkx[C$#QږXIOZOlmZgՠs7:2?.095jYZ,^1 Av2n3w>b?c6>cbk#9`_%`]XׁuXI +J]H0( w> !~ww} Zɰ"ڱU +6o7DЫr"h3P-HgQc)̻'-y]O^HAqpW+OT9}i[;X(v0C:߻-#r3tR(8^J?eC9!PTAaqUщi Cc,Q Gܚ$|Y@-T}ɪA,yp ԛ01㫠4Oi&sW%7k+[6k#3gʕ\pa@f!UYŘ)i2) +ȞS UB6(ŻdVC>(PP\DjJiFa[@|n:j,qq!ȝ>=W}ZkJRt~< NAwX}`0 ݇&C'`.Kb bHQ @7 +!u_[f bcy&[ʕxd> _хB TT"*ՍsCaJNM L$[ໟIiΟ]M_ddzeۖƞ#wʙ }*͐Bv(hWC>(_޿MiOzNA!`8c'vwx%p,2"@!! `=H8Pu\ $zx|Du*GG?}>DuP}P e<݇VBsȺn2|~@,{N?8~c4gYρml `E@DF`WZ7UAya5"IS3NٗN]L2LȍWM +Oi􌆙Ӳ8|3tL̿φY +xNGzǾ,]Y?z-[kv鋜R-rȭ<#_ǐjBA pZ$l(: pJB9(kP': jPP35P E/j&$U%ׇ΄jy0C't!' DB@Ď1G,+};7v|;v!~^zHl_!k+;=1ځXp~4pQb,5M$$Z&YɨI9uCNi2s3R0JfFΪȜ:-m’ƾ:n+z'1޹: w ڱv`]FE-34ƀ9v a FX29#d8hj6;B͝G8x&c'^8=lIu21G9Y}镧o9㗣 );`gY%aNiWTv]q,#c\9W9Bj†,kKz ;G IWmR9-1"*ÀS} 켇:R: S{ݞ'/iwKoՖZx${fqDL +a_!!y/x_f 7^ÍwbյtG-8V7qsuU% +5'ƆC@Kk0BuB a>%fZYA$!!yKzKAX,,zDZ@eϽ-sVOOou.| 3d}yB Ts@a@`qeHJ (uメ28iEÐw +k3AA=쉠"#X8t՗h +]S oKH+gT=ʬy,{8h~Cz })v`+e9`ؼ` f/`aЬ'`9= +,7-*g @^ұ=aΐ~S5Aڕٟ"(FbRN#/ft"8p Wk*Mzݥ04uy mt=3<7}i-~e+V[GGw] nqCnj8!rDž:E4Ba5C (9 -PA* n>~pAihI2Z00Q}@= E1g".P$5=኎Ь` Ex?dq؂?n1D'Vb'mqYl*Iɪb/ 9)t*5DWDČ_̦i\f^as ]J-r",˘Z[\+ 2)Ss +TSn}?lYS(~ȁCt4ߡ,¨-:-Sus Us76²7fFb4g9b5b6phz[0Eb^pU.qaP瀼퀬bpI|MX$Gkv ++%Dԡ_h%;{}dk u:jGHVALxpwV+>Uz |͌H7'5p%e~.>hXq<4ś`':/%,%筦_ ?M+KzQEfS`0F>IpNqW>>01@~Z_U=/% 9KePz5e+wMxid0_1*P"rZLyqгRf^'/Yr*-r~d>Kzj,xf*|n.䕵k[77ot + S9#oqlM\MP '$@I+2w@E'TvM{܃~(`_FS~<?akN2y|EIJ  yUBHUZrzA(5⺂FCU9Lns@jZ[y~N3YnNjXx&`n-=m`{FǟLf!HlȥhM[#VoXkL KŤtf6[Gs! G/4z~'J%'[l$c"7.^uj;5UK)BpXZ{PX~Pe_cj 7uDh/ꏡbi_,=GA8ƘH]kmgILc >vlP9!s[-sms7[B϶dGTzN5 +Ucuӷ-ĺ^{1`YEZp_ XU`e1fQOA,5`&:0`D[M`X(s:-]}BЎf_hZ/Ke)B|P uSm:]4?4<2~b) (,*{L)ZkS[?U?8k}:g^ցz@>t7"B )z)lEOP uW3<Je^p>P*}jTP;j`&IP1Jp+؛hO rdbGj"~&`F.&jq6><@2KrQ'N r)Jo1q l"8i4fQ- 0|_$$EduE QW% +kRkp(2z#H\o9L0B6(ABkrbUOj Pb,6.&/ +u@3)L͔H7+IӁ)c^Qk* --m3mh۠hmG+ƛI.,5ƣ'STL՟f鶠9Φ23kT +5 H21 +wkJ2f%ⱞ8 q4mQ#sC0a C\K6G"^} D[}1P  >X +iП?jV/ܗޗOOyKYfhLcfusG㺣FvTk;u[[\p'e5SKe_UMߨhZj۞;¼/11L/p +pǁUTƆ^C5`ƯA7-DBtmpzHjABV=OҞs\ЍeF|IdYPxm7L{Z=}XGƢ͞O-ş%__e+0UYڪ`Qq'癟]u/\u/gAY5sH~(z +΃(ն} +Yw JAY/8uràjz*j +(&ZBU29 ,j d#&TicDVyXwQ7N92*EM\yg'M;p0|;a_/Eq!  +kU9`P "C6BWrXeYb^0(@?#M|Dz<[=RdFaZ6y)(‚Z&oj-1aBoAmQ0CW;ܗ$C\j41 Gۆm0QT_$0wpuy~a^~^A^a>I귱0렣{I辡qոϻj{GږoKve"<~,?iNƯMUO-O5mt ޗ~r3:lW* X M +# g`^ FW mB{9V^?˓v+zkO2lӜrI/9itد&<V*B9HB Ar?y'} (r 7!p'꺶nvnuk~y3gy2|ߟ@%4o.ݗ9(w}(cU4iʿ*i+ī_5OOu '1ֽ0gi:ᕥᵥ,zbCvl`oJUv+.sGכuz<CB0@*"z? ՗gHQ6Iь47&9btDaAe[qfon#ؓړ_W\Oq:\v@w/:rNImB${b"<⻹sk>.B¦GOϤ/d#[A kBc@-o:b+gSR ҥ|s4 Y2WIh__ &چP${Rd?ɋ>RUYSu5h_5$N};oo / ^75`j|en ٠f-vptlC!ptsW/CQ?@ C(P1AmU>PBTl^P4?BC)MҡP-@,jDƝ/Dj#{⤿%q9M;witl`bs,K1Ǒff2 }l$K<*0EcLhp$C0L3#(v eyRjj/kbvisI!YK`T:Ȼb=8l(w'$DG70L~y.2bY8f]eicqnNO%&D| 5%>U.l4G>(;B+//~񳅻j"t}QfwCziqK3{QH>q^~yX+, +F\aֲ_n ᮑCNomRK(D([  +[ڞ 4h@, +Э 쮀fWJ"nHoR 4^u,6)7U2.g*@&]A'8D9O%p5poN1o +-Eb=#y_(>UBSJ{k q)Q{F[ / _N6S|,H3XZ(mv#s ++{]翣 ^ps\P4P< +%n(@&l*rJ@e*"e~(8^8B0'aP7Fs2"V$w܆Da'C:p\>LLc g ,baKlr9$\ٱٶP- /dwl m! w~]Ɩ^@k GȔϲeӬ)d)dEt` -?$=%tw W6%ݔoc3䭑 +$*@uD?# :oa2K6~ua]`S(KA :ϰɏL2SO#GXuz3M-k??ҙԃӛ˂b.|n⭵Vtm׭v[kZWϓL?ay3I~|8 ,VX#怅,Nn,ot&$7` X#Rll5rcJʣH%f,EEc$XMKtƢ]hFSW E t n5t.AoQJߥV=~KTzh| + d [ς<ȖA9 ?B AπP=D.M7g29Qh$WPeU{L]׊׋ 7 %,l +ooǒ?J+YV3EoʚU^8_khV=:L1.П A`B-!(uM[у[pvL=`K?X:6/؇>1pL@$al|PR8f:(h@~N@?N)d)LwhBh%{YBodTܗD\y,俵X֙u@gCO5ޅ@,a(BBl}Yl|i`2?NrsYX>a{ٴl'Ԏ砨5\/MydXP\b*ɑ i`T<^p"^ؘ lJ6 l&lvRQ{S4T:2ng2 ^4h6x*fSiTxfdʻ[9KѿSֻCڵMܞ,lI7&pX-%G7+6R1d+Yx=#y]g<ҟ%#&o":`8ުj$u +ќ#Q5n(E2ˢxĵ1*w9Fchmh7Eh\Uu#.x׼Ţ4f`Qܢ&^|Czhy~8g@2.Hσ/DO X!]P>m2;H)^'K{sDtT4yE{L] Ef1iò9,>{a#ĕO$G%YZTVLV湢c/U^^W5ii]88}c@ȺV@p$\'>0y,`0F6q|8-P:Wl>0Oq  xkxF|kZ&OgJ,hd$S4)9Jj6W}'jp$šŠg3A!KR "NP /aȗIbI4'$s#9okPҟ.GȢyLJs&EiGX Gs'}MH+_j]ۅ5[8ρ +B +6YEN.wn40LgPTi6 `yLSfݫ–W\3qч W9\n?C/φ.tAgH0XށVMϷ]ʠ|ٯ&<"ꎺ*Ŋ U1 CHS)ޑХ# XNuw=ϲ9}~2"MJFav1@ߺht{$ac !9Cd,1JlC$`?йCk٦i CIZ'*ndcMڔel,hiutcnG>ƺu5҃+JRJZZZZu{zҾ$쳒 6'[ nA"&:A.39FuFVc^;Q/ $} ǀi YY ^,KSi 9")n1}1~9cOM L6˴g/ِ1Apk< ~-A* QweYy}{EzvqӗO*T +ʀ*PHUXQL j fΣ`Y8=HxNsiE- +mln^= 0h`#D1B#> 僼칠'[cѳTicsO4)*$z`9N!" +Qb(<<'Dׇ$h?QuTU;FьRC1y^i{.^s$!]ά +K(ƗBEaq0pAbGsZcX`ldJMdȋ}e~ +MꚭIɝ;L@Kom ~Q26N&'c$dY-};M;]V-*YGG +L˖ v]n_;h`m&zt,{(͛a+0[-=-VdgxIӾ_O)}rl^^ ƿD-!vS׹D2O wga @zHO4 @4OB?S~6*k*]BJ,'sB](eopvh537[g s Y [GQ`6؂!`Қ7'\}vk)X|,>u!gh H(P)}S>27)P>>J:BOR E;O3O=QUGzHQBĚ0Ve(,^L+$ǺH|-D#SBhиz.f-\ +:(nx N6BWL$Ua)96eWUkZ;@@2cc$|OF+A}0ֿҳ0vn7m7ooVWWZQ6qG\چ7o@6:|R>)] H7ֆƪ5UyYp8^"WBcѿȚڪy[((හM>v]`W&6@/2s?Tp Y <99DLa4K¥HHvhgz`v8F?N1!.cqx va?ǰ&83 L"B 6:Ơ+kܔԛ;? +3KHr~<,{,p=Swײz-Z)n ! C=!!SBқ4A tEk2׻㮻u׮{Nf{_23dxf~vuPi=V<}Mp,>N`&X]U&,rٹ23L #|БtStbhO~Eᄋ8DTCt h^H۩¶}ƽQ_FT+Z[uЏy70×KOsJ.-ϫhGc {8U<3v /$&YEVuNI8|X>CX/k1;k6O}dj&CE OZ|xնhџYMd;Ѽkt3׮MX+^_)Z!J[.HZ'XDC%1XOMdF~,X~Q{'G෣[l6MP|clu*Mafpv !򇔽pP;}t L yVE2tx-<5_YGCc0F64g +AdoSI?Al0?e=f"<8>WQQ⼧gC/eodoEsrg%@Q(ˀ򰋪ܩU"jD3&@-P^i#@-@ +tm@ہ: $t?h =@.V m5s/# ~e}MII$O0 +,Xy#abט+( D,=,= s`X;']Љ?h#!G4yo'@/養:oײ/ޘ/w)ce03)4 +-śfSd`dQOnfv lрPi%2>ܒ._/- - -(-٤آݦoHh4{; +/9Nb(ejLh7m6lQlVTl½=.Ǎ6Ҿ: ,H#-(ۭ%nd9ްRXJWRB\,޾T@,[?A[/̶R)qIw!(u~+ o3 !0lxvgRJC!x GA֣_>*}((sq qKI+Ikii[YKt(ʝ*@U +Pո-_FznfiVmڣ@ǀ躀h#8zh@ @ +$Gv_21/!YgrRoSPXIA1&yI+ e"|r@78S~I)u'D#!D=@>y?Hc_k۰'fwdE~|_v6H=IO*I!/* [\WA p;J"5Te[YC0͚-mvOK{)d? zc/ktt[BV}M&UFy\7F'fe+Ec5dq QZ*|x&2{,c8S!`zE"߉%a1ĝh6*1p P;t3$i4͵M& 9! ve{lDLyaC`Ʊ +& !Prig Or? c ,y/aaoz&*x.*|!.|).z%.~-)~#)y+)HV0CNEYTjTTpkX__&D T-@Gh:tmv]7(NgT@@DM n.UdɓxB μNNJJ 3mLz UvaD\;s@KLg~}?5OngvE b[Vj=HB BГ|S轄{%ط "ZFGO]u><O~\wn<6O 3 J?HsHuC{)"CC']@shTNQ!`Hd0H Olk*YL n$Rs!پYlRH6:3/?Bu@4! ѺIVEYrtl4y;齾QR$8C1Qmseq fIR1s0@HNԴlU6|%,)RPg͋Ҙ֭XV.[uCnSgUoїR ֿ̇Ek.B*$0P%ik^b~'3Ƕo^\JR,d[^`[Q#` X0xs42@d#itqV \4bLglR,u9޶±_ + +nKn&N*C!VV>U=W.~,y"}*#B@ZFVE lukvDօtzz?և'?> 0Ќ(Ў8M n +A4~w9D7hgf&rȇAr?Lh~­_{7&|UrUp>Ҿa;a=ǎ#3f̬Y22C b8@7a\S{E$I-t4U3KUO&C pd @ Տ׸+nr{t %"y>!Y`!0N ΢L;B ,CJMf$OBc߬9آP7xy2}sFy$4#[(V'źsRSll%>CCwjm+Efiŗ|siݺ]A*BroZIE0E\‹ +'*`^s[ +\p . 'm yǢYƓ,3l +`9g[p_)Z_O(F!N,Xq7➠ꁰ汸,<ᥴᵴ鍬@\+K;Pt:( +~G zݧ!aD=ԣ@34@3B78Y:5 PPNq?Mx;qwU7bעK.G],8a?n;n=f9f>j%x3Fl倞ywq1Gѐ4h-Z4<T,tk_AQ*َ N 'dM9Odhܤ٬9pxxwygrF|D42G.mNm$[Hy"6C4M2 =-jfyIyyݺO!ټB#V*B",y%_\kpPs_ WNZ|j\ո˱+lrBe66!009P pŀ5M}A_rWz#6Ab彤ja#QcQq3IsI IWMMoo@@!y; +׉B`@^r@ۀJaDQq$jh|:U@9@1d@:$@m/x-O9ގUUYt!")~:v2z"r, ti#GzwoỸ h?-CRz'U@MͅhgC43`Db4P> u%}дS=]L2MZWPgn7j?V?nO 7J؆ n;-)hdiM7j6=;<3s ql:KN}9_l4I4ty[h`Vm?_1`9"̗x8Kގk^M-n noRk +ۅ9l4v,R<| /jv^)AAqA|+6nbսI5j +j  Ozqsq qKq+IkI䖷x6 mG@:9O3i7u;\/)_bu+2I! ƍ~HGkw;فt$( [wӽ3[_ӛ_$6>M0,V9_s}}e?+>Zy5Z]TɷQŗ_S.Q))(Y2lArir)rt}}uy9Mʘ">JLM"SF""0QO(3jbv%TvPG}I9^ɞ!Ib=I>@"`޸2Sh$?8^Nq[~k=+#+WNnWOms/ Ũ_Ѡo;p{jfPSBH.ްOi}PT\G9Ve""0Q4? PjY5OX'C"1zQ^P>Pv#&!$h$fiQG`P/aصgsN܆W׼7w'Agaaۊ}1CwCAC7Hz]pN2ȲeIZ~k7R@:@:3l/l:A 8 ,ؽ, 2YBb\X_>??D^R]R^**A-(D)H_#@ggyIP)RIRĬci" +$A$ ApD`t L*m b5WQ/y2’=݃y"h3ZSl'qz|P; L^U-a5{->%C~12{f*@3=Q&bا]gjwOorK".SKfvΆ b"O(yl%,X6]y^zccC MVSn]jbKL"1E!b>lxLH<2GQ?o{6hߣʮE^P˔K dy2lAYRYRR>l)bIbIb "B4!s1y>qh4"u8 ],.Vg$ i 8fk% %IFi_2^2fiCvD8@0#7cl+`YVUf'z;鷄-O8~@՝}7uף?FQ˾^((.K&_$_ 'ϑ` + NOrOrQ""3'#2FӆRl2^Io+X` +i;tQۈa-;;hn!+0J[H>&l*,BMSn-fb6հzW;髛-h>qo6ͫ#߼5ÍS"RG*? `kE:"pTsl,KyË@Wܤ)o&us_ Y3,;6iDX3aQD]b.bJOz@yH/j0 Ke9c|1㶾綡?Ly/~*sf 4A7D=@D>x#bb :.C ;9w5__M > ,P ){0({ HHB^Uc>UNDPޛ99=ߛ~88Iq8<I8!@`!8xf\z,>25t4M.^&՞u#vU'vdŭTkԲ"{ (%R/Q ϓ ΑϒΐrOrNOXC4Sh1`]0֭hJц<rgHvfK@( M ([Bk " + +W!0pӕ٭V:iq\OS}>KĎN58-@.vW@ z v0I.[ЏI2;Nm?5w͐g p|+B0x;fl`bfC@IPMƷm{YLkG}hџ#ew"nGTޢJ-/ +EtR\|\|\tTxTpw{s=LȲeCMƐCuA;m@~3cJ|#r)|@M{\hAMܭ uRzno.Í^e~!_Ȱlط ++^bۣ-WѰ,6KOR\Ux\ ,VZ=!]6^KVWdb'''T_<-[ثE({LME82¬yjx4M=>3pQ{m +N=:j}jylg6a41ưF`-`'bU̲slimir .Zt&`-x ~""<¾JޣaԾ`5!-o7|Y38g#)8̶w̶ xG=FTjU/;ؚG CL x=v0^ oc}ʄ%~?F`cvXcMWY>,?t]5aXj ~4q_u/&f5S{{c/[jUȚcwa oQnR*oP*%H$G  Eg +N +;k B3nJqP}z+&[6ƕF{QB"-Q`ZUy:jM+ezI[O7Ik֥HA)-vrrZ+']eulTh. /Ex')Av7FKf8!>*gQCPyD5g `*gNJ81 ! {onX d!PG "A@aQqq=RWlya{Thv@>ϓ黎my}3KDZH!L@G +@qk"3(,h% +/3X9_,nŠ]@9  ޼Ev>wh6{]VߛW]/οHmInN:8Ԏp+o7~׀:O~'•Nr%8u995cj[-ZbJaQFյ}3.lɑmH\p75e4=HS}sT?YGc5}^ -C^z  2` u gLH!f̂*aV46F}f/X\wJG{qDH 쀰 ruٚ,=avH976xSS '|'Vf\7<6ήvV9YrKL)>f{]][ +7-a¦iPjŚ C˷bTq;v$Tt}lYwc}*DhOpPhH.F֏+7|AX !}$L坘 x}-(`"Ɂ9v|/}] 4h-ul |ό,@>dE +|lχ+8W[仗L{VWP>nt!@`+3ћkXA]9>cmz MUHI:; ⿺wnqͷxʛo _s9W9I2[r]7{l,êvT"FJQzRN6UeHӥ,/?a6i9e(쮕vHٺs}j}iMh>Lj6) LF5SBX(}'y 8gٿS}P +;\iLRahx) t@4hH0#"L6)6cpH؆//v!xw-?ꏮ"s y]@D]g|+5{s ,li}S_^$u$8e*vɻyͷM7 8k+l$[v)V2[7ƪj\1ՎJkt)԰6z>XaO +|喼QVn~oNMS~{AY[ +iÚueuc1Tn S፮lrT|O _)ɬ#lE{>}=#(aSZ^RH/C?Z@F"DF?\geZ!%vvck VQq@@c~@yr<'sZAśm\gf3ߥߤJy"̎G-N㝼=q{[NM:Jr"K2ΪuG8lQem!-{6m[#h,/a6q9ؑzȓ~xBtԴ3~eŒe*6BPUZMD"7*a 03L +or(d5LQ<_]HKA({$7!oy0IH%^N~#e" f1؁Ȏ&Á9|!<~l_Ne/ 04 + 7 r -,Ba.C7A]2*eΙsŝy;u] Wc,%l"F2S牮uFUۣ*-ۏ#KuYX+R''pM/Q:YTW ^ ~[v~MyڣuA5]4B&gXivG+'F`ZS0 O R)L5?#~މt}ޗ&@14!H |lʆP-q-܈h N~7GW UO`0'>%?`cc? +.bΟ8)UQIoʍ!Ǔɓ ;;#"  p%@T*"@}@/[]o[:[>Oж_vgyM&OgE tfwbu2^F%7q7=xEpGa]TPqMX +. h"_!nzP;pw)_A RtA=>H1y=,n)/?m߾C wP;0Ԋ,b#뷸_9߱_.dv$Qb탵7^=sj!F3]5U1RMFGF96pGuEi;_- ;'sN!ӟA"HTQ +mEi +o.*{i%Az2M!jnگᖮ*vrA(]◅5 _]@GMq+q[|ux'AÀ")fxX}/s;~x;Ń50C,l`#5`g'v[Vk楗`=Il~x7^{;v=f-z)Bf> +r&R=(3GYNbqG&LN3ҭI'5ƕL`sfYNhԑcI$W! [ Ղ"Pʞ>jV t^ &cvj-Yw_#r m7~YX](X_)MWhH Hزwk9;>xÄ! q`CllŸk g'V[f?^0.>Mj.a|㝃[q_ԬFW/F +QʑhHL%6>@.aet?W2K'i9 +7̴G  R H$ip5ؓ]a)PN) +* .맪jMmUh +7rf8f ZDA\)QvAX.%WIt9{߸ok}*}+4bD0{Xlv>/t=#8 2kǸ6 `ctbIm 񘎑fd['!N#l#Ѽ_be P#HvI9 +Z➠`.XVFjMcWԌNig.e~Q pxU< royX6-BK O^; жg>vlmG~eD\<-1xalNJ˴~q~b"N;x?)͐nffXaNY~n4;"9$xh`\Lk\Zh.,S H$cR w9ȻOXE)LQ + *EXhzhHdhlh|Xbbߦ ! >i(\+FWyW`,7w[xh^w(9_QgN|sC<"* kӽ~ +02kn0k655/ttSr~gxvG2 +Iƹ bϾ +>pTx?ĻZcd9YrHM*ˑ#DE'9ud xd +[*;Q*tJ}P!Hc Ҙ5&pLӾM4̄4͇6/u1άʷaDJÚ; +h2qӈ9. (w +ʙdIPW/# X{j@uo P}93?8[#NMv-6?اט3yF9igf:X;Գ%G:eO@ٓP7w'i>|pξwox-D=ҡ?C*RFHgI$7q >iwț{K_TVR r +唉BV7A??Cp%e!m9c-zX:˝  JH_wد&bgruw:wBjkةYgvZkOAAX$(H +>Pȍe jjOQ~Rΐu E HsDX>Ed:]>oO!K:U'[+FqEB;!n7!3qd2#vV_~+Z1fGh~& hm P+YgAUvf=(<Dؚ N3^k~$0%0 +KBӊh/S!o$UVi -mlD4HXAZ GLL^bļW̭rS6?~A2H|}/O(fY-)WEUqUD)kc!Hlp0PCИ@3=崿v|g EZB[XhH͑_soIîu܈Lba2kq@ؼ&<[ڲ%1MWN{"4\Ӌ[/pgHZN"e݌~,Hyd6ы6iYKN;nn o`oZ,-~-(*p}~0rvJ@lvYƓ_!6;\˗8$ԐBK HwJr1q>%U,]PqΓ!8b2\O rPI62j nj'BV,p軼nɍNuLۖrU\Q.NJ_&ar%FĈ( jjBj肛pxF(? ⚗V9CGr=UC5Gkl|b7/\Ho$y])D9l {Q79+V(*ےeD]>h0v 5!x Z+`b׬I4ı,ql>#u0>\*r;vS *Y>'!q36nN[~B] ^Ef-WoJh4,5R4U&ɱ$,(^j a1fCㆴH%q{~4NS,,˼.+lg +rrz>UjMZ4(3 '.4ot;77t\-7}"@pX*㊎ +,3HyhfMie`O -2aZ晶EԹ{ChO:_h ر[ KMsOukʫ֋@ƞ $,6275QDoeiYR:"7,. !(6 +0^~7ۄf=/Y 8"~Ĉ(;Iꡤfs֖%Qq)}hab '|a Ax"Lx 4`]hx(?M[E8Sj(b(|qU-[:?40JNҹѝw_m:[[of|5cm ru:D\EI՝t'!!8vS +"Ψ>?})]T[-\:ֆ-AUK@@kuϣK{7Ǿ~9g]G.jTX;A~Eӈ\3$5^[}|w`0>.A\a@AgR[@sCSBϢcq8$NIMI(ɔ$]InO{*SsWg"r]/ 1w=/BC7?_gstx] JU#I.W#&G謽JE+v#`|8٨*ޞMbAJ&ieia02//brC.Jܮ8.ueE-!*) P5 #c[j@K/=˛׼g n%Σk_DDFLe:bJCTi0> P[@:-#fT㩽ᬹvʋh 3`|d=C,΁ QQ-|I|_Ȝ[&WE͟wE]zv٢ &A|O} }pa?ȑmsN-ڒT*32aJ14(l@IHR +݄uLBPBP}˷%tM Q_2Es{F 0:\7$y^7D$ϗs`` 0.ma$,;ܶ E9Mϝc'NwY(k vE30Is4  +C6#yU^vmZmp3+@rr𙊉A?&˽gE(i8J5c μ3Ұ)NBvB-@pɭq%&3Gdvj 5*fZod01 Ɵ9XXm_݉2W即| 0!٣)HOs9 fYf׹Mna;]Noq @n^d'fcVߜJg!-ۊ/oq4 swg)hib'MQ\ndH\fI-Q9\k5k:kjIflKw}3`0*7-Ϻu+sNyce>5d,6b}6!e 7M-jr + +gXأp[}Vrk[ +9'KE)-袤䝤;(I=!Cq bgN~80m8\$C b%iKjA)zp/5U-\E%J%Z(.6 gR,/lَӤP?F`4S-3Ëw``}l3SLFmߢdIW[%fd++r+<7X?=>l볝=7lP?v]=Y?? }}'_ + ǿOt['c1F?h]q\\!FchL]G?Gx_j TlM6ߍ/T< tg7pywY Gáx`iFVK2eM[y*Sy[Q +]Q_jtehyd{D=!-SU*kY~/B?/^ޜn_ o3wPf>stream +H nAEAM#ɊLOO?>cj.T=]`^;5L~PERҸMGLoӨ?0o% xTS1EW>/ g˿:'5k~zUOROԣ%z0:|I=O]g^TQGo:Ƽ^D3L=%Y^'7eirzbp:ܦ VՓARocJ |[Q&Q^VǓ{dJ, \2zTJP>Uu[uYN=Yn" 1/G3p:l3vIpyl6'kys9 1m<;Ƒg?K`]uXQ]/S 7:f`u<[)FV(RQ]'xA}.̥Q' fPPC !CPƩ >us +]p7pZ]V}a\ ܠ>3QRm;XuWv0J]hԗuMn mQiG(dK_2P=?^TpL}?`xZ}:`( xF}5`<*xT}1`L2xD}-``<F}(`pD\}#`NX}`Vx 0z 0zVR=\~L/xE=`WW`_5KS]XGf凵ԋK]}XOj}Ň5C]{XWnե X[]yX_ruՅ=KXS]wGveԋXK]uOzuE=XC]sW~%[]qe R`Bu?ALm: + Ww`umAjsuWRՑUg`XuԩRgQu-SxF] UUW` up 1pP)P; n@0:#:)$gkpܬ.p:*7 +]רp:e\-p0ת+ \ 7Cp:=\n+p7 +ܪNwp@.I:>'S +t):@quA%8'0:FQiu8IxJM`4uP'P&չT u+q}VJ`huTG]])/ԉ&P +u9ԭPG`uީ̤.uCD`>uWR.#:#L۪,}2.:{b[:xc:u;,N:rKl:ollF˩n:jv+l:gcl:dӫ3l 0a SC`Nu~sLouKE`.uި̤.;uiԹHF`u>QA]*OՁWg ++u#ՑFI`duUV'GԭU Au.exXL`P?@ +L~au0/VVSx1U0_qux0:]TS].̨O̧GfS7 /s?3{7iyԵB}`uTC]*oP +; ԙ^}#`xu|>0QT [](ߨoէU QmI}.`PulS R&[Tg v̀QC}4`4uR K]$;ՇFRnq5p@}<`uQ_D"PApX}BWW#A>Rh@O՗Bu~|%1J 48I}PPwi:;S]g +ܬNSgUw{tiԵpmB}]&uj\/p:4.RCO \ G.WG+ZKՁp\}j:u]ܠ>6p:.P_H \ Pwm>́QpW}wTuPܬ>VG@B:!R|Z}u>[0Qu; >GpPcR(0$u6I[ #T'X00.u0LC olVթ0߸|W,t}|vu=aJI `4Uwn\|bpvcIUs+uAJ7o9J`Az|XT0:kAD1j!u +óAW +C@Pok! ςVW(÷^!;bqu?3XTROa`j@ߪ7zW=իayuWzpճYW0zGkU=ջaquWz pYV3wB=Z+LV/%TTZ=aa?zGsiWOfhrXVO^ꪾRflvXTϡҗꢾVOglvXTO^wyꚾUhlvXRϡ 96G4z=,'QizF𹺢M! ^ ?Ikڨ|gzPrO~'GPjt~XMO^]a?Y{ڧU7S= b)>zO=^'6zAgQzdŬW/4ER ;9 SFwF7zCҧQ/zr𕺏ԣ_!Q;uc A QmtO#LM};gxDZy:gI~NK}>#M|`:GNu}B?q}t#7Nu}D_c8>bOB:>!B1H'[CR*zNAGR7zIVѧv 8e:B:>6} t%ǝu}NmE/8JEo; +뾎>p +ГNCZ~>q :ЃC{*ѳ~q{C{Г~rsC{>{~s:cC{c~t:z[C{5SsѷBR zʁdO~D_; J-%=F?q}s'[=Dt胟D7g:{œЭTq">~݇GcDt3}ov}o# ٿ>ey>>{DGw5B%@YZGO8]C_g }},t-#-~@E? ]KgXtgCR4zl4H,i^JF7CB]>K񦢻 ͓X7OGS.zl3x4{ٹKнn*^:^yp.t06Gen]LƢ}+FS$zrxli7)\tYj<pꪋm.4^Oɔl.<^!OKl0:@^-Xn4bFUyW?\k2LE?ՏE8%} =ht<^~Of/kFU2wo)=htɼZ)~gr[F͋Wzj6p^u՗TΦRT^M%l +A5o>¿ݔi8:WJ$eTt7G')YŢi>z~BПU,:ƣ'()Yi:z耒BПU..()Yi6z肒BПU0:FYN()Y%i2z脒BПU4:梷ـn()[%i.z脒bU4:ـn()]Ei*z 膒bU6fwY()]ei&z舒bU8:&Wف()]i z%茒bU:7Y()]iz-莒bU<:ق()]ţjz5萒bU>fX))_ţjz5萒V>&X))a jz=蒒V:样؃.))aj zE蔒VXN))a5jzM薒V:fw؄n))aU#jzU蘒V&WX))au+jz]蚒V :x5%?tF sJ +BX-莢 ,CZ؆))aՠCE SRêA_: Ճ.):tPIA]R z|}袒V:8E%?"tJaJ +BXM薢+D'-EWN*)aUcATRêB]# Յ)JtTIA ]Szu訒V:ޣ7׉*)as=zs誒V^W*)a{5zq謒V:ޢ֊*)aա-zo讒V^V+)a%zm谒V!:ޡ֋.+)azk貒V#^VN+)a5zi贒V#^VN+)aU zg趒V%:ޠw֌n+)auze踒V'^WV+)a>zc躒V):7֍+)a6za辒rU+n֎+)]2z`辒bU/U,)].z_bU1:nՏ.,)]&z]’bU3XR jF=KAW踺^tcI1Wڀn,)]uzXЍ%Šnt]AjoՍ;]@W}u%̒BПU;nWYRGy;K +AV:tgI!Ϫ]Xѓڂ,)Y 4zQkС%?~taF/j _Xg{ZN-)Um@7YSK@U+БuM֒"_ +tdDiW]Ycڄn-)U@W9VcK@U;Еu]ڒ?tfB/i:GYKZ-)QA!sK +@TkСumޒthAhG]Z'+Z.)QA K6[zD%GSЭ9zC ';GAP{KB=fG(J8LMcszBgjJk ZT7>SS\^Ф::ptRJ&сԘ:7ש\}ԽJ=Muu#5W5uoQgU8Fͩsz<'jO]ۙU>Q{\ά:O\Ͷ>pXyZUwhêӪ;Wof]8:ͪidӮ ~ 4MZ/Ӹ:?P~ 0 X/Ӹ:?Wo; éҼz|X=3>KQRp8YW½zWz|P=C>J7 K>J87 )R$QτCO?P?-R$~W#z Hxp AN=Wo5R$~wD=8{/xW=F}W za%z p1A=Qԃ>F<}zALj?-zKV/WzՇ{xY R}Wճz1շ_zQTMG#O +x[Rp)W)~S/P*~ևS%7>U8ׇS{Q+룩zs^=f +X9Kzdg?p +)U?SOٰ:='Q]uyUN>g~G}V1T]8ͪϫJ}VVΥiL'SUuquiu|t6>?O}6ۦ::=pJiTWV_VN>mImR}ZW]8M/UIuau]uyn>N.Y}ɇgSOܢ::rgnO]|V~U8C.>>LOݜ:::;0>usͩO+k=̨ݚ::wcܓ୩{OS7=N>LOޘ::90>z[ڃmkϩ/s곷=nޔ:::90>|SsMc{碑ͪcs oRSS s::8?hn='k+Oo[Ocϩùo;Sspb>{!>N= ~<P^R^SK?랉wԩԩԽ|҇ u!u5uo8'?þxM]zHzMN_X..= g~ʿy.KKs ԡgԡԹ/cuu1un8_< ^?աWԝԵlw㧺:6{x8N:3ok<< g^웞n^yC]yJN߽ܷݸ5{{iu u)ul8*|Sp*WՕ'ԑԭ\+}Ϊ3//[éW'TW^P7RsO8R:+t]|ͥuAW|51袥KjtcEKW5C:]n{s..tNA,\ ] t7Y/FW;r/uu _,э@7|1)6`o8v_.VcCw:]bU>( ХN@|+W>*-YjUJOF,UK^|GЧGsi#cc%/}>kիѷF,UK^|LGתOYּnUoLBITy1ݪL62VfZc:UB }!mDR蕯xt:5+<ڈXj+_Ru}nq2KբWѥ0h#beU|>;qЇF,UzLGw*}t-,Hؙj NNAE ;T-{1ݩ I3Kղ>ѕCߞ~BDKT+tT$XjCc|gB>6YT~63W!i,U +?k4xq]e S9[}mT*ht +BxnR蓡>>@WgW_>@WgW7tJC_htmTU(^/tC`tm˳TZ;t +D\tmp۳TVtJD_Xtm`TR'tDTtmPTUNt +ELtm@ TYJ76̑`6he*}ѝRUit +F@tm;TZ=(R뜇n `Z_]*}Ѕq~b']*}uqzr;G]*}mqxz[W]*}eqt7lޕCw|NBweZ^}ZnRW:]uizmOtj>98PK{*K_MNǠnJ-U*:09NAƁZ^VvbM RknZWyeM Tg[nZΨ&}3-҆ \Dtj>(]?ٿ$}Q:qtQOлR,4oAVs '])}{T/ޏn '])}{T3^. '])}{T7ގ '])}{T7ގ '])}{T;^ '])}{T?ލn '])}w[TG^. '])}w[TKތ '])}w[TKތ '])}w[TO^ '])}w[TSދn '])}w[TSދn '])}w[TW^. '])}w[T[ފ '])}w[T_^ '])}7;Tc^ '])}7;Tgމn '])}7;TkN+M>6S?'}5z%G%:'}5z%G%:'}5z%G%:'})#`SQϓ>|`z^o)ɨI>0?F7ؔdTh$^W|l_2*}Ko3Q>6/>}( +m~ҾkL|MKF6O}TVm="ꩿؔdTh$WER82ꩿؔdTh$WER82ꩿؔdTh$W%J64ꩿT/lפ %JQcf963]lpK;tS/iԘY Ll%RY.L_ {gLg&8zE@tVaANclQap3˱b#ƣSgUnF.3˱bc_2ƻЍ[5fc1[ GUAc wUm j,b <^EcvW- j,b O<]IcMv] j,b .!lEE7}mmق1.6JУU56\7b rl f`+2ROVPtSghF{-3˱b =X]c3 uiQm j,b .%\D7ӵf&mԂ1.6J܃V6]HvN rl f`+bUY@t}\jdF+-3˱bI>VieMtu1m j,b .'XC7ݽFlЂ1.6JSV6 <> rl f`+ႢOU[4t{\lbF,3˱bK>TqeMs j,b .)Pŕ C7̄j#6fAԘY Ll%\T+no &l̂1.6J3UW6 ,# hQcf963]lpQglQ. rl f`+ҏT^(t{Li7/_UD@tVeQ&Ro^F,3˱bJ?Rye 2߼tY5fc1[ ~FdNq- j,b .,H B7Ǡ5cAԘY Ll%\X;.oIDžkǂ1.6J#w6]NhQcf963]lpaGl1fu rl f`+Ttwc8-Z-D@tV…9VrZFK,3˱b ?R}gsM1dX5fc1[ 栻b\a j,b .,HAw7ĸÂ5aAԘY Ll%\X;n5j‚1.6J[.8r1mq'(x 30}K7AL' PŴib7r0}K7A3=a*,HS[,PS3K bZʂ4uX9%?L PŴib7r0}K7A`FlbZʂ4uX9%o0Y6ST1-eA:؍ޓ͌Pogzw(1 MVFeIfF3@=lULKY+v#Dz7%|4d6Jf*,HScٛ> PO2%3FRÊȡ]tQ/ %3FRÊȡ]tQ/؍i) anPDfz~AFɌQŴib7r$w[GsB=xA,'QŴib7r$w[G3B| A,'QŴib7r$w[G3B| I.sT1-eA:؍HݗќP/7rULKY+v#R%v4'G2GRÊq̍  +rQ/|,'QŴib7rqg"GB| I.sT1-eA:؍FܙѼP/7'rULKY+v#G&p43G 2GRÊA rQ/|+'QŴib7r ksFC| I.sT1-eA:؍BڝP/7't ULKY+v#Gp'h4CG /2HRÊQ/7't ULKY+v#7^PP/gz^9He*,HSS.?P?P/gz^9He*,HS.o<r'>TbZʂ4uX9ьQ/gz\9He*,HSә./fz9A*T1-eA:؍Hs9r'>TbZʂ4uX9-棞WRi) anG[Q/gz\9He*,HS[q3@= 2HRÊ-M8WRi) aŖd PO|+ RŴibKS2r'>TbZʂ4uX)z9A*T1-eA:Ҕs@Op A MVliJ9x^'r ULKY+4%

TbZʂ4uX)z9A*T1-eA:Ҕs@x A MVliJ9x^_I.sT1-eA:Ҕs@ꍿu\bZʂ4uX)z9&QŴibKS2r7Mri) aŖdPoMri) aŖdPoMri) aŖdPoMri) aŖdPoMri) aŖdPoMri) aŖdPo 2GRÊ-M89b7e*,HS[qs@'lULKY+4%

/i) aŖdWTibKS2r63MI1UA:Ҕs@^#ؔSÊ-M8a1έ+>6%TibKS2rF8M̓OMY5EA:Ҕs@FSSVMQ+4%

ԔUSÊ-M8Y0Ϯ3>5eibKS2r^ LkEa5EA:Ҕs@.ڼ3Q\-M8˙a/ѯ;>LbKS2tfXlDq9OF 4%LPOøH6HسdŖd pؖ%x{LҔs0A=*vy'Ğ'S/4%LPOi]^o+4%LPOgeM^8HS[q&sdX&OyI-aŖd ,+V[^kR*4uX'z;O&񖗖ܤ MVlI5ΔE{<%7"HS[zq .sedy%InaŖd\ l)Zk^I*4uX'z;_fNv쨊 MVlI5Θm;<UA:ғkpA5.oÊ-=ɸy3nN/\ۆw aŖd\ 6fc7oÊ-=ɸ3jho +^3.HS[zq .[>_uƏd0.HS[zq .[b_uMfoqA:ғkpA!3vNJSibKO2x6;ibKO2xd ibKO2xk+qA:ғkA=ry~NORь aŖd\ :\%wzE+$|P G/w>zE+$|PV{%S"HS[Zq >[F_x MVliI1^o~Q6+4uX8:# +PL`0NA::7wozewڐGanHOfzeuؘ7anHOfzeuؘ7anHOfz?tל7an@Nz=Fs֠7an@Nfz;Esՠ7an@Nfz9qӨ'an@Nfz7pҬ'an@Nfz7pҬ'an@.z5AaO^Êq] ]~Kk &AY/^Êq] ]~Kg &EQ/^Êq] ]~Kc 'II/^Êq] ]~K_ 'MA/^Êq] ]~K_'M9^Êq] ]~K[L Q1^Êam\~KW U)^Êam\̑ح云_zò5;^ٍQ. +%?7xƵw@tmk<"<#6Ǿ+bkl%\v6.P s-]13]`+Htz#o𐽋m[ %w yl,[ %w yl,[ %wxl_-튁[ %wx-튁[ %wxX.슁[ $v}x'.슁[ $v}ԻxGZ/늁[ $v}ԫxg/늁[ $v}Ţ+ԋx[0늁[ #um+ԋx[0ꊁ[ #um+{x0ꊁ[ #um};kx]1銁[ #um};[x1銁[ #um};KxN/|1ӵ E`JFww+Kmp-BW2CX`oVµlW_bqkmp-BW4D%V抁[ !sM}eKTwbq[mp2'W6D5-䊁[ !sMu[TobqKmp2TW8E1V㊁[ r=u[Tg^cq+mp "'SW:E55⊁[ r=u[T[cqmp "'SW:Eu=[ r=uţkTOcqmp|h[]Z[13]`+Ѷ%F5A"ƭb fVmiKdn@tmGіX}E_dI[n@tmGіX}Arorn+bkl%8ڎO=~ڊ[ -y_=0mb fVymhKE7؊[ GͶ-}G.K*k@tmfЖT~EO%yƭb fVym(K&}Do䳚8Z13]`+ٞ&}ߊҌ[j@tmf{^~>E/槪,VZ13]`+ٞ&E//|(2n1ӵ MqYnR,~jB+bkl%6 ]@G& ֔}V L6J86meJajҏ f@tmcӆ{\~;+_7TˬmphpOotBlm'x䊪7a1ӵ  iWR=o|[Q߿Ɋ[ +Fwre ,#c@tm#{ؕ>TײW\$8eV‘Y=Je[r߮7/d`+Ȭv2Uh9;WX73]`+Ȭv2Uil;% L6J80jgUOt*N6^Ƿs{W?3]`+U?m+{̱^|Q1ӵ YUݦm,Ρ7GL6J8.iGU MU|"ni+ Q;3]`+ḤU:Un}ǹvcǞx`ځ[ %*}Eשz{mn6͎۞SqBd[jɏIwmOC)(8MIDY!i4tl;kw3t} + ߽#%t}j%=D?"aǡ Kz~B}C3랇nT3w, C=ݨY2HC=ݨY2HC=ݨ/Y*HC=]i[/YC>]ikOYHC=i{oY +HC=iY}.|"LC7Ow#]DtfIwѯFR3M]=|̒j'Y-s|(P["]Pt^"]Tt&7]"]Tt&W"]TtF@]w"Xtfg"XtFW"\tfG"\tf\7"\t\"]\t7A\"]`t7A\K!`tWk!]dtQ̒.LtF1K~2ѭOFwl|, +iD>]nuT߲+!]htQ|ʒ._Lt&H!K~BѵFlv%g,*iE>nɝ^!ptwRy’߆TtFJK~RѽOGmj-u+qHE>o]{!ttF6Su_XtGLJ~bŏGm^5Eg+>yE?pqܬ%.~>p)9YIK!|tfSpVD.tSp/D0t4tR%=A?RCDO@wnHITC>]r %>QIOяD2tt>%m@3-{{Q'S3>r7u4%mB3-]KIE4t^\֩RDA׬u %E?S=띅9FIяE4tϺ}to:_lt)螵p ,B?cEkߕV|+sYnZ ;sMk_T't9#$F BWgEσj}{zIbWtImw&q]tI]&w䒄8$e뻆en$9ef#!dև6n" y +m|t }a)棒!>O ]>g iA}i}Ơ3O!H~^[?ч i1z9pD٩H(^$ZX #S9_SaW8o2_wu +3ouT?9oӫgly~s)'W\Q|[έ0~+PZ=aQgpIn8zWFp^~G5կ΍:⯺k_[u I?uU?;7Nj~wn5TO!\U|RP=\K8zxSpYIp:l.糺d]u/uԛŻ: S'u V?=_A'R~{N+n1\Y|UF=Wܨc.8zQpmMp +Tq绺 V]õկwu C'uW??MW9\]QG\=R|VpusO]plFYpGphDEpO]p`@EuUgV=O|UA]]UI*8z.WqTu!7u8ê&8: pY: +~^%෺%෺$:$௺#௺#:"M]OqPO].g:0xW3u@!]Oyzx.u -B6Q u @V]ԅz}xn[u RD:>s QOOqY/Չzxxxn]=;XX{ṺV'`x%ja:^ a:`z>.WBXXf:fxnr`:^a:`z4X HXN afEl΄x`:&3a`z*XiNX +a:V^gtꀀ`Ka z XTX.xVa֫U|nꈀ;a`fca:"zX9Z֪ bƨ;nԃjuBRuGzXNy^. #b:FK~ԟ`n .3bc'1ꎘNg:$櫛a:'.f +.>|Ʃ[b: ϞqXbg&a:)ΉEl@\F}U2u7l +.>ub:6QgP9ET]ۨ>rb:6R?Z}ltLXq*a;u[Cէ&X qT5ۨb6U?L}l.5zV(A:-Vacu`cvXՉP2[b: W7W1b vPG'W0۪b vQg'V/[ c:!Qw'U.c!R'T-;#c:"vS'S,{+c"vT'R+;c"vU'Q*{Kc:#U'P)Sc#vVGW(;cc:$VGV'{kc$utpPi7FK"QgT%{c:%uwp0I:9Ʃ[RR#::c"SQ":Fk"TP!;sT1T?Gn B>x3@EGTPwFZ7 B]*~p~)I}WG"Zo +?;a, CA4UҖ5 h>!\4I?)BǨtWDJ1Gz-B+%ߑTG#^R + Iz=RD,JT:\$KRݨ(:Lš:(֖._T :c,ep0:NE:.ѥ7D}*!a.=@?UGXt_9t~jT8 )u}PtFvq`@AptbG\#H:kU8:#SpP/tG7vā N! unV ȎP%5:U#NT smDrDEБ/];;H%QgtWINRYi4]ڣV#TwC׬茕N;Hck +d[;P GRwtY؎8T]V&3Nz*5Cת訕SKЍj*ls;V'Set[VKT] W2:C|:Aw ʕ.sO(>Attr=i:w壛;`#gT4C7/1"ui):|ι0Au]VMD_U7I'>ˑ~_ tx8l}uE D{6}H_0tzO"+SnzF_\tw7"3}}K/Ht}9rtNoF(:m7NoF,m1 /F0:m-+7NE4n)KWE8:78F,~, ao }iU[QtoqeЃ/CZz RT]{nז^B?@g&ۃFD5/}q{+Qtos3E\FT]n7vKߠʠS.}wKQtW8hyE_^ +>T7t\ٷ**kb.ѷ>GBxU?ח>C Bx U/}~*9~B }~.&~C7 }~*N&8~C7 }~n*8@W ~**8>@w ~2!]I$:o+St /.osҏO-HüK?@ ~*N6l.݃?5,:\KtǠ8sβEH߂ +ʾG7!@Fy }:}nBTg'l*pz]78:.R" Aߡ %_M/-:NO2 ~n4v|1zPt!܃݆_:+ᆭKg:i 7$Z:Dj '#V:Fj7"Rz.D : nD]WtQ3EFXa g#t#ڊ._еFqRJZsHOљh%:{B˼;Jtj6#֖y.E ѫ:0nXZy-DGvd8be{V ㈅eG[6tꈮ6#xE%:8XUe6Bn9bMyw t/Z]MqĚ ^ ]ڢӍ%%E7h:vE ;tj7#֓wA5]o W,'$nF[Х5:@XMEt ݌CWot\{@w#b)y=t5Z\ rJ򮡛n䊅C7h:r @GȻxt⚀8+Vv ]F5q$W".Gхk:HXCtݎtȡ\3:F1#b ygut<[s-rz4]c匼> FǭQ#".@5 +s(g]@~4匰(ݏ4tѡܑBi(:lC'Qy+]f@tԡbi$:kMDWA+ݐ&Htܑ֡ i :j E1y+ +ݐPtءܑi:iE!+ ]\t۱ih F!+ݑf{htޡigF!+ݑFspt2_DA5x(L9"%i:fG'%e.HtInY Бrl+]ƠSt屜2W +E)蒵y(̕"-i:d-A)SέHtKX[ХrLk+F3t2Q +Eפ 芵{(̓b5ib-B-$oPtMXйr,K+ݓڣ2t2I +F脵 |(L=b=;`C'1sdXtOjX Gr;+zBt3CʊE|}(L?bE3^-E9#+]:Rt3BE1:^E=+ݔڢ^t4bM-:]-FA! +ݔjt42BM):\-G?H.;FrDAtKvՀ YFjeU}TS}:M&]˪ly{uL)ZUUqG+]&T˦j᥿..eS}UP}=Uq?uM7-v꓅!,pZw SXd-cc-鲬cXd%l{SȰ;]YSwR_+bawĻ>,n>VQ]"nWeK}YH}/u{e_szTԗ}Է +?S/֓,n>UY]ŞzٿeK}YF} u{eRo0ޓ-eq/azQo{~NcM=?;>/S:5W0eq oqiO;cKw)Qo+#?XSzGջqθH@Ի^d\>5W(|NdKs|Q=' +#YRzϫbqBCu$[]V/)H\9W(|Bɒz_G@=8[})u(;UeԗϩKYR[0RoB>>V'|Rʎz?zZq:XvԫQ=7`qԹGH q 9X}u.;U?fzr6K`Vԣ~e%'ԧ _T'B6Ä/Po!sq;a—l7"[X=mΥuW YPO:^6 ꣄̫Օr& u>Exu>IxJиzP8^)ǩOR4WGiꋄ' Սr iuD=tuGPg4W'Y{uF=pu>GQ4W'Ik!uJ9puES4^W'1SAuN5lu>ET4^V)KQuP5hu>DV'5V;quT1duCWG5NV3uV1`uBXQ5V#%uZ-\u5u\)\u5u\-XuEu^)Xu Uu`)Tueubs%Tuuuds%Puuud)Lu ԙͩ3eR.Q6^TI>>HژzH8R&2ulc!DutۃԵYO.T6TgI;MwMRuxS0uꣃHޔzG8K]$׫o2u|S(u\>9 gArT7NRꋃV]zF8H#buSu\7gs5ruCu\68BzF8E" Q8QȅcS-g3%ru3 u\>58HzF8B"W/ R9NPwECIgr8uCWW%3Yg\! NTw9ju\28S]zF rPuSUȾXuCUȺ`uC!UȶhuCTDzpuC!TǮxuS!SǪL;BnUyԝNwH{KR<wQ:uxo nuL=$XSHzHٱ,:1p:ԇ7S';.WGǎvhKXQPzIV]ꫂ[ÝS/ cA}TpSus%Juo, +nwP=%\yM}Ա1>)Ap5V<Qư'[%ИU^zM@sPg<^Օ1&x u9a[cQ<Չ1%xu=aUcSR<y1$x)uAaO]CCS'=^m1#x9u IaG]#3TgVa1"xIuMaA#UQ1>"xUu;UaXϫo^W]zVUWV9Յ1uL<> xuu{eaHϩ^_]z[PwSwPwWW3P^U7wQRہQ׾PӁwR~zbxT/K]%!u8<>x7ug1L=4|Q Q+^xD}5/U VꣁwUzS'؍I5nI^$<@~ +W7窿@_?1gQbl}9vPM{jo'{+P`y:ᛍ~*FSXS-޿\h$nFԭj~k~g̨:jɗ~b1OKԥ?y'Κ CP_'թ0NԝKa\3PT¸:1QW <΄qub<xY}xD] x_::Չ:u}}u#=u![ DW';@7ԅ0N}﩯a\oW V:1R<΃qubxL}+xK]xU\:Չ 6W'+0o`\/>qubn Չ +3,VK*ϩo/`Z]/>iuan~ ՅK$Vo /`Z]{#iuax:Յ9[VOg ?c`Z]['niuaP{ugL zZ`'źzZՅW,hV=,O}ޕiua7U +쨾\7Uʴ{W6U[GeZ]՛՛2.IIVv?#v;L zO`zOՅL='p%zNՅK&p1zLՅI%p=zKՅH=%p'EzJՅG$p3QzHՅE#p?]zGՅD=#pKizEՅC"pSqzDՅA!p_}zCՅ@=!pk_ ¶W]}WȴVz>[¶Vv[cZ]퀃octL Wp^iua۪S]ջ1.lWn÷z6Յ^ 8T}Tƴ-գǪߎ͘Vz2dP=S/>۩cZ]n;z/Յm .k1.l+XV걘Vz+ꃸz*Յ^ +gMH=Q,nau`gS}wQİ:=+>{WbX^S-#1lDoOVz Wr}B []CzՁ^!\[V\.au` d.au`몗h^au`wpޅau`gt.au`KG|.au` '.au`^au`ރau`x.au`Kx.au` x.au`먗x^au`wxށau`gPE30l CzՁ-`P}bPO:^VV`\}hk3U>%c۪_au`RR  OpgXX~xg7S?<*\V֨_ QF +op~sՁ]~qT}W8.W?8@Wߛau``)X TfX؅XH}/T?5S4Z|VvS̰:kԯ 8_~eՁ]~ce +3fXظVWi2l٭ l6=';UGx:/o.ꁍ\D\2ؠ:-O:-ꁍ\Ll2ؔ+/:+ͨ\Sz2؄)u/:)ꁭW_ʰz`=~s2ZuM{_ R>}:%ꁭSQ_.ɰz`n~W;2uE[5 B~!W?.Ȱz`Gn~菪11u=P?V숺ۨ#v _]ԏ~u9۫~:SWxOKaP'cX=bﭾVl%بŰz`ԵԱVlꋰAa^WoUxYa^Uw2İz`+1?كCA_{Yx endstream endobj 36 0 obj [/Indexed 35 0 R 1 56 0 R] endobj 55 0 obj <>/Filter/FlateDecode/Height 2250/Intent/RelativeColorimetric/Length 46548/Name/X/Subtype/Image/Type/XObject/Width 2250>>stream +H֭:}In :mgO&ǑZ缼N*c^}`ij17JKu|R:툟eӫ^>eol-2_CY[. J5z\~4C +|G/t4)+esۢg mc|A*iѳ":."ȥNm:}-.f u4]%20Ֆr_ PoWj[gr_y[ǗJ]TRKaxPeZt?!G53b4grt(.lߴOüF5oڗZcE4NC F-}%:8ԶG2jE'tԢ/[!EG n, ]\6[3<4[tru Oyh ̊y + 뭘'}9j֩N|Y-R j |Z=K /C"|XO[trG> -<9eLѱwynMitآC[RlS*% ^3c0fv{>J 3e0fL0aӿ7S5}Ou/MMcڹoQsk-}!G82;S6S8~N(Ѥ L[:',CpeXw >Nmp\7 (@Vylk0w?@N|66@B3n/%}}uI)ӌ[-}_p~I66ޚqKҧ{}mf<mz\ m#թI:^k.xnN_؆~|L_ȩS|]3%KC7`J3iÚpul(-};T6+f Gtsb9mCIO~_Ϋ aK_ +8IS~5}$ ,]OlǬCW휾 N6[D5}lcI\~MwTm=57 poŎoerXgܥ2=1k12 9]~[8v :6=1͖؝eel1?[`v Öx=;czv_pŎí]\Ck:pK 1c|YKtf[k8c:;N tklhtچtE3 ֧ʘ5sk5k_-M:6lP4t&N{# NmitCStںt1Υ5f6] tOK:'ѭ$WG[?%ck!2[ |ڥ5totFbg:wձS5_E6][: %k:kG+G)S=t[1tp],M:/ktl1]})]Z`O[ ,I`'N,:[2 +cҽx +fixvM8R}:eLW8ڳKE-T `*@s +d!o{tLI'[g:@Ԙו)Q m%~K'8ceI8ڧ{i'pkN4k:GJ0 ͳM g: 6|Dҹi}nK8KeJ8KW +-I䖒(K:>*k:[XJ:WPtwQt4od)hڧ?}MGx;KI ڧ_ݖ!𦖒p{eJx_O7 nKxkSIg )Am]:dmt J:f=l9ny\Ƙ.p;.p!&5Vʒp-p#}MGDn5tөkkӉ.Yӡ.mLW+\ڤC\VӉn0t+qbk.7H7ZdJG ڥ\FL' )>"pK&?حWF, +$@  T==S_]\.#gϪvtʀ'6t}zcSk5A`ʜ.![\1i~G;Ttէtݩ-.撎"/SOw ɜ#No6;q^y1H`x-*?zM7\N|୤3 씎Ǿt(a9(OMV:t0t.{NWit0pN&0rI t5ԖM.%N`ǞnZMk:Ht +l\X9]U`SKIKO7`aN+)+s:7y6P..,CK`5,ӝXQ3eK k5Z`=tb֏kӁ)[`-]M+8t[6VV{,itteM LzMgXҔ +1^`9s:)R QZ&s!cٜ4LYiF S !f +4ST{`3dk: 20C e2dnaHtvgJ?Cv )C0dc {2wNw`Nóص9qxn cL2de@!8SB %2a,ÔC`) lΐX)3dd e2!C`i lƐX)1d`& u2C`- ΐX)+3dd u2"C`m ƐX)+yM_7S0e`S)+0db _!)}Z m2c)=}ǔ2 ,xI? + ^/2) <<1ScDC2a_%}O2p9}2p/C`ow]1є\ǔ28Kj~ /2pC`4k( /zM?؋ +oL!0^vaN*j |ΐU3e3GsIS>Q>~0' +Ǧq FUZ<Tw2dw*? 蜾LLՔK6显Jn`OjO%ҏFr0dvƔJK$75<`o{f09}ܡ!ҷ]F0/;y{OҊ!cS@Vi# D]7C!I 蜾@J@̔?vI?H`;COKJKxI)sfnd( +*=d&w$?بU*ݩ +pQ:@Az:t`XddFhvu&(.{t2`w"" pQ1G PA2 Pݪܫ P٬Nݩ PՠU=hY=jzܮA=ljVu^=mJ&u؝zUuXguǘ#`W pA=s:V^=uFuڝzELՃ(%uǚԣ(hS +p^={bfuN=}B:MM=~2|V PĮ@cPO E$HmP ;gu:Q=]"ҨD[:Bܫ'Q ԳxYE0^vu|zz/,xɨ xAذG]z&O[ԱѫA!ɩաXՃ xʮ Q='ɽz6 ٝz:rY=z<ZaX4Iv ~eW L|s>" sRgs +pEk7L?E~ի=2G!1+Z~eu]Ilq#;[uF}rO okSGĮw7E8W*+ˮ> pr)ؓU(Wð`ݰ$y*|hܮ]tP٬S_:]ǻws2E,p(x?ms/FLnR̢JѰC">m+ep%W\VGðfyWhXCݱOhZkSHKήՇ4i^wYd/Ond~4oeHyzzLXfDYMڎ*?M +2<5&kt` MH p_>tG6@vrd-S۴ [ͻϼ߬đ7E3/8ؖDm 1X&/ +#oUCq1FM)\R83FX%|XQ0.T^:ݮ.U3MP:o7%umTä.U٩[t^ݢO!ūY5@c`]Rwnb:v0kP!0oQêpثI]S:v~GHkU#`^R7㮮 P6s;-…u[=B5^Lؕ90'KV#Nyue -o_R;nd Q6 +߀Eݤ;M]mPI]òWw7 Q]ԉWȲM\Ԣ &ǬPB^cRwQݥ]˳S'7QyQݦG^i=}= ^hu# x0|Z6ۃ՗ M7uW4t]TW˴/}&u6ug-1^5)+seЖ-3$qA^}ې}z sf[vJ6oâ eІe3nU7B3vupup>o{#ԍz lkuICM}:vؕ:oY;WS`MiTg-|>-%V]4ܾ +[Kފe`K{ͮ.yE͈V0$u٩Q.}G8?Fۣui8L8[G8Y}qmJijSWG8^}۱{Ue:bڗO¦M}۱{UĕmA&u9S#*Gu=qU)oY-8 qnoҨY:DnȮnVyaWWNU],.ᴂrAx=&uYЫۄb=aPw +7guaqW:zuaۄW)|L޸,!]#&upJ= +gcM_lrK  h 0@ Wv3΋R bKY^vz\=^ ;%4ӵ2yrD*=`)nK z–Ut_Nd]j-vzȖq}FOYDAY2]i1jl鬅Vz*&:)˥эsߕo=hKJcIY* ]h5Y_FO LetTH9>;ϭѳA53?YAU ^-:itbgZ.׻,:S?srp;=nAGeiLttd*A|=n?/̇MقK]J/S'\ֈBO]y#zmЯVhtVLWY~F̝˽VޮףFMeOD\~kMy P}_ +=zӬѣ~/Ճ.izbjߣ;`nОVؚWrwj.$,C=s,uUinu'd2};bA3ԫĩ.aNS+itZ&%Vtwn?ms9s×r߆,":4}c^c/oX+=7;t:-w+ѩNp5DaXS 7 +t\&NJFͷ^  +zϴA^qglt%-tl8a>g|g]Nent}5U:Ly?Sq^`/η7*jt{5ѱ~~G[Jh% JNu&:/5QWNh1O+&4ͱW^9:0S҅N6=?TΙǍ~a/p^CGy>|ĜL/5gJ'fA7WL'7ism1O\N=m4^cѽUuK ={|~LЍ,:L3<؛zgl9>3KtdѭUs~l?#(~񴏍¼[f݀1\Ƕ4wgoۻxyw:3S +:!Oأkt twHry/b{;]Y]CeF?۲ݟ2Wth&J7J+F19۳VΕLtj$ +ϔS#^wth&d몌od7G;O6_3Ntlt[=VΫnNH4:5Q*ktzgXgq;zzJ`c3]ٿؖ~{2o[{et)]DtU7~^vߏ~y~HйN7UZ33 ^VBg +nt~f^VV:7PLTMtp6[*D4z[lx[F+UNFL5:9DWT] וJGgc膪 :A3JVʛLDוF~ʫtf&¿?:<WFghf*u%,l\n>:B3A+aGóQt9343W‚F?Otf& K1٘ 4:D3腥lӳ1u 4:D3 KDg#Z^f)T: dlfAifB% @A1 :I3%o#qtӠ43!X: c˘F43!^Y:CFw1FGifBu:CDW1FgifBXm < Y镕@C!Ltitf&$蕕Bh#&aWVN05$4LH++xLN̄Rttf&$蕕Bh`*AifB^Y9t:G`*AifBfze%A+tf&++Nir %@LHWV _2AjfB*t*ݿdN̄TzeQ'eSDLHWV0ۗM#53!^Yy,tF {T:R3R镕G4Aw/JGjfB*Y0˧ҙJD:1:ݼ|* d4B.JjfB*2itFttf&++Ji[eЩJTѭ(TLHWV.VΥtf&++FigktR +:V3R镕̍Utf&++εэ)\Lȝ^YLtv[RAkfB^Yltv[RAkfB^YLtvB-53!Att۲?د[H(@ h@ }Wu&II&Iӫzo[>Y+zS=Jӵj>YM(ZzZIUTѭk} +ӣ1zr-2'@=cK+Bo+)# }JѫZ2'D a;+=,*RKϪteEו`DϪteEו`w*5AB:H7VWR6Xquj*Fo,) } +6(Vƒd9lh#eE+K} ]V-L*[O#tW!x$]UVz_a +ag>WkuNgD,)#} +7YR&f\mtT1Β2t#ZR&VTʺ)ZRXE0+~@vzlIY6zeLIE-)gֽTtKܒ2Pӧ*e[ +疔>UAкN)[RFT1C>ZXzoISNR'^RN +'׷tP!&^_RZ@Tѻf:>P1 &^_R@Ŵһv=]Ml5T)^7;KJTK&zyݪ n>OQ@7F )Q+}u# + >Nqu.&N@R:8V&Lx~KLF#:II:sVz|ݢ{ѹ#>MLDG )A}B.dsy#>My3ӵ藚@Rr*0j':2HJ@? ݁a +nеOCE )5;}tNEb$]މN@שR#L%Ut@Iv*UV:Hz+QӝՉnARRf(| +tDo*:I)雤y+6:$%O~Y D$%dO4tDGw*:I鋤'݁ё蝁AR2z 鷍A_iFJ )' YC/Lt"PAHJDE#ND|1 9ҋNAЅ/Fҳ>Gz-&:3116:D'!) 3}fcпџ%=c?:O%5 D91SyZIHJB$CV?d$V$UGǠOMt7tRmQҋnA$I>Kz)3 ݆.tNEGOLtzIäg3]>i߉Ӥv:};':II::}hkE )M }d;ЇV: [@.fo$%_<),c>Qe3V: $%獮@WUL )q3}t>7tSVt RЇJ牎@sгSjO6:ЋNARU35= t JtmC>WtN''kE )'`W BG'Bҵ>Yt0AIKw )#N߬Nt} +F:IY]Ew:t>[tzgsu/F+}b! ];}BGEנy+دCdDZ; + .0000@@ x0 x  <huTj:ꪮw.mo`-} )uxIٖ 6T%0紣K@׷F2XC3{R^$*؆fV)x/:*0' d:l==b<߇}5#bt|dC_u}y1=>A܎f㔑No@]C_3{zH/D} m `f$zdutz{k-,O9dGƚof!T;zTyy5} fDCϙ5]>lK mK70ZzDyy[(+:ű'MHwY =i^^-]BiQu6Vt}3eGϚ]=gE7`z4twq}mfNK5]ܚƊofiSߥ75)tz3 MQCW;efRk6t~Y-̂J tti[:]Tѕe%UYх%:.ofQt|QcE72=rr:LÛYh =rzjN/*,99JYE5tx3 S: vtzIcEw72=ujiMw735=uj6tqQ+:Lg73 =vbtpQDg73 H.jGWLĚ;1.++:EtoI+:nf2=xZ2[RGg4Ttu3ӱ'O [Ҏ.hMG73!5=yZ[PEGf&GOJK Jtt3R)tnA~/.LLKϞ\OM7735{J][NE'LΚ>%-][ΊN.gfgGOLǖtr3SBǖjƊNnf2=~B[ \NK73y =5-[L+:rO_v{-,#ӭŴtp5-]LB>o_zO?!tk1-fŗ~~9'^HODBVҟ{ 5=:Z-frϘ3DzzelR6tn1k:Y`wsK@#Zʖέe{ŕNeOA Z@ֲ{E5;ݵORTM ZoYT/ocޝ}zzUti!k:?͊hc<Bu9[XѽB:|<\[Hl!TQӥuRZ:YD:;BD]ZZXѹ<*&S(CHtj)-,Cw-G+$S(bGҩTtnxΥ2-AwK+f|L=+cMDV1ҥtmhҭCf +5ҝEth%=],)SfMϡ-YĊ$ѵ͢~LQ2#F:-$ӱ͢9LӽYBK!ӝf.񐙦[Z@E"BY0e2tOZBOO,3 бb^2ӑ>k5=vtf :cn=d)ӧ- ӣ(,+f.ni Xѣ(!љ:jY(%2t[@#өby[%sooCϢ-]Y@#XѭB9-3}U#,÷lNKfj3ϯQAMWoK7SrZ!33ϯQ@7Qѩ"I_2SKz~;zt*:Nm xL緦Q@#2,;Ç.a1n^K'V1ХB9i:_Gݖ.bC6 ¼d.W(`MGn fCf1n\EVӥB9R/[_*], yO>j1>qp-W@6zL7@Ѝc}EthPKf^@Cd|kql;mʉ{0 ^G'+"ӝbr/#}6Dġ%:5,;y^@MOd|t_XѡBICf҇/!#^C'jf̍>| kz$[щ#t] fz_2}*z$kđq5tf`N~̬g2Lj辮o\KfnwQЖ˻|i?N{yt: yW˗靌 m% ڏ&x *fߓ}O_DOet.WJ~6Ô>4/6f4df2.@мixv>d"- }deT7ЁJtǿ_d %C^am?cukƄ%SH/fpUO ?u};}엿+7/~ϬA(kSf=,e:~'6OcK+J3!_o?BgX]~Z?_#M h0`/>@a +>IV?խEJ˵BszL-vtlQB+l]1Hӓw<l3~ez]2n!Q055Ձ^>g3GOKFc#,TBXq軌5)^:GdTtl" зvH/NG]ѹ&dM"|.זE dva[6zYйbakfX aX]cvAUĊ=pCvihH*V`v4s軌N5z1=rvHR[,޻S۰8ѻ6eKFgk4T63z &:̷N5jGv˨dY&P 3iP}ACzG0t1;+1eKFg*IC 8"7wG]С6;:g.󦭑 +P3z#0KCgٖ>]2BM!ġ"13z+0izkpg%#k{K!ua]Wt!=fPE@ 5P]Zf{ua^9:8L>f1d7 IPYAo\]aE;z/d*~Rn;7B?ۭ +VFa'T]2B+:n ΋0>Y=a<=\Ae_%#A>e&v\SNwW0y7=[P:z0.)S4 +Ӓ67MBǩ^KF.:h,+Ɇ^4&SNS)=}d-tEP;+(2CzrpLGpC~ЄKFiݔ2\Ӂ2Tm>jAOg%#YmCH)sW2dtM}oAg%#y޿vC^L95)k:MŦ'oӀ]2B_qkYP9;e^mʼiẽ'_nce*TNy2oT've׭KOڏZ꩎D)\3tj^ ;eBKFHÇ֡z"%vh8:KyaL@v9i{}^2RvȜS&d ]~|NņJ1]QFg2o)]2Bf}OOS73vT];eBKF^Wz⼅;zǫpmz/hz߹:vbPRo#3)5}NYY*dL;e°KFQs챜2%S4}OZQ*dL5=`PEYz>8Iڣߎ^t2n}NR~J]2B[?)W:%eǓNR~j-id{-yT8:Iu؄KFWJG36u65}vAAJ-q=$߶nǜ%#DU+§]ӣNR:zbSgTt+ӣNR~Ħ.!::^鵣w>7=Teu&.!::^)>T9_u&̦.!::^)vkuIf.5Yҏ:ǜڤ%#DU+rl9*2t,۔%#DU+n͏If~91&Yє_2 rb2伦fwȥg[$W`/@tym UKNTs7vTOͺ U2ķ=/Q҉V &Lhnop^ + s_Ӽ Y2Ry=~dNb 4cBF{)PiP%2'v'3lAj/Q҉V &%@! y3H0heF 2/LƁ(D+J 5'k?XvLZڰz\><{ziY4x_d2DI'Z1WR^`P4V4 ;֬Y/ }x4jeX4x]d2DI'Z1W[=Rhd*vD.9m09يd2DI'Z1Wܛ#{10lXT|aieXQ 0+_2+MRKf P5V,A1Wghs90#uZ]W4xYd2DI'Z1Wܯh^ jJOv<Cz g@Za8%h@^irqt@YcRqO iEwK&@ty{G^ +] +36r h~dNb 4"ŷ鸜mLƁ(D+JKK&wV8<@r˂Tp-LƁ(D+JGA wV(\!gr-0gˁ;%q J:ъAM# +Lh DgK&@tyM!{ ;+nLnY;^6s@>8%h@^ir#|= +ș|bĎtڱLƁ(D+JzɌA=WБ|B%qs@>8%h@^ir%sf*!cp Cܠst#%q J:ъKTAGrWh2 &8%h@^~CƯذ_ `iҳwz0tCf&3ճD@b yr 'ٯxiҳw&~8DI'Z1<3++A"-\Z&BeEqNb yr?3{fEKk?ػm2d\eEqNb yr/tl؏:;8&&B(.@ty͓NQ\ 3Dy_6Κ 4T8DI'Z1h2 &8%h@^5s~C+$d. @*`xdȫbch^ltq +4{*0dEqNb ch^;e~dl)1dEqNb zدch^z7бw1FH%W4<ճD@b zٯch^lٸj24{H% /@tyU~C+$`̣&>92Ë&8%h@^2: +:<ۜ<5=(yr9C4ǁ(D+򪕉4?VH^06z.Qrh2Q҉V U+#ic ثKGMFɥD Mq J:ъ*e~` ث3AQy&%K6^4ǁ(D+%ep1Bb#>7'bM~QrӋ&8%h@^ua? ?VH@s{?OC%/@tyU]p1BbB4 l Mq J:ъdd .?VHz;-6x%/@ty#Y1BbD0As@2`|dȫB+ch^>ERdh2Q҉V U!G +:O#;6mH&/@ty#M1Bb 6X$&8%h@^q\/C+$m^7CH&/@tyU~` ث#p=ӧg6/dFqNb ڸg~?VH?ņ>Yl8DI'Z1We#쏡{u z^3{l\f&8%h@^uqd?VH1aOOr|-d FqNb ρ'쏡`#V/[y]܃\ TMъb~ <z_?|O d FR&SM:ъjb~ \쏡zsk\#F&h@^[W$ch; +{e8zt&TTNb zx"Zg|58pqwC,!_( *%h@^pbH +={w'+5gtugxDI'Z1W-D;Zg f-CgB3Q=O4 D+򪅑#C+Q횺匎/5C g((ŦD@b Ja?H +={wWK[lJPB!nPM &ch@^uEW1B-n O.UC qid,ȫ +d 8v=n(q(ŦD@b ";>54BKnh+óPFt=4L5D+?Vػ#_o"XQ7r(SĽKM}=Qdޠ?Vػ#q?pOzZۡ1RX Z1wvQdޠ?Vػ#1xl8vv0zƸԴh2V ݊wKo бw∿COX0Mz0~0ӅED@b /lȼIo бwp0.1DTNb /l~ +{w,nW<1SIqF&h@^9^폡ػcroW! +AT^6 &Mtyew?f`#㒧\Fӭ&uX4MtyNg -oI8h2դ)k?=14{w4Vs( EX$xMъ|2ؿ|t xlN[#N+/dӌ&SO:ъ@asM_VOk̛LH n0\vl z5< o;.2 3B3ݦ($Sl2L);=| ndt{HKGL{Ɲ=I3\ nsUAFd$7R.#b?2=$_VCefZMf_g?#_l2L) U߂3[_6#qn2)7_jtbL))GF7xsvcn^՟ݮɼxi +K&#r`J[͓li=ΆXy٭>Ll29q)Z?`]1aϾrڀO3cG#֌pE&6rm>`Y[#Úl>%& +}MAj?G,2 t a胖?='׿LEz}d!"[ +tSʅtC?ݡw56CvM*Ϲl쇂KdMFq)xyGOp=%z:r WMfʈ\?"Wl2L)Xc$ot{hw9C.l1&'HzSr\H n0\#% ۃ[gOY*/?tCEv5tMf8#n0\j^>%I[pzS^wiBgIex=MkXkr:Sʥsݧ漇 +]z(XflN>?dzf<_4TZ>1פ۬~/1o +%6 O맇{>Y'>=zSK_ؠm^mdxSՏߡGi<oEOUMDfS}b@`Jd8}hn{ x@O?BGFnSujz$ǿ'>}'QFg3zt ܪM٭;&#r Gajɞmث:чς9A/Cl2L)WY3U•9sτoC<Sl2L)WY*>}W•9p՜2'I<:12ud$7RpܢG•9PkN3?:12ud$7Rpځ,[7 ݟ/c椬{St~cDb@`JuKle3b9fNJuƈ|&#rv$AgRsΜ:n'E>(6 ,\kxv V?+&[As26G?}[MFq)* ׭Bgleܠ 9 }[MFq)* wNCdBh7Is"}[b@`Ju6P.ЌVsԜux)LЃb@`Ju6@;hPI} +S$nd$7Rp2z4;p#ژCݠ!KYsHN0EJMFq)* z2;P6PF7hEs J&9LnH n0\e:}FOf*@7hɽ& =$id$7RpWzw%ژC ݠ)ObԥvMFq)* %DzY1A[֚fŞ`F[SU%z*{% ݠ-*6 ,\kTdc.4^s W}CUl2L)WY.7Al%t|85|}C$Ml2L)WY K gH .CbMFq)* !' 9U+f9r~3ٽb@`JuDOd sBWhd9sh`jG2CfMFq)* ==,̩ОXe4Y3!~{&#rpT99ta>wd$7Rp]W Cjͩ30>^ +}*+?&#rk؅k¼JMZjA +gcY!6 ,\K,v!UBwh7͹3 uOp>=]ob@`JµFb\a^;i9x'3}/6 ,\QB+-tF*ǢWl߉MFq)* *U +]Qe{> ]b@`JµJ9%Zu՜="3J x&xÿ&#rkc%oz]dF#Bτ^d$7Rp*A/2DbyEf -MFq)* =]r,[4,V_^dF9}ɯb@`Jµ9G`*<@hY2?ȌF! cA`Jµ_WR}y-EF(kMFq)* =}R}yvnѶɳ2JeVsi\sl2L)WY6ׇK\Ch\2Z%}R8kMFq)* =}HB}n:L }T8[MFq)* #z:BhRsCoq>,%&#rkqN\>ϫL-OqɱH n0\eZܠ'Bu9{acȒf }`0;MFq)* z:q#Sw|j"3֕k\qűH n0\eNT2uywq_4's>4&#r/W2uy=d9LxD<)P7SUn +=t2uywq(4g^3üGBIc@`JµePq!S{a9=.GҸd$7Rp{}D\/H]]`?k#:cZqH n0\eB[/>*t19pA}~MFq)* zz!V}B9$_ d]a_dvѸd$7Rpgm(g͑HE@ B "D  -SD.`D9% h,Z [(__WUWW?#2Ļ?7zw П%e i.NO&DZ&h=Mo@/o+l2!X"7)cb"-t:{?żJmz_ 21>-LuHs wJCEl2?bv+6kan'b|Y6`ʊ1 +@'y}yY+.~h]ɶ1>,LuHs w}cPҢstwh2ű[7qϪB=YMκi.NOi .bަ۫,z6U&A^g]4p'oc SEtk^cf*EMκi.UYFgy1-%::X;6BW1L [+恺*GYۼ(,l2|uuHs w̠Oa}{yn*^F&A^g]4pG*nCgyזcި +޿$l2|uuHs wd>r EY޹/1TX=&-Ej@ l2|uuHs wd>raѻ:{w]ƿtU"`_h?`i Eo#'!nAy41/E2*Dd?O&A^g]4p{*HӬf +41'v*^WOTd `}M0MfTV7Yϔ*ա7?=Mκi.=oӦYN3)Uu)RfkY~>Mκi.tчT0+N3˯b,Um1:ՕW>nud `}F6̊>C1rU膻׉,զl.SYu⯳ɴAY"7܁) +fEqeW̻TVe}&֦w=Mκi.Tnì339SQ1U&֥m̹&A^g]4p)Ihg_<^52ѨPf|ai Eo}4itigUWiĜ 62٥?&A^g]4pf)ȴYTOL֗oeVO{X_0$L;yu,\~飏$QTt{C˯?b:dC|#0ef]{l2|uuHs g EEy.3%nJgn*3Lcl2|uuHs gFQѡt[~}]Q#+^֠MC슕 O6}vj :P|}_ݠEPƏUy7u Љ' HO^ɱLDFs(Mx :Vfo~QGhtJITD䪏>tisiWe4p} \τ)t2u|LLDn[(F'.:WF?*29O8 +yX~Cw +.)CG(VTee&"=!gti *S23FG>:YC(#-39Ϡ<멐tB=셐X)f}Q̓V^ +kt2CAЙkV~ |2էGPtlwsHde&f#(y:[FA +>2e&(F.:[fI}TLD HCO T0 UGH5z(Qz :\GQ ~Te"i>СLwF!wO N=etbOGHy]&zF'F:]q,*t(DT }$SOXSq?F^e"e>~"б'͠kv2EP*u&>~ѩMkp:5QkLDuѧO$=mtr3dDT}Dz?١kHsY%&z'{ +69ڢHSY &"}dsOA,ݶ*LoEw{"ѹNl|>Un# dѶ܌gO&=ut‚ͻs%xˢ-/9ϞL{z%ӗY,! 5@9:bYUR#Da>zB'Ϡ#lx1EwY%"Rd+L%"O}򄚢OK:J:D;ccȏB<4:6EדJuu%_kQ'P@@ +(P0%P”n \K~߀-XG7`m5*Cr> } t}V%}_A2z!ІQ:u~]TCּ~[9dD[Lm}N%HA/V#()V}_qF%XM/C\1hH5}礁J^uqCh1VS}n 05GÊspA]7N)iPs ]F Bd-mzf=q=Z!HT #ףAEL=@*&$%oN/*9D G׽ò^TzcE]NOBRjzM魒!]F!)YC/$0?-i )#]$iXҡh݆PҹHDLWCǡ#xH׊iR߂C.T,TߌCGYHdt+:QVt0FjVtȂC.Ŋ^'lIǢCft:RHA!3!9@tSFWk\tXIcyLɒEet!:Z)#M[kDpnM'u%](=d&WJ}ÂFҷu'W2~*؎ba6D"@D "sݷNT +YsFTwन8Ȫ6u$8#u8N0I=pգG-h=Sԙ8hbގǪ:8ī88gF8);U&u=>2e:|fR :E=+p +#v|*,8u:ЪnWV_2zL$>aխWCgx1WA= pZQǃ-ZpQ2#|9W?pE=pl\pYPG'A=pEV#\:#cz,E]0E +Np YuB8$A #ZmpS*I]/Ӯʫ#AY ($?,E= pU1pЪnl\>@$ uQfPK1/7@NѠըk^l:$ՠ9z. u5i5ꠀW2n 'Du6);uP $[N Z:)e̪ƫk)|K0pYTGSw 닶:1\gpܔWyud 3BѨScڢ 5xuGvs1;C CB/2LPWtaե +;^] |æN uLScyY*).{̋dumū[Bgy1耛by ..=eϱcB2=]:9c5A]+w9ut(sFp1աYT⤎W^ >@3_uy*P/f{KPQ6;X*V]*Z)K]/S ݹxIPۤn2;oOk[–ͤcpY}{g?}hBŴl TV' +u>K얍O?ĩzZI}ՠ#DݟYqmGa=QPwuE W֘MKR?=i75o;тQwu^3侤jG +܉ Y}p|=STuV05eJj+p3KƤ.뜽naUwD@ʮY}pG4ikQ?-DxΌO˄;"ъWuBlxIpW.ȗ ƫD3YaiyeMhʮM64Viϵ:6>elsˮ5.Sj`8ђUu\e21̱/ ˩DSQ!ew_JBіSvy4'k IјUw22~cwSՍ1w>O|+yu_ ?uh.#; t?7tPlgvշ( [ԕfVq+XP@Yq@6~0)^cb8 Aϙg#yxiI1=Xug#2QjW2s1 .] 3]Tg,GoT//2]:Ɣ.:$3о ߊ:r ˩E':e) _ؖIj\fY7FF/NLR?[yUct^1I>W^l3-UdugVv<=\jftչ0+D!oˤ|OeAEE4z(F{TE}([pWLK +H$ij:[ o&Eo#VYM}⴯ w63u =ŧ0Ip;viуXu,;D83}()̌|1.lY]$-+Gof^e&fY3>4"_e̮>μYbKTcv>>;kD/ÛF2UfQ3쿱_rH  j3y&ٓtUT;"/kSLn'I'SfUآ|Z#WupOQH=y/UgXV4&uULQoLzx7 z ,)NuGZzxF\ӑչYqʴU󞖨2~/.iU_z+ {ަY8-MP? +qAz9{nڗ]݂9mqVOsL)gu_Z; Π.9rU^(Eu^Q_4NSZwS\#gZ;K6u8ev zSzg |}i|c(zc |9S/ãe|c E/P j7^CĪ3i< +*m8e$xp`E,Ћ.qpȘ xKVuGvSO!N 7=.q1),/YwA:NSX8eп^! [Nuw!cS]wYY:N;ee :I@RǴͶA[TٰY]vÑ"ujpQt -Lk{RDpI9xK(7kAsAs nQgb؍׉:^VîSU۽b7 \T'8m:lv]ԵvpҪN܋Á:v]Z{fKUutܡ8<~_9%vIbuЃ:#VuyNv&uv[R'NduYxki7\-JPN,S$uƀ˭3ÿM8PîQ]kYU~euGpTmvmLZ _:pdUǹj)^-v3fu~VRduv]>UN*Am+ٵqQڧ¦NhÙ: ʹQphaR'>dÛPԡn4.CŰhX: wuJvmml 5X74۵1k?^ 5<Թn4cR棑C"թKI솒ay]j8Unhkc8ek=Z ԡSQN>U]mO,;fu̦4n(1ðhfSduWxS'Fj;2L -Fl;9I'IgohˮN)Ag6P\/waЬN8ùxCe#. ղh7Lbܒ*Z6rʓȮAf)o.Т.eyE6uquJ\v`28 +,2 TuM[˕+FS?ס8D   j'$t'l6jW+m=Q /QnyikۼUs"!vm|U6n4mtC^Om|Uqڪ535c,t+g&GwYet {ES(AfQg[2]zY>*35ZU tty]b=J _8_e'NPƿ94W8hUӍҵ5F5<*Zu-ttm/zHuݺ;oTNXt>͍>3!YUeRA5W}ʪ+ѝ҅"]z2[UW;ND Ε>tk3N@W5ݯXLXUS.k_N9gM..*s=L"V]*]S&H޴+ZVz@=3hxU XUMttI.?90n[|U*]QFzD(҅>x#PO3ӵEz`)Go!A骪g[+QV*]մн@V4;g2 x.Ti{yѥ!TPgM\'нtgPǓ>|e\Ua9Е2dz $0հӧUEnE7VBu ",]FV"sDcD4YU3ҕ.ŐA2F,le+JQK I'PjfBVWvzD8ذ U]**}-dzd'wOjItt#]V_&zD:O!PUJwKWJ߸,:ODPNGZ"-]D*}+0*t-HZ&[rt3=&:7k}ť>`SACז|>gG)}@8T0Щܸ2|tƄtP0ݔ>d'SF.-F_UBWSMy9СSxGHo1Vjv҇lʛL?`*W;Ux'p;L?(br8é_5J^J`S839JoKYZJdSJG´=a.t#;JxJtibL)gJ1N^auY]U8#-#L+Ƹ?_?o/q?uM+NȕkSN'*/;UooXDEzO@]NO0Dz PNzDetRfzH7RM#=&:PwRue )QYԻ^z} +!5yJ葪#G(zJEE:Os=R#t"LL)unG~tB^r荪ESI'9zAWQ*UD):RA!ӓ*(iJ}'NLt&zR%MtR腪.TBSPua{(ѳ*hÔzFT=8Cp*gÔzFT#]C1*gÔ:FSJUiYJ; +%*,~%ztjvz^ltROr;(Uz`LtR=OFREcVJy5 z+fzu +*J9$^%z"tvzftR=Nr'UzhW=NF~RCVHm3퓚評2IJ]J4YI, +ItR=MQ=[!/:HG^ G'sЃ+tҷL1HWOj(dzretR=L1^tƛ\e&:H?ޥ ]<]ԟDR\gWFsY +pwR{=2F:G7^^dDᠧWA(&ѫTs7)dz|ED:G3IWQK7"9 3+ tRWI5ѕ@`an[ס UtiZY^z^3T%+"͡kYL35 F!Eu sH@E(2I( 7&usg}DA:n@YguD9L*f1"ۈb.8˘Cg*mD)wmV1H7A]Fp9+u.4Tdhbx*uQQ4*cRw2I}FAD)3T fu΀LZ搘2K 6̠># =[1C^P"/pShAPҨP!CdʠsA]Bc_jc\g06#T aV + +CȔ.Sgu9uI`ʠgA]@Xy~2k<u`(@S&2eЭD6YD^Eu`&a{̤Q.`/Y,t}RWV2Æ.l}R7V:Z2e&!u` x!;I}H)`C-knʤ uC0rT0.c6&u N}T ;uY!Zaˠ=RaȐ̴8e2hR(2dCMN ڢ. TS-M"C0YI}Y uEdZ2yAuA +hvʬi> l.^2@Nu Ve!YPD!*2db2z6P/ Ƨ̚Σk"C()>2uwȐ +k\_ H]"2dz2쑺5xAd}L vG]60u_ȐD2.A}o!Y!4eqNsX3`N]<)]v)swfCo9eA'hKW@f?a_s^5!=N:9q`xAdrN8 n7{\` C@SfnFw!^0gz2MSM'?k>YY1dZ0eX¹ؠ ³eBц P1_뢙%~pP|A) P)s6jƗo;z K/~uT*GN`!ԅ)puoN5tsA~^0ev«s:&>aW2@fۀxuL`N1!T)^Sg ?I ZLyuH`N1 W?Wg2@&#xuD`N1|!Ԏ)S9N̩3ă:~2%Kxu@`N1|#xȔW"CLͼ:043d:02aSZ^Sg _`{”Wg}'u0LSg ՉWG֜:cCػ~GN9uIyu`ͩ3w&upR%xǫkN1Fu1ϫkN11&?: oqPg@>~SWg֜:c%0d Q9ufV@fì~WƫkN1ܜ9S +^XsjRI`et35qL,9u2@ECkNAv~c73kN1mì~ez5X:L:ZԿ?{[PY??Ƥ~mz??9u:_@~o:Կ>9uu?>RWPY(~s?=9uz5yeMWW?vU\01h``PAs͑4I{[[E'l5:<tV]ҾѹK:߶sIAl} +$BysEAǮl%Q?tV]NЙK;AtV]MёK"z&ȕЉKbwbN\*ݱkyyK%VJwRtܒF]Iq+[;v!iKBN[*ݱ7:lI(A/uUc.t֒72Z*ݱxIKˣӳtA'l5J-i4^k:het.a%|msVJw +ޅYҐNWtV]YҨUc7:cIvztV鎭n/tĒFVJ.舕[܋XN-.耕IwliA+i|ު5c+otfP>Z,x[اJDjaAlغtQ;=Y +:[ektVotfR^U5cB'+i2ޭE5ckjtst-)\[Qtfz(X[^T%MEׂUݱL% [NЙ*[;~#4-[M#UFwl1F'*irޱЁ*[+NOZ<[ItVP^q*[+(t=[ 5bhtq;I[5b蕎RJʇ^eQ*[+OGmt芭I(i=59*[+F(iI/zݖ@lޅNQҢjntM %|荛5bPҞ *[+6F(iu*[+6F'^͍O] K)[+6~ÓtC/Vltv.ћ5bzI-ٛ5bsotp.I/ߤܔҫйINߔؔQ$]ToFthS$]V= 5bw:2IWV^ +NL]Dtqp2t`M?$- 5b3K9 Ò+z'BlAWlFg%IwzAGlAWlNJ|YER+6F%IiCR+6F$I|qBsR+6F$Iӽ9JdAWl|H'r|Iɂ$z39JGdAWllI$I\R+6|$ՃˡU:% bO:I!ˑU:% b㊍G~m's\GɂبF~³ӳ9JGdAWlPB'#I?e z8Ud, ӹHOwz]1D+%|N/gW+W$Dy hՕnJ\0[#|F\膝7⒄='kŕnޅ>$ўS5JF7Tq-I(/zs+ݰwؒ4COy}l%vSK@NY}j%vw/-Icy2чV2a爍$ N}g%vW!7='hnXo,I>Hk􍕌nX +}bIY z5JF7,?F㠷:UdtRFWf^'junXq%i4JF7,O+I)/z4JF7,I*ݰ4-*ݰ /I%5dtþ7y}R%mI-^ +JF7컢}N%M1+2AS}^[J:^o [ZbQ@ @ @ _5=3S]KdVX8Ae=ڧTlN { ;>ɖ),ݰGc[StgT LIgHeˎLI'HeǎŷLIGeÎKoN 2%v+;`WM),ݰ1{-SұQYac2^q˔thTn~I_ktdTnص1֕%NIFe]tx-3㢲tî1wrC:,*Ԧ?*cHGEe%] 1ϥ^c頨+vmh9_]:&*zcSoćG>֕xߖںtWt@ҷ=%5鎽g:cpnMOMgeY1 钽mt2\XҗMwJ-Kk% +-K-aKߌHٯM'%}G~qHt~tܥҷ5{8{C9~ʿtbMԦA%}UsX!]oS:Lr>Gn\x洆K٢mcN* Sg/]gKߤ@5.L~<)M]TևLI?tC~9;h-peh|L4ofOZ6fvu=֤̮=uЗNK,ukcimc3_4<_[?pm&LvwڡXЦ @\;|ESZ.DDWlHhZ&@H;;Ȩ7e:wV:}a*mcv~u.(r*LԤ_kл/"Y[QH{Zvy&2c5ø=釐7>J祷q{̬]>stream +%9Q endstream endobj 57 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 54 0 obj <>/Filter/FlateDecode/Height 254/Intent/RelativeColorimetric/Length 3701/Name/X/Subtype/Image/Type/XObject/Width 516>>stream +H*>Ĉ7˲DeeID0ZX%HDDDDDDĊ˲\.eY.k,2jk2yL̙yvf_IVe$y ؟7)(#![Qf$#jO3+#no32Pw @v疬 H('pbB*npU5RGB9U ӵE ehh z@ŞVI !Z*>nqEw3AvG_›7 rB!{*-אD=,/*O?M}/WKbҠ(  <,?~N.Vp6 e$* 0ʉۯ +B 0Q ??nT{`tB:KKsF-⨓&!E((/t;\@Sq%< ,eLR~`ypY@|0=y:y̸7)*}tdhD X'_3돔,LG20̗ʆ//ie8A_J*[Cb86h,Btk/T(T*D\Q›ezY} ڌ|Yv[(qSӍNYMH9g +-ܲY6mu&fU6ܙ(dd`۶|q4e"[#۶hQ8t-E(.;>;{[P Ko,Zŷ\Z@i.R Zh }-WV-nRhoYAWr;;WCܢtl+4KmeݐZ"ŚU0|<D%kMJ(1OC+`jt9X> +?b6t! jlAQL &tȂ+y#f ^P!0D3_}&xl :MxgRh[0bN.`ɤh-ɍ6ńt&L&{K7s@f |ge4Sإ-}#2W=j;F`܍*W;;E d_0x\9?.nʭLS)|uh@oѕs^Qupj5#0ګViޯ '|*:Dq2mi/Rl^CP[\Jg%Lz'kc߄[ܙٺ3g}ӹ-3Y!P K\Zs)"ta2;Z#4B@@&-3uDNG8Y +t`Y<@R3Ѕr.9{X + Hi]`/@rkFjfLݜC\թe,rԚt|(ݫ&'|ZY`JEIO#.6//xn~p&ZOڌ QY墻{k|敵묹֫trٙDh*fd6w5Dt%o'IJ%*b])``ߒw ,p)[u2Ai0XR&@/(K b#fJ^*=`0PIDe2V j )h+Yé.59FPLU}v &0M1sp9Ez= 3n9͡M\y.gE$b~ ,VkfeE $w@2Q1Q޶}UjG"?&=dkc9Z岹.VԈ /qJ ;8`F1 w/bzӞWNȔ +8ׁ h-wc Y?b @tpMhIzVU 4~uaP! +%R0% %^-aCB(RzJX,K(؛RB]w%a?'yNgUœ>9n޹VFЭԷUg+}.SY}ty*ehU5ʺCt8Ut2ϺB79YP]NTc4>'`00 +]^ǰ_K +!Q < :@W%_̻v*䍐< noK*$s&ךws]F@?q#ӚIQ)` ezΟṶpf/V 9&sL?,#T rޝ5)t R;:-qA0?W(1Nϟz=SiMJ/q=\)Enȓ`)pߒZ4-$-횂ϧ0&)>[-oHiDF0p-S9 &bc6O1SlLQq`G~3~`LZM|iWߣ'يރvsm`0-v8X 6dKEEfb*Xuv>n"f`kWE:<\WEZ@&ҫc=5H7!WD]yn@Ƚ2F ʿMJgeRZ5e? Z endstream endobj 53 0 obj <> endobj 27 0 obj <> endobj 58 0 obj [60 0 R] endobj 59 0 obj <>stream +H\j0 ~ +CCw 1ȡXpl%3,QC~:?[<727 } 8řBC u<.o]h˔ql@8e^`wýү {7H 5xeͦt= ̟cIøqJ![PUFEVHQ],t1S̒Y#ǚRL zԏo endstream endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <>stream +Hj`N hQ endstream endobj 64 0 obj <>stream +HW[l>sٵi& vwvq8lڐ K3C +xm)BI4MiST}1J*QH}hԴ/UEc 9lH&_9{s46䖭L~.B g4pi'^dڧwa14H~U<6[8(VN* 0/exܛ/79t\w'd/C_QuђZ9̶*ċLm&~bgjKO+͜)oE!UN)Gmg4tM.4f!􍔮ݲVQ,WGK*HrpuGxu?:>MY| ']}?ϋӮP{_ճzV(3F"!'c.19%?gz>"uB&qf(\h . y%;}h*[\ P1/]o yG B}<π)6 +#2XmZYblfO(I3˻sű wE̴Eܴ9~J薉Hl9P֟@ˁXrF0ṦtgP2DuNr G,miiBJ^XJY\]Xt6i1{DG#W뭥jX˫ gQpA>̀*eT 8Y4QD*&bƭj4lLxhBU͊`4%-9M4=LfX)тiZpduEE Vn Qoh3SpsH#joBLak#-IMvDf<҅Jh=y7!Zbal~C-"h]^U +2a"[`KDX+ZMgZlF>]a-̶~O7ƃH:֑LN+THw!ϤP#}ꤿb1[aauzp ͖YɻȰB9D$%k:dMgo`1є/ۈ6/H'iބH >ҽCt#mY<mӔe}GϢD*)R8[p*U4!л2 ~RpmSvƔά|&=qZ|G6&9;a]jg]^aPUX#`eqHa3)1x/*6tGP"|.v_8npEaPQ:!CDh:.ў60[qsŴy9w.O]as]2r=r^~ϦW0pۏOw|?k + fѭ:v7Pc+˩މV|+,bʛTbİbẘ) <6®J.8Zc\jqZlM }_Rx}?dWjĩ˧\)04eqL9ngtV^;a8n#Xb(ymKL1*M4F8Qȴ?{e`2tڠ&O'O? ʐϹWb{,c⪪/ gP1X; r4#7NxGZl)߻J>L;#P9bcxVEZ[KPYш$ߔ苘LxQB"|KB"n:߷#+,!ѿ#!ѿe+{>V_?adDDx:FW+hڦb>3NculH/Ә:+hPrدz^kNv$=m>͘?S/~::|ʋ9mˮ葖V}L/?5؍ 7?>˥cgo\(<5jIR[zWVm;{lH؟|rm%×!Nt(=4t^,}6FH ćCۇл%uAF{S v\tph' |yҏXj_ﭱ"Q'w"+uVƼ9&Z78E6"^gvQʚK7>%7c/A ~U XnbeRv CJ$)I6 R$?{pG~   $#<3LBc Lim-u(%ʣSW-ȣEGt*"0#NQkR:}\ݽM s}={5Җ?7sx=k񽙢f1o>c,VUA3}We.q^Sk@}Gb}YOಋ71'ĝe%/k ̒ |Cu6+.;̺)ߔ~mKOH7~8Ie*Izd#[D剜D(%L? A8[A/ncNc+&tF~5{8,:|YM]@6dvtsixaU_d_4Mpz}m)۷QX?󮥨5m^oT[`d) z5(s{!O}MUYC_LjvkI$2k-qRez6HEI~\PB̢ALic#td2%[/,f3ߩ:i C(NyIFȑ9OviՑ ?x\)]f*幔%Y&[ښ3OO#,~;~^fmMʜd̈́{}&o?!7LF;0N2HW:H+?#Gv!_';''~ʶҟ=MG52%wتLz o63zD>ߦhO؛]%__FͶRfRma|dNx8_/Ci`7G]vc 2Z/uqZJ^.g; %A+%$tG܏J8Kxåg-_&1C۩ WxT+x{tgK7;5߶ سsL^9wIZ}_G,l=D_ٷ?;-]#_RIfosiX+,ː/8k_>΋z؃å62wDJy{dN#{q_ۦz?!cϯg#ѳs<ƣI>i`ͯc. +K}@K%پSl06-dV=6vFZhmX!ػ"t ۺ,w}/ \ikLIW5K;.+3v/gog8hS|f8:8]~e< #a4dB6L)0¥G:kn-=&3Nv iS.T 2@>yYXha/uz99 Q֣6zp.L"yc_q(|85CLQݿoYB7UAElaGg{HʺJ?Xz,$OAjhL,稗%.mm )oc=;n5Map>AK#'V{T>'YsxGäPg-䭗JLG/F>[gonǹkk_g=_M$3m]WMe~[RL/=*9%;̛HJbXER]w0w\j}9$}kbpovU +rwA?Yrybo/yY 0r` ltO: ggPH06bȧ:u:<yN ]o+!䷨wk~Lb]w3P~c]#!6 &:Cdds$> endobj 52 0 obj <> endobj 24 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <>stream +H |OWsCT?NcRAj K XPmMJ *ľv0VV$t4sΧgs99'mda:ty+$w%PIiҕ:<K>z0^Y 8>"9ihmPq;>bU#RҦ@}IBI@\OkLIz{}`%1I)rY)RNH+IC +S''Ͱ#g;36v6.g_W>b|~f_zSp#xoіh +@JoMc z=M (V&ICnr7㾜{o|/8v:*NSӉv8͝EZgO%Bb(CdLRWֻ׫WNjy-N^x/yޏ]~E?~{O_W5Z?oo**@@tW`@`I&X6X>X1uAЛá#5>[3g.((BfIG,28dF }@t~bksb->ħ8r(g9D8QE"B`yLl9wkFjW+U|/ҫE{MXx)to^!w-~eqh_!͟n9m.-@BA-r}w8 evY,*Ѕ8 +ˍׅ(]0zs9|(.Ϡ٥G\qeepoe%Nʯw*?./^y+oށnm;% +O[;-On,ێK_lJ-[hu9Lr8#QdO:N:sg%^gy^~1tu.WU]tfhnҷtzYkf9`VY2{̲"dLdgυs~boV|&g:g4̻ikLy2 &465M#,1sb'6:3zF1`2b&`-VøKC>2Mȴ1gLͦմrh;4}B7}GL\c7X0"I_c4XGO?aǙ$+`aӹq$fq, Vs4q#l&Xύ[`7ansϝp ;9 㡸̣p3| ?[8w"C0i .Ҕ#1$F7X5OP2QJ +i9Z>!<899ro$v8 M簀\ 2ndmrۻ ngƹܮnv7y檹nnMs\4?K#ce d(̕yH&KKn'{U޲W7߬V}pT?{7!W񮏍4v!}ٍ.=xM@TcUjJq:6PqD" +ZBg3V=3?s]v{~u}k:i}@{C/h'AM}H;7t~vJC;o~ߩo7k?~ߣo~o>зi۵}vVߥR^3ZIi$X lzi)^; +ٯa9;ǰv6n.`^qx ^s5n y< '~79^[~76'Z`*; dkfC#{j7`{7a"{jSN@; aA'{汣0؟ +[܀yy3<[I>ï繄(=.|WG| k,_|ow>,b.X$bpĭ8+GnG<,EW<$O'ţ1~L?*/F+P$KbxߧxKo7)qRC||@1+ +GKjFg f-8?\*Df)قW,=lY]U?e WH++e04,*lfj뭗P 9`D +\[K%'TsJk_U&BZUۿډQHRkHIuj.gR$Lb9)楪9HChgxh +Y"#6ji&(;w nBE,'k<9GfJ 3#K(29)Im_U *E-3e|nԕg2Q>?tK0f+JHK $z<(^o`jUv:fkua]XMoOf2D ʂYi{#&]4 +*M`yf&TsVބj(:3g Ո4!mO=1h de;6NWCpBMKpшzKldp&[|J5ƩʱR~=4bmH,<6U Q*夂V\ S5N}e+.1Ƃ\XO/wTi5 oA#REoq/n\amgZ~+,_Ji˯j˟@-w%<) PcmUP#l +i54K4F?Eh4?4??ChhY+(ӄ6{zvJzjRJ-/@'fӤzYAϬ֟TJSw:kM;/ x,9;˸[IL֡`v |@.m?^|gBͶSjQ H)L>jbه7-v9NwbjSa4Rj*&M) i243UaKQ/Ypo\妨b6 37۾zޠ"v~=o4fsl zja'հy`2t,83U,0sa=J,$X]U ,vUCH΄VI.|$ʩP"c?$^2Įˣo]GQm'gK*ܤdS.@o.\Rr7Z3~S/mTcԸTLhR%Q\l#Wuf*t +ěߋ ߘY}*&uتK-ۙD%yYKٛj0o-I5 oM/ؔ5K!KQLceJbQA,¯Z%lanFbXC,%NA?q,#!^x#[FX +\1B m :F$$љ  q P`W +.BE.BEhS`T7»C=`փ-֖9[CHm9QyAu,BB>e½!$BHU`!w{PLz` =!$#!$Y&<B"<B"F&hE!<щ0_.QUg9fal6 77ٍlnm s/t=?[;'PčDK:Iٴ<*Sq!,1t38n~iM:hN,= +agEJ3ٻUӘM S`99k|lV4cz;)ު1}zA-^XqbkD81+lp ʀ92^}Bhi';c;Gx>ՏA*׌Y~CߴfbAFT"i|4I gJ3F'3r.%;~5ŗc'mz_s Bfձ=Pmg0n#:p +ҦCý +ZpE]5A)q65$Ó/螬(QE:`ق`ȲҲ*RFhر+;^o$<hꄜG?ג9EuA6iQ Fj2X +7pƞ-o**Gs +`_qOaR5I4n:ņ5NmʤB{MGW`qi\͌e1QDWoz3]D'+=Dȿ4.Yr\ u΂2;j!֢>R;*jW[Z:N"ea-DJg + cɚbP#KvcBCn 3ʞ:WO֬{zPla uE?we 0~rgԣN^u2|:!3pӲBg:n%'IsѽsY[%)ٽ aiHMHu~75fߥE"\3*\=UʥzEE~FVB'x1fHh|d[ViRh4Mo5ĜY" v:&zմiUp1`"G$v)9D;ztƔ1F?i'r z $^6i6Ei'ޔ<./JZn!ہd!T4?TnJQk\]Rᦈ-m1!P9 &e +l>yd` 8 .Zsk&2M:N%TdoD8aK=JEy ]| Pg,Y<_G(3 ER}! +)"Xw )!1g ÍA"go2?bs@y.ǷEo{,eSh@7zooqܸ3wS5ʲ Ӫzs=mK>@^hUBB%Svaϥ2z! 酚D rwrm +|;(_^)=$P9dȼOck2ߢ-\MX}7;4~]o|~.sCr1Qov9gMvbTF)I>/Jz떊 Kh }6:'*Ƭ)>iw!AGF=e\P;ҵKoyۀ8BA:O9}(Ş7Cֆ{ rh\~fYyyKݕK-* +h\YD:p%nEٚ,u*(Qi .\BP.,Ɩyi"5{s<"SGzC.k5 RYF٬{׮ˌZ82ю{ȇP?qD+~xK#ԩ3r L +ً$)W߂.JtYgM>8G;eyP>eGeL]aw.tЦo6I i;!M),U꼥"z5֢?͞8ھسwJ^=oP1*B਌kxͫ])ķR/ٴ)\*|<4?y'OO~8maƙ|0A:nG\lN|y[q1׎0h3oj llItnw0G̝y%7umg˴3m56k=:w>: PwcҼ= w=Mv9ɠנf"X =ž߄$G?O)Lf9RfMsUmtb`zQ<}>>K?__ڜA~a񓵜{sLaeg}\BܠNjb 7.]%KLYcÓ.V̉OG>}w)|7_%>ǐwI|Ɲbο죮oflJ%*TJs ]MFwo0} r}=O2G>)fsa!weM[,=68Iܾc|Еz%S+xW5cNطf17ջpz=X*qEmQ_`0'H7^]kW=9GIsiVF"D^R*0 Myӹ;={<29[*sR.}RnvAh㽷b#S=2a{ _e*gXwغ`\;SCCmbȿiLh {d 3 !qCf|O1q?AB&xvͰϲ3`x[2ΩR6d=ˠSR=O ͠LQG妈?XGY_D |\Do(DFs&n2adN?v,.޿,ŷCnRU\$X/{с o +;Ọ2D/9v5+.\OB%l4|ksf׷Ig?*e%]_9or5́xm %0(Iůyuj]%Kf~RIocRDX_#&>^b+BBB8N|mHHHHHHHHHHHHHHHHHHįBmFJ.-k7ZɒvhT'?jz~r{HJ1.ƛ>/|ֆYs5,7wM7mPԲ2C'+elrY&d~ u,'Ku6RjdMnFb˷K*d,'D&o$XSCr 5"rMHg4,4Hʸ+֙ Bag-_gemmfݞm^兩ĥeCYfM1 jYx"^bq'nUdtft?I۳JEDn"; k9 `gZ+ɽdnmkJ- "Lh}VFGb9`^k}֨44KMz endstream endobj 51 0 obj <> endobj 50 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 73 0 obj [/View/Design] endobj 74 0 obj <>>> endobj 71 0 obj [/View/Design] endobj 72 0 obj <>>> endobj 69 0 obj [/View/Design] endobj 70 0 obj <>>> endobj 67 0 obj [/View/Design] endobj 68 0 obj <>>> endobj 25 0 obj <> endobj 26 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <>stream +H tEUSՃB@h g#C+B @8UDETP@Dd!D]p]TDfqoyU=]]WU" +sWϔƸr 6,`gZ玘\.SũQJWgꛛ ČƤYvE@ΩgoCNŎI˘Q2|8bN({&m،]9LtOQͧON-Ό!4ۋsgv!hLJ\7sW2D/^K?*q۳hI79ME ׿ |gBZb6Gh ަt.qU W+E{UX5nz(ȝ2BTyU +V:`le[݆lֳ me;Ȏ!>iUtpCP1 l₆A 1 ҃`m>l ;}K +Jp(.T/Z G+c6\/9<4Yy)r0Zp/? r"2Uz"̖r{e>'>{G9o75'ogw 6Nߤ`vAvA +339# L?V%K!d˛?/,}N.$>*;vCNy3y#awǼG^wťuYfy@+:A3ty.ԥ>+tLҭ4W-zZ'fYYWLe֚kh?Ě]c\=g^ټi&ĚLlMSS41+rI0!.zB" c Bc&b=6 pN#ڴ5Μ44zB;zNЧt.Te8qcN܋Xyim6ffYqsy¼g򻛷e(0QD +~g1q~7S^RMa˼QQhFhCPb Bw:[8lVz.{5v>:Hi: \(.rH% ܛrdDa1P&”8ڄZ5iVԧс^s`7+Dф;nt=}㸝rB'1.".`}Q) K`G < _o\6,j8Q AW0 u(CKpSЛ>D28:ۨFYAc AZ* +Y/8Wij\[98paw~1qe< "O;~wo$VO}^&ߜ3edΚSg|%d,s,'d<)TK"12VK$W4d̓]X byJV봌FQ^]-aWIⴖz6f\j9mkk#mM6ЦZYoԐ֖gfY-e&ʳJjE93ΒqZZVjkUVVk;F$K;szՎvuzdkg٠]$GF&4Y6kw٢=)[e+;e./_٫eO`yIzGU$ABz+岑fB7ku l'*c?@(Z:C鴵?Lww Hpiv9_='Q}vLzN>>N{OK;߭k?7h?7j?>~߯}o~o>ҷh[Om}vVߡJ^>~?1#H"$(`S0YvV2vְ?o؆^;] +x܂܆#Nxw[< '. ~9?;~7_? eC{>/FԳ}&砆}&硚= ]އv&t`; +1ˎ@rO< x7@7Ӽ S`/ /k;:xK.>> >+CG||W~'kc~owGM[ňX,EF]gbx\c9Q{ģxFBIU)̿* ,wҮP$ҕmV;roT 9hD +\[YJzk[rHY,dt>DډHXDͨQpfq5 ٹ!5J=f|1grRdG$jj u]U5v^ CddFFM#4-;ybaurbq5daM%qg-C[t;(L)arz Y&Z"|}0%IB6UU^:"mQڲ ?K[8^ F]z:(3JT/}+kL)>V9M0m][ielrF\ыC5N}&e+*2ƂX5YO/sTi5 o nA=Roq7nLG7MAۚ l3S-?BUQ{^cZWS{O˖YzؔIVI1–pS(VC4 Tm:o%>jh>jMh1V>jg}Z 4aᶍ1ET"x +o/lj0^aʡ'զ) mΚ?+c3FK 4*rҟeuqh9\a]f#k&[g?Ѐ돇$בPs΄j"*&ts1DIO]P7r8x`XpV5iX@k &BҔkλ&zJ3SeTՒ%(i5nk5j3aɶ/=ո7dB1sbۥsrV}cl}t9U.e61Ja`pVɪX~a&/$%_}f?mJQ쬸 =`xwAIzBD {> ^.K2).ˣĥ&C܅#I^Sm'kM*;ݤdSv_$0I{.;J3nTGJ,5/^@(ШqФJ ;05|N՘tJPOO^~/&cS˔e1DuR5&_nI4x+}؛%]{| oJxog|.Ǧ49[j.6b--{Ze~*b Cp+F6Ȃ,`d qC`)q,#(›ݎh51Q8ZI"^ ^VӞ6;iOkhOI G>!'!J!ZEh]Eh}{m"}<{Bx_ONz=ۄwm9pX'/-3f!Gp!$ƒP ;CH]8Dx$DB"AzXx, ! +!Z4^~ѦzXEfdGWt39?̗PT,?P~(A]"kL'mFj8hɤLMk'6:Dc'qN iMڦ:Amq_?`ܙϞs=ťNr}Y'L0& k%T꥔u9mQtWz+ݕ}7i7Na<5G4W`g.i% [mJ?~. DEEGŹ]rD&SBB|{\%ӳPs[궶>36ߴgnYVq>M ]N$۰ėUʩl1)~Gs.e#i!6؉u=n{xM]/PnjyK d)~!؛eLP1 ~>7<6HT[QO5]JēTIӮM %_.qNm0RIl 8DdgRB YY\}i<.{eK is |âE +#Bv@M] T>r\l!* v;@p$аssg8"3\FVq[{TElw;6oe&%\l^qڳqĴ/Iq//6:B0IhSR;.cLgBw]7%vW2[ةi9N~yҍcm|Rp' rx'ŔAqQw?Imv9axGѻM+oX~5ܯ6T xP:5nI(jzicAiO pT"6%-Z9C Z3p< @ALCb:a'2jt9_fyvYB\VRK=5X09oE;`Te 1E!C2":!= C% KlvyXFfW}>&ݤ-`ckm!o\hgJyE8xe/Fv8?Ք9ıet`H 4>iRkZXbRղ*J*@]@^4t7!(BCfW? O¶vMfy!aRf5y9jfb:VK};t s 3b^ļ ]2(ws7Ņ`}oJ֓JE-*zX PԮ8W 7u3,R34Gm4`O={3错0$.X'Y AChK97$3y 'b9 {zO>@'YJ{ໂ&䡾pt7s{TI yT]h +YchoC*PZ{_+ +vәc>g-P/@I6@7cٟٸSKtR wu+@g8Pz)~ 8wpނspCۣ8@s6(uCSx<|jNv{(,OcG}`E_1kX.K]=ɭn~ +}T9,qW;)l>%ȤE`/5ş~1B,C9jRNx m8ooSuɁizm-wqŷH j 'Zw;(F"xڀ훰l- +<+N#ԝ)>&pRcaEf^.\ĝ:ȫB΅N=_iPy;QlʕD?o{X س*͢@/*U;1RU>.[v? XНwX3kȉx#;,.]Wr6grScݕb>p;}܀@3ܫ}| 1yb*A c:ހr"r--63Z:~Zh;{'QF| `EBսH{[K?F$9`'e3qxv~mƭb܁lψxĉ3_;&1^8ctě:?R :=/v|4.M.if }TP.Uv`|\a]T^x$9b<y@ޑtqm(t~uо>xO/ ]yP'0T,g@|c:DʓzVQ~è1]׭>R+t>ރT!cϫu+B~_QaRXjZX(6P .uhV!Zօ6m9D&*\ MLĄ V#<`$Ox]:5 ~ͼy̼7oigq{Mpb-[~VwNef4yMJ`$.'q\q|k<01`!)R PUPt-lpo<(^IRmt̟AA\3T쇐Ò@Gm<4\jƎo?$Qأö^~=II;nƾ_fX{ ?Ev|-;| yYK*B3hXmeb}OhG˺ZZ[@w\'eR A)?G>z1gZQL,Y~>ߩ;V9tWyYuW )=nsk#4;kΪ\HݳأoTME^B[aT^ 휕lWWh1IB=6u*'T!wטa#B-T>j] -7Ϫ·ㄝy/aVטu 9pͭS]0 +Ix!1Z3f9»}߬7ic?sv_)㹵XH~yFHF9uOHN5+]ʒe|Rz~_K?i ªkٔFlC=1QgTa gMM;W6&V/W}bܯEpP*QVi5Rt:oR?mUu~yROd BpqDTI^v3$n|6Ռ\4۴bƘ䴗>B|q5Er> endobj 78 0 obj <>stream +HxUU3w\Ry!$t1"%RDB "`)I *}͞<"}{7s̙s=f&mSɈT8>)&VH +}M..cU֠)@D4&j!g<Sbwc6>N>r@kLZ"ROŵ/%yA+k] z#Ǥ}䭧NΏއ jcgs7iswިILu}pQ;9&$&8 +vt">hqC-yd555#B|ZHi3}A_qYո?y!iS)u'֩s9CQ/ͤ a&ZBke +zE^ yU8aKzzC$o7{[~ H~_ݯN~?6?с@@ MhxT02[CCBBCB'C*}a/FaIUG<iKYt~fp|c9*:auq(/ͥ<)e5R4+Jz<ߋx^]/k%z=po7՛- sH]ˡ_/a5G9S-5zaǡX`9PrxС /BtAr+om4rɭsݹ\r>psrezY'k~ޜJBIrd '!;~Fg_ecW۲ڧYodӖMVZ5#kbVxWzY6%.Vt֏\#9R,3wT[SFAZCsIR&i *VTJ;t}hH(B-ڏ.YюCW$t t= /ї;} wt#J?b4&1c2+faSVpfp, s,6s-l:µ'`?7^np8ƭ7.s2>侸qS Oķ4n$~ rTFѯg +B$tH0*t(hVse(C+Q"N]@ssElpHHP_Ż>6ەZ>!M lBOV*i;tmP*tN;ik89. N;{{/Gt_;紟z^;ia턾 ڻmIv픾Q~IY~~ n}K}MH߮}N;3.Wޣ~~k>A!F95Ȳ3YXؿak#<jk%p ^mp>^ Wxg7o8~7& C Lg= l?L/&4砚} &}&= tރyuH7a{ #0ygȱ?rxooy3<>>W*xK.~>| |i~+#~ Ov #b!vbD,K OYg5-S =IxD<*׏oCQ8,~,(%/Ӌx[#wqqR_oduccKc eiu}vnN+EO>~O>%9[4u=_wV?aO]ѿ,OTxR}JX9eaxoOcv{bhVimd'(qc*qcf(ReR =O;7fRi&l&Ѭ+њBNڬ$Y-yy֪Z'UGdd9FAhF_p#qXAy%L^UPȂ,l=aYY#﹦Z̠`O*RN^AvDBKWco͉jFc+ƙVPEeVx4^aF +ixL˖Y>Fؔ)Iq֊pK$LU[# T]*o%?cW43?mנ4Bh,ic|`n}'L%^=j5edB%^WNE36^a˩ eԵZ2.?+3:K -*q2?/Emuh=>aݝf:s0KK'\+5#} :"h˔F]Z(9\|cbwX4p;V4 h<`INb2( ΧTL̖ʧ^ҵJ +ϦZ 5΅ԧ=@LUP̝اvNMîo`M<'<!fI5l  Nܮ#ylAϝ z[)fiQEjByKR;*!$gH+pSn(ɮR*lτ(RL*,q[B)(5%^*Hixo'7I.{)-N\@R j Mj8TmQsִ#ש@M>)yؘ)%bXj\ļlD9*=8[C]{ޜRs0R܎MkVs/|( YTЪ׭"07"`n,\"W'8VqF^fD,DQ5xjh Bt BtJgXGgL9 $K-lvAQEUB}Ocq͛ M菗rk89:D~\( cn Dϓ +"d"8W|a^o %񃉄:`cNMDlM0WWtȻpp SϕO<f5yfO/sKh>wvk'egwlR*!iʂ\@01D͉5;²"?? c"g|!=PkĎȇִV;  v@x?W`f +%C9{ 0a̰kU֬.B.KvÉOs1Qzʒ,ARJ ݦW#啳ߘHzB4OQ fE-ΥRhs£}2=Qpmv|COjm&˙O d#ȣ0(~vtn3O T1bxa-B(<=!;{ Dqyq1ȑK#+k{w;y] H]sJM+B-c;YpP6ᾀl v S%R(\N/R4ZRUC F2n\wzu#B;Au]O~Rwኧ}򑺮b;t=ҫGޞ5t=6#H[YM݊beClvG%E!vTPT-t4V0Rod|X\,X#WD FL3Y4˼_%^3RBnS͓}Sk2^E2; :)0E4î cP6(S +~0`Nvd +Mؤ5orZUcZihL7ttkCŕpO86rhӖ8t '&~ ^'_A6"6,`Ä^㡠tI0rU͙h7&IFlg_x 7=.I+bpbA'3砖'Ase}L bG ޸˦:j1ԙPV+L$CA]rLŋ |aiK }@}'xӂl`&FjA-$xE}P2~Ϭo|oݽ[1}U}S\{~Yb=ND9d8Sͪf} +;Կޔ!A2kE-8JL=+D'> Dkы8ܡXS }ESFs==.!  7Z +؃nC=Ў=~G|N_q BU}OTZ?D7~ߢ[?[s7jxsXCPh(.1/e9/w3Ӝ6!9Ws$:z4ҏjӒ~ 7/K[l&cH:1k TGeb +}iچrx9=e.`}`Z1:{RLNd]E-'#x&5S蟓.<6] )R͹4R럂դoA a0m{}A.Tc =smeI7B5=@ Jyl,~KG1`N7_}/=X"GW + 9PJ>"6z#Z7Er / ֛VlÕ?3IҘԊ$zylɬ[^'Ty(uv <uWJb +OtyG +ÚL"Iҭ:ϸSg,]$kf~ЙzdqJ saWվ3S@ +M*z!T婜u$@Pdm,2Vs|H'+1{bi"UծxFo0BYlY)UIÞeYFK/qR2oJjut$|_kC:o@u$O㼫+*Ϙ5NP[ Mżh$GڍRbƐ'!z{|ihHCFn1CcI$r縳̓vUdvi{J31n0l -731[Wqoץ)y都Pn:Qj 4=B=s?~dXb~d&WaU~kb}n-lVoK)^@T2s+7NބLK +)V'X7ȺHb7$vA:Q1gu1oҀ{};m!z) c/2C`9S컩^ i=kܵv$h~w^gq1;v ;AMzT:gNcu?$n~mj/Vh*HUq"g}_|i}\c +Wv]_ԇmK fȶ~|ZBn)5MX^1G>ͥ]31}RƑz +bwOv[?a^ i4}UGǴ<+#bQ1:B}þwE۾gS};¾gm^%e)^ ytS + m,׮kLt54stt)엁 Ȇ< `v#kjWq_d?ԻY&:8:"-Sfp7o(CU ]l$U Kmzq,2`?J#sa<C\n;G)c2HRTMb/[6SA[59챓B>#VY>+r-j-idl<Dd؜_*7Skз:C}vj~#"865B.fĉ{6~ҤwQyO奰Rfv!P[gokk +_g=_ݑtJs6uuei(wbO4_(9L{w3H+{6/7vbHhx($}!zJ':,w)pGȂَ g5|So:W\x}[y5%q gٱN[^90;cvVM93Y ]n]ґddVZҰ]NV):_ƙ ά=A-9j q6gElo/,n=wRBJ_?,]/7_Mޚ5G/צ8?&A7v؃Hss juex1kc;kIۃ7A?v'^;6d98-B`y!ڥ}e¶mx >GL,%%%%%%/:?ӿl:L܄y,){4G)l +huLU۬_bTLON}7тX,9kVי)ncXWD 7:OXs-kYU@o{*q=.:YL:Αw:,jAL|fnQ{tyaz` ]UrzⓁݷ惮|,X+,XBi8mb*ZkْEqV?nVb W,9=4b{0o9.<$<6# pB魸}sCꄧQ*nԲ+oCEAY5kv'}yycTL endstream endobj 38 0 obj <> endobj 39 0 obj <> endobj 8 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 25.0.1 %%For: (Luis Javier Camargo Perez) () %%Title: (quantum_proj.ai) %%CreationDate: 05/06/24 9:00 p.m. %%Canvassize: 16383 %%BoundingBox: -1 -1080 720 0 %%HiResBoundingBox: -0.090744584250388 -1080 719.90925541575 0 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentFiles:/Users/luisjcamargo/Desktop/quantum/qutip.png %%+/Users/luisjcamargo/Desktop/quantum/qutipcorp.png %AI5_FileFormat 14.0 %AI12_BuildNumber: 66 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -1080 720 0 %AI3_TemplateBox: 960.5 -540.5 960.5 -540.5 %AI3_TileBox: 72 -896 648 -162 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 4 %AI9_OpenToView: -958 154 0.57784830121388 1428 799 18 0 0 6 45 0 0 0 1 1 0 1 1 0 0 %AI5_OpenViewLayers: 7773 %%PageOrigin:560 -840 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 20 0 obj <>stream +%AI24_ZStandard_Data(/Xd & < m " "H7D\;B( pz<@RJict| T fw6aCG=VfڱX*24eLeOEKd + YԝI(m۱8G!\]ߣW7M=}4:2*T,)*zN Z 9Hɰ~CtܡGcX4p`Ip4KLIޝ=*=Ihxd4&.HOIcX@؄|$Kdр(Di,nK rbw8O(?(LƄ`Qz< ǚ:bkp, AzUˆd!gŶY`4b.Y(=T**2SRZj"$q -R TWI#q% GRwٙ1Dww.ֱx`0NG9Α qa|< 1BrH`$oXGh [,XM*2cbɂndgH DɓM4Kp4I>2YM@GҰkl=-5JP<#jbc$\5,rFa |)Um :%*% MR\ZUL{=2^:_5TG&,l#c-+F&Ck }HH8D"0DDDMCvsҽ[$ݬC4NP!ӽYyC?9qn~$LZ̴:M֧]egҵCektJ*H9/x@9p|X46F&PJtHeOpBIbp@lH bLF''b ad)G9 +Ұ#Y<YB#!5;H?j,18qE]mѠG:@5nt6H +PbУȎ??vw C\HA.(fWȅg%78$fH7s59U$8:j I,3^9B4̼\r^ɼLJL=PtdUA}.jaMaY-l6ƴW4L=u*kL/O[mx2^䚲<.4B|>mV͹4yvT4L>]x/gצ<5fG#DV6y#jwmV홓pIOteцTN9eKPj^Zo/mUk׉tgu 7Kso/Z;?ͤ2ο[ӼT[}l3-(s/'S_GG +w[%w2ԹlzE]~j|F[a͝g=kV,j6qkV鍬s͜}閾jm{x$"}ΪB›gzuWZo7>Pt֟<]-F6.vIgTXtI+9o8cW6~Wv}ٻO^.Yki# ZAS:W):o肇YuQ*şs/y=[]w.Or3]2g3 ʩyy;D9Veѯ1UA"ĒYw))~&ܽcMQ+ՄҤzR3ܺLHr6c}Dge4i新(g(* 5QsFjb>eK8R]I,Ҽ&faF ^*ƲĪ;lUm直SV䚲*S/?r2|YkO& _;?*Ts/Q>*SwIT7}T5ςg!QA~cUW;t?rNoz^XkD:nҴ</gU˟Min-wj Z޺6v~vKYztz\IIi핣R/']4o7[k-Zj[{57;O-Sϥ9\XΗKnPoTKپ^gOIGՒ4̆в]6HHAb!Rq@ba ,PP w⫚j(6yUؕ´j]֮u*yZ^H@A"@x#G=P:̑G$N$J6EHB% RA越-eh)9dVYU(qb;ңٹsYƧ.}eWjڥF.pT9;Z+U'- +x+o,Yt:RZ1WCu3'&Ovy*R|]kҜU ϴtnuV[W]ݮgIuS(շZYeVѐE-󐕲\̵̤گ6[jDvݛmʹ kӕg%^W"^}p|e?*w!Z2l(˚07wXseffk|F͖fku5YURf{vH3I?hYҳꆰuiWvϒR4٥6w%H+ggzs2]tK*:fɻ'E%\ڱc]2K_کokYn.ژk=aދEYJc5_Шl0˵*8oJ9u+J{G"%ŢkخŲ]= vJS\ݩ,fJM],[OϚ&~Xq6gEFwUcJūiyxIc{SWlq1+Bee&gz;u<1͎\"+s'؈j?ge}iƱ*sZ)x;yl[ٜ٬_:|hҴiTse*[WQ[K}}1ISJsZ/rCs2;ĵݣTRXck{K~챴\i,K:*Oh6_Cʪ<6:Ox55ByBT)-Lk9Z^s*~FWM6Wu2uOmՒVfi=UIJYhM:K,Mbx#oejެhrw +TSrעXE]k,rn,RXQ-tעIWR;^L_zR!=;!~VHd);O[DCZ_қCZ>)g!R^n&k$=%rFxw}yPzx:*ɇ5QMޜ[|'RK,ۤmxqWv4޾̵"J]/G/tW=:nY䗢+j6)i o;7Qڤ{CRn)-n8KB$C,wPttPi8zYMzѵsݙΐ|x5fi^%_xB4oY86i&~pw6UZTm?z['::iMTQ)u4*!fRqCөRrKҺ-l:Itů~uFCt2eeΓupon8ENҩ-ӖNdyDwSyy>"u1x#4ʓ'qS/&tUmQWc[{kUWc~V ״eZmuaa-G۵x7jjӺުMmxsHݛ}rEt/N)ab5`^)vJR|m,?F!j]=FWNz񫗃 T7+=-NV޸=eZU3Lj8 -6dvVrndXMo =ߵ,Md+3T9{z*TV<:t/t՛^.^-Es5D:]-_ц#^ykƫM㢗n kl6_Κ+j:-OW/O{qʊ.Ou5;=潩*jhm(oWUº3VV{>t|kR\lG5Ś+V*-U+ׇw$UͪwR勐n-x+3~{7beQ2ceNgu4 i˂GfGJ$1˭NiTےvxwe钗KҥY^WQaYcYt׷TJ5􄥧ˬ-ZI޺)+;vHx4_ZQR2,Cyݤfj劄kcVK/VW_beF]VQDʼT3<̛mYwydu[K:U]V;%7}6*2K,VWa1Tv_vYriT%OMEyZ9:}suWע̼߲r2Ҳ\u:SUNihmiK:vH;wXJSu7͛`fN)n()^erJR"JCͳwXK u/S˻D*VK4fE(+oSM+z31w}E4Wb9qnƊZ{Ts.5ӆc(wɦҊSFk^/?Y>DL۸,hb{h6nSMj[-ZOGYۧK'{tԮ*Zr^OWo;Z%Yϕ>ǖֻeَn>!Yvd5y;,TEC|*vۮu69e}τfti:6HUk525 +cxHF{_uʺTֽhwnRTW~J 7-q/̱:ݲkeOѾi6wr|ܛmmUkwv{%so{'ҎbfcW'%m)S)dZU"U dR#qU"ڲVҢNe1ťC^Y7mR]EyGMrwQYw7o-MOtIlzJj%ލSϳ{ﮬ/~t_tR})yw]-(lun_TIS33im:=.KɧG.%]t*$aBCÂ@x@H`6ATd+ZRnMQM7U5v;TmUma]4Vu۴ڧ]\ǒH+HUN!zW)unI]vtnQm_b'if=QM֣LTSݤ,V-,6/bZ'OhQm[w]Lͭ,)i]nQmFFyxW%D[Rm,o)SrEʴḁlV|J;<-s/4ór2Dճicme4MB~Mabyfwsk[3|pnsh+3խoV'+ץ0 mT&! _i:xmTSICu2J5gOSƴCtiҤUVPGd?_1TeUuUVQo knΖ +V;*ݷ~z{JwVkj,)a^Q +t3%=$Ef$4CJ,tTF*tJV7 «BV݈ȐNt7٥qtK4L<+H[ݣ}[g؍:4z:Us*GuV8DZ7h6[ŽLhV^Rm<%+xMX܂eқ']lo8Xv8D弉cJ<x4nԷiW3m>BoH}JM(wٶ%C5nZIokSnv&mψʻHkWZZ49kw1m8[uEԫbNqݴ +nhդCigIODz. 4LPc +!0@4 aX~B^6GL1!`&MM\89WW#Jd%7B[(mSZ>GD89W;Q,F6 )Ge4cC7'KBĀ6?+D-.(" E&cZ3-[u+Kid,,tҁ硸6_KjAB€<y*h}뛻5z@&A; 6 *ɧC$1J@+X}BX!xʪ,T]yİZþ^PC7lCU[2}|TDU,bg޳"ln!$mOMs/PF Z`^\^6unk l0t0vҀ/vWc;MBid| %H- P /̝ \ .0z`&S B.$W2;bm:1J v[rcX3(\O !2.!۵fBU&HH%VCЫ\Ss+i=K=G[D9q KY P^D {G鹸@1ʭrVRy$'5,( J1:]F44EGlDgw;5ϳ/9$R&-"wrIP +hp~E06(yZ]~6R˥Й+P5f𱺌w2T;?CHx!͚xGc4zSoJKm>8!;"'V&%D8y[V<Ⱥ>'z:5fvgDkH=?fo5&QʾԱBO`PM,#Qf%EWa n/S-b{UO'M$ZtpO}L +[*:tмX&}PTReL$f|!bh(.=P󊃗tZsc.0[xد Ij5ySm'd`iaAzVjw3k:_ljs&xf + ij6jiAG[&X)~#&YXƎ-\e`QpZ]cn4:+VwQÌo3‰F{_b#y^%?ac\MeK顰t*  L ^'Ζ! d}|ͥ>p&{XQjnm$.j87;B~m>P` ZOۍ+)y9ަ~b/ gHj@tb阍\\xd)Br"I'`§Iq8w⮈+fj{3A' \.rnx* ߬2gll҉jSY%"&F/HKe3 -}qi 1kXߓ kdEB(GN<`.eAvIBQ#Pܗ:< Ҍ`b3/`\P>0CR6<4 +4n +%#+.S~D+V'TYc/SLԒdVa6`葕 ~I.:D4`N$A: MM>7k{i&)o7?9:5f ^thV|H$Fإs&bDŽ{sVtܶlMhFz4d,0GLkrilk)hX%CJZ!] SzbD2nĖ brwN$jbPX&>X}!Kl3"d(/#5ұu<$xSF'P7. #F[x|aA F!N +Rqq~lhܙ.gLNx^/@E+j+bG0&i,=ڻ\D?EYK`%܆Hw; p`$P?C -EL eu+fa5u# +HgK7f-pyZ|'8H2]r )vl<9ptn^T] +&Q{ݽi|VjuJFvphf!G gnJ*M:t0-Ϙܤ\)\(ͷ*8z-KcQES`nEZRj Mڧc_AKdjG{JB_ηF]^<v5iԕqHN'u!rA)bũ1@TV;%H8"=<0Aj!#ѕɃ1"Pj+p~CڅPf< Xh DP=]-k cA*XGa9ƣrP|2Q!8Ӏn%r9±vFk}F#i^ak1Ujhc*.rk#!MI; S&T> rx_U$Iw6",k>=B;Tba%xs.1n*v0uCm-,g@}ZW]ZYþ%?#+􏓏\I! :=$4c'S`? FB9W44NmbnI@cŵP8xkHhi-ȥv*X΢dtFc^m"k d3J0ieANsKjHuqi1iH0s@t +:c +L#~f&Q/Л#mK~)d,;c$=ى*Rjb¨6yEff +{[,;+XڂDH,u>hgcҩMW=wUB pY3>z aW~d-C~?j4SL{ "lUZF >:ȨB J=޽RLr(?οk'/ZvՌ86qD,mѡ[ ج2.@(tZ0W#ܑL@EK]A.#Ǧ{uvEv[jk-0LUJiߛ|MqF4}]RETY +!RN7N |C<]VN-IvU-ic" XK~?<hJ*DGUF[h9W6FF,Uј $ ,O΃|@~Fp[i&I%d!z@FPJaΔ"k9bƹ jI)_h6ox;Gd c u*I]s)I}QIWEy?F nk܆NZd٭Vuj"B%o4 nu/+yܭ䑄kX%GRcʃfT?N0VAMk ]6D,JPY(7g9XO$%]ӭwp52KdJ,yXyHOSF';}\6#Z4,z㊾q-tW}ģ3אdRJ,qЮɭ a,$#T^DΌ""3@k%v%YI9Yjވx) ʗ_ZQ4GyZ~PCdDU1SxVXW3CW4-4™jn;f^aZ ;Q5`*;J +L,XTӆbI!I;(k&J{e.63gZU!4&Ll%`WFlRfEK-EW//IOϰxskBJ8Z]8Ҟs.p~Ѵt4`(`뼫Do/~] \>c,Yt3 xb[}<8$lWT+huDz3 ށ睉\dvrnF0%zfacH[T|4!ː2%k<F24!DcIF Oj5mǜIy|JK$͍{zҋ3܃MhDjޠӮg4-en p(h{g ]Bn/ov6}g5 +95%yBmѣMN!E$Q\1HǬAFsC:(9HRK\["h+%64=Icp/wWg[Za]Zl"|VN?5wv֗KBէYz4w", <:BSy买*Mv ePtKw6ޤ&*Ȟv^1%L"%|V(g E7{6EFW޴eNPʝՑw2!,2ov>cy+fGi_qt+A3%0]x|#j6!8оdlŴGYRD?%VBG%b3x ^\i&KJ--xߴmT#R:ڒ̿IU!JX7&2z˂v=dO -Z~ݛ[3{")s5 ME}: I ʂ2oCq +i-҃_eE|IJ{+BٯJ"Z|~3D+I2N;D =**uBbKX#XI2mQPdS“υl2f nS9Hq7{ eRv|\_9[%~umڷ1 -EZXߘa][LV/y3jx>. T+A*Y0uFD4F9D{ber4|E}ꂩO% ^=bg)'@* qؘH? +Tb GJaxʚ!S|hfKS1v7Z+~6fd7?-^q ;Xӵh[zwAE;ȴ=Uxz/$ΰ^$) +ruȝ1K\|`yc/EP~rǶ@¤T8hapAX#ɻ8Op,n`J'~#4%ycD2" ~%etTW Y0z%QHn&NȓQP:_ؤc{\p~dN+R򅂜'؏HX1,:˪iޢвK%ujZ؞--mF ~[z&7.WƝt9n%=ˎ +uH//̵ +6S0kDcPT;z#5ZJ2 -y,2cS1NO+Д.;IUuOLH{5~ Vk0pK28peb >!@>X6Aa\y1)Q &{ʠߍ.Z{PWG,+IqEZ,e37?3 E\_7g tYy>L3EUAh<5q,RuJUM EQsi/LlմjaE{'[[#-D!`Dz}RVwmէx9N_>B&TM-* .S`V*f'8*HpBZ'#iĽBL_b#o]<_JY}N p)idAJ>ܖPPM˹A;Nf,Ԇvc{CG1P^LΧ|N$X1l*߯}R*h 4;N[茰6ORG/vBFA`zKH AP b@J x TfKE&|L@ ڄP%qBU0oO|, mDO>v>?(ɈODsZ@%ٳd>G> =w M(yQpQ>=P ُ' J4M4I 0 $&@*gI*9$Ha0jaⷄOϔeS~n*0:bh^LȩO ZuM@u2}ɒ~K# }9~q'1 ?daM.r)eYי $]!b(7lDn4o[>`hP~@(h̲3s:j8҈ѝN6+(t8ֹIӁQ6 ԹbV3tQ < +ERxo-u(t3uЁ~^H !'_`:)-Jth:Jhf!Q&°UgNKn};pwj4ʚ rTuV 14\㝹H};C8!䢹 ) EjM5jB<ݸ4)8|\KXQ?P~jLJ=8kh9NmQ|ckj86 uίh18ݵ.V0uG `XNPca8+8=S枸C%lG4?03[w"oh}Az!PVΆ ZќqL$+8]А_/q]v Z]y0cL̅ޜۨ `I=.aw=jߢ( +*-"j_z-BeKU[Aε'ERNJAOi@K hb*^0Q)>p|_3Iѥ=9dܕQF;7BWƕZ!cWygCj]c58 ׀k4;IyY 2k /Z23X:1Gv7b +1 3_`kPʩ2+nL ["ώ H +h#oQGBC,w %ŜR=fC2P,{r鯸6n4L⨞}aQrPhtE/s +o,-&|Oqcc[BOH"@@Y 3R L 5fO$eXByo۬|(=S EWhJVR%?tR4LCjw ,c$y3NyMV򧓌6taNt"9 ֜Ј@T +Cws5r IhJ#\uYpȰj1 fe# zXjNF.0 pcbD_ɪ5.W Fgz ݿx?;S&k)reg*_eA ZUG굕)(<%HD+؄L,G\+Sgp5xF"t$` ޔai3}.X&4i\8.qNJLCAȝ|p1 ,Xf|{4J~΁a=϶UMm-mӮ1-Կc9.24^/?z-ԊBRjLEfHrm#4_ FY#KUJV $$8<ּӄ"x--DN +_oD}Pq+YM665FL,ҡohh +:~^xW+'^V5# !0CUhU-nl "@Yl`-oPbT]Q~B'T:)`ȤGdMgbJ=xd&1%r=VGHm6P&& #yHGǀ +{y^epխ Y'SpP|qt*jd0:m=}{KP%/. +,)o=+!QS61]nr\7]9ޥ4*qFxl|7 +9 krb'9z9.-9QW + 9o7׸gay`ٶvP̯1# +L(uwv]X>|a]X <z>:4*î2mh4@,L{\fISN3 ?1Hg}>/X9.AfIQ±X]`u9@EqaFbQڰOIӤTaUсw,|wd"@FbĬYR('FddI`-qbvLz՟tM1Xa5 hji')2?b2&,kKBIGե-%-^Lc)ܬ$?(8RhG O:.6j6i6Դ${2?$UU}]K4:tM=JԯqRG46mK{FiE|:2"ioXm+jsKI2 nEK@UD@$ws:# D%mB}Z6M*$1K*bp>- )=t +0/rFB=Ƌf~S|@!Uw +5ڋ:$[ ^<'Skj`*Q逳øS6D An*C\ֳƾ%/P^6@s ӦF0,cE}wvjrZY5I`[m"4: e~V`DrZ>kMXD`3L %y.xp[L_T:vkÊpM?~Zvj(8fQ)@L {џ ,ArQ[e Fmbe3 5 KVV֪ +MY|une5 [nA>no/<"t TW%qLE_5DЕ-L芿  JƓTneݤ8Vv +>rb%q-}U<[eХ,Ӯ r[xu9'4m?AK$~ Sd&.0v]2R>sƬN e~x:IКk^%VÎX1DVKS;̻ok!^uu\5_.S1t;u[`ο.GPm'AذSLFʹdHrA'(B+™4e (rXN;-"`p$8L8Z$ +u_d֫D4 qz+澸`XM@ꅍK%Tq֡́vrCd/Gn}#Oٴ6P#}'!6|yZ1 +HN@-$7ܑs=+3> Ϩ+@MHA]uybAtM:~JEKZv-}%XKSX#,u& W3޻!tSa!FxG'[Yĝ1AԤ+]{d5ͮ"{gV(娜 mD'oO(=Eݓelsl<^S4Xz^DV+5"/S7VLŰw!Ɵec=G^ +3]z0Ä ~ĂTGNξ)a4`5ԋf^`Q.uhRGXѷk F-\%둘釘l+] Lv^ INe +.X/%W̸X2fr-ʠ.KW~0,Q[<U.F#(#ͫtϩygݗ0-"xG$IfDh)Y᠉Gw"k;4m,AuIAmJ]6bDSq+HxG$_h^n@n6"Nt{%z4?TE]Z;p8BTǩ989/'cS#)ݱ C +SOźLAbۻ_:_;KǁOjU4:*SPX2X! 4 d9TmF.ʶ7n*Z=[{DUCZ%3>?l?Z6Ńb, os!e!\BOz`R??IIb0-FT*@  Wr3(T{o&/ "?"I"0߿7U!DKՏsX@wVԼj 6É0zS !X_ׇTıG4;̏ Td:zbDㄙ/ _sQK@!"W3%L76UULZʺP:/~f#l/'K= }P[~[1ߦ,p6.M+ń9_KQ#f6pCFVdITy FNs1i+?*JUR?9 @>b3w,汣#[ D؎EFXV(&]OriEj& ]+S[n]kCcףnׯ>q5EgON)*7FP47Uʐz3SV{L1NϑFsVt"/?3g|Dp3*54)03TJC(ʢ|QK +)zl`HGBJZ< +- 7aCbo[i*+AleᲲCiJY9*ٕL8uT`ϱb=4 +ᘦM "| -FѼѦtm$I+^:7X!D0 t=gJlEJF89FSp6vUhÒhz(H(T)XUgxqPrgK +"'yi4% Фj[\W!oX^z=ll[K*N`@@E^suLGVg'+[jSH#J1qbW"G/g91耆̐7=,p}W|uf}1LNƻ diQݳR]w4 nT13ѬX1oE;Փr_uNb;!&%_= AP 'U1l&.ҟu/=o <)50?tce=u{oĹ'xOʐ!e@dqwdg% CZ<51h`6WI=Ml hTgyL[-ϐ(ݞ+gRx\5˯`~APp 0з6A&YҤaNu *YJzf%y/[YE~q+V{*6&"_/WjUvN9Egy룥Q&LVK6!' +ʦy,*%*HvH!Eʠ)'31C Tr9ujY%fВW>оZMgGz-ƛRPW"vd YAyG0z'LIw@Y)%,(O?GzX7;S 1s,kCIN¾W^d>jPJ2&r&IW YROϩZs8fb>&lmޙW2-4T3,bQǍufnҰqwl=qϫ4\cΆrZb EYMWpt(=* q%k$Tk&uq vMCYfU:YҮ{)+^^ 8{w&ohKS9 XvJqa2՜1rv[sE(麪fdIGƮ[MSNGQr,!Og3 d#Lovnc3pEϻKd ,TJq 9hЬO0R?0]^'(]b+O4"NaIXi'ֆ a(7qX˽C )>(@@\_Jj*?u3FFNNf bt"(TSCd*ԲYGלE$ZǨbGִvlS纮&)M?Y`7I!yX\†]|.R^]K),d2e熄nAn<zD\đj!fӮHw)רI'HE/vSW~lʼ޹C[Oy3O2U;%P b`3U# + inF+*ʝ@Y҄JM wQ =YICN WM$śnc^Uܡ:KX=w.Q- ^%'_7,ZЈֲ#* `|q7Z3Sb|5cf;]$%h灌 ccQ,0ѢU$y`]eejd|@i_@\VǑ2r{@% $H%Ag4L,E2 |/euOQ,D+O}&_o HxxpABA`edG|㥽>'9&lOۛIڣTf{wؖˀ?Pt\#l`GZTЁz5JRZFʏ'UR/b:k$-ɣ +X\9_ahZz.ˌe䋻,&%SziZP9K~$t</W.px-S)ѡ '겠.y^xabF*Aq$t))#qJˍaʵRz)zaJ~h +\ Y`;Fa2o m^F F{o-hY^(\Ȑbx\+p +2wChDuL0| _%*-`0I|gпp NXb1a>9_fKEa" zUD/mh^"^y9ZYL5)\9=zn1g?:)C%C[%ya /%[Uj}ƭO1d1, +]0b0H\oFAF(v5$9@AßB+ +M,df% &cMb keFK-"@ZIGZ(Ȣ[9YQFd)"j?B]z$*q+fb3Fg>ND ^Z3cOapVj"Nm_rD^[ G4kVCE!5$\,b,gA#օVMJ$C1d&a +( @6&O|?@ (qG`ӈ!BA4@+֟0‰vjB{{ȍ L*{.fp-P[ +^^qUj)Z|xM$Q)5AOuU1{ [w>Mo+,dx3$`6'`W[ؚtWIk/asm=I:+.5Q݊WUMBu%عB#ҢJ5S2|`QV6P,-=~)PtEBzO$,&rWHpA8Pm=~.iysvأ$ѣ~T.\aL¿8@$ hi@3`j1i3157̃s<%)DG)]{W⬈.,g|Ӗd >5\N'jM06qS޾GEsQ+G"GH Čq>q+Fh$k%FhPcA(ZP=4}[U :F.c!CFkH +)zcCL;07˴(.Z׷@fnY:y~`Dhg)Z])*u +\T^>3y#/ ㈒f&$C @zL d`bly\Y -@]d, 냀Di4d[b+ExwV +$A@mAV O ø2yV8Z[IC4&ĻykD hsRFNTMoӈ24{;?=7OV~ـc@~3C'g#^IyJOћzPQ+y'8ϥӏһʏN5Gk[jvqxxU̡R~Z3f̨d S7=\*Ăʢ5J(RVe>*i>PXS=,HT `Vwngu}%-Oܹ+گ!Qt.]4jE5 ֽ/iN{JBy RpJ +n}H +yqrR!8D}C6` }͑V_P84z@Æ?qD[sh A}@E(숁wa(,[M(S:N^M\l>Sfd5\1[e2\m 4SJhiwxx{4>NT#t+4*`3Hx݉P'8A1e:**D@Z5E +RΏ[UR4׉_olt8SY\ums\-N]W7&p("Ct!HAHpp¼´ w,VcFk}z`;$T$㬌. ”$6:l6 +LtԵRbV.zB8*a;A*4Al5L q=D\d73>~G>CK>> C{G=l@<9S:wxyRn\mX;_*˗Ŕ=KW -TQ! + ZD|+šV13~ѶMhАQ1Jċ䠱bJIhcn7inQ-;-Q^i#6/?J,鱽5(@3lRQĽh]*]b/k6 qAg9vH̺{@$v1yрdM~;C3 +i֓O@ д@WרlnSLNFccetSPc}={أuY1P^WQo5vdX%Ms*<`6Ot3ON>I}YPfd=}Mc,`j} T!pID#8iue)?TG==]+k4|󀘟:mu?mg'nȑs Ynp%W(qu&m^6# Q8Ϛ,Y̞e\:cưAV``cjYANj®=#rBZuf&_r3] 2Jn^kf?`~ ƧH.^F;_oh"$~fD@[0,[y7N^]NHz>dɩqY[sF۠IsU +]wRՁ-/ԙы!t8Idk9]TC&*x~pV % + 2tl\B=Ӂ!t#x]vAeũk=esۘKyVJ4a`^#fGƕǴ58D$$ݞup{Se޻ SO>Xp U1Eib}Gik>=;j,癁˺磮mԔ GΣN vʑn4$P#@:YqT^7`% ]"QyQΩ\sа7xr-fnF0[ +Ô Z +^`"ۨ kFB)k'0)P$Y4ި`iWpĿA%aˡ\ZpVAH@⻈aT?‡ڄnSIK@q A8TPd[b&z3;M`!18@q*aZ֬JPqR^*5c +vQ|"8&`Ǒ]iE}'ғ^TO^ w_u+s&#`J,p&+nd1_r{Xtc(FGCKH)$pu=Mz 8}𽰅j"m$Z&?$/rS)v=8j6K|X#:ݜTSTĦDoHq(A1wXdjB/xl2%Lf ŷ)dd"A#aG3@I +9YV:+~;!-R >m7.c-?d`?z{,UP $4kiL EW9RʔdJ%~ +O952 qojBj^ޅ AP,Ols;a]'!2O37'r1ɄdF*bTV RiƄ/'LtJL?F^,V43/L*NAF"h nriٜ v> <_ho=C~yUM$L!HAcCPg#: +CEPmb\h+U:4dǟh`5duJf"5*(dƲ6$g*NxL&191NPTxwOzdFhf4"ʏIQz5dž^ iITì%.2f}աm&v:fckIt{Q8/ֆ"wD1klo30q3[F4JrYI7PS+:2X~;G)L7#'WhQв<ZU9V(b-SV "bRCiaST"PWpKKJΦͶ ޺:XEMgQmELk;JLE#jsnPbGFE *7/C3Pxx7]ӗ<%>ꊤu1rW#P MYIZeY!D~5M`^0%H9Q+TjcBtHA!IX"B4(L"cjxh\^wz抋]8h"Tܭ h5Mi'BfMNyr[_ +Uy%. vɽoWAO>B}rIS诉׾u3OQPE;Adӯu:bz1bE-H[C ; MI+ģUBFB7-QĻ _pڔz{PY\̬1GQHVBBeH8P(0BI?&CLS?ɌJ*j90M Vh]6SDBT=)ˆ!jSCDUR[VaEpX8EV ۶XDF0Աp"8BTBImxChCD(F=adq0yYf *K ժ*ZU )R u"7jeL*anwqxBQ9 ,3=+.x4EZmVpJ=TCqT8ϝyCitцTCNMooUQT"U-HWt31#YḶ{tE%ix(bĕraQL4Nt*R/ +ċ[VMc6xq;&WsMh/+kGPGF|Kp7:% }F3UNjoֺ+$_2Ȅ:lȫ; EQbiF2"bdrSWղCQ.Ɩaq*WG`cb80DP5Df8I1 +BRUUUUPE2v{,R +*b&c:ayh6ۈQvOyDzV2;9Ozlˇ>a< XA<#A,v)2}AkdJ6~òsjB/PyS> Z|1D!զ$V4"?de*ʤ-խln: =aImQLSN-}T1-%!4/݅#M &Bd1R 8sSHTbdJz2ZR$cM:~*+j2?ZJ1mN D!א욎|fMrr"4$(nNEtz JwE3RO'~cȜ?D cto>˟Ͽ ~dJc㒮Jt,CH\_OiTG !{7~'9COf͘tYP^zEgtb@*l3Q"ƹh2"g-۪:2'苈fvٌ嵒Fa҅$2ujRrų۶Do+$IRRǥX2",%AEj<ұF6q0 2XP5*暉!32-7'olF%4G*԰fo*:Lȳ26 '= Ɏ+!Dkk>5n#i,N8EҨN #퀀ŭnClS<I©%'Wa9S+ G1T*iedh A-CBCPԄ_'~9Os 4'6А(2h4YiX@Vcnϰ!o mNNr>CGu>aӑͷ1I K S|H4Q +D)PyZBLH%#P`?^N&tA)` v V8+\pƝJ;J §(a8-jؐ0q2F Q ~Ǔ al8s.N|OCaƮ~ ̄PU8IDx +"-PĖH Q (= #[N8x b"o ,3%":CZl-HQB .'x*ڋT8UhCi(6WXujEĄFńF;h $$ &"8"8ExLEhG +BRED[v^`sYJ;("n(퀁@^Idҧ|$9l2;$h0 +gQf>{;(z FԫHf\QGBDDk {Qe`E"zj mIms(|fjUmݙb MWREăk|iA "64KhQ4=ȑLo3Ch H;X0Hx\0L(w *yCI; HJA T0r;f TRa.`H7 !e`e<=OQ0ff&CÅcGقχ($JgDGVS o&|P2Hዄ^sW:;X@vH,%V=8\s' M(bLg&Nd0PqkWe"̹s!d.f)~+ف Jx' +a>3LTI$@u!&ݺ`@ +Cz|6BCBA( +$!/"ӪShc|Hwqt`c/c [򁄪mH6bʥ#>< +į4}*8?LosRҐ(1?Բ78pY^!Dti`#jh +Dӄ3~CIWNXJ_)nLIIhs8 F:- ,Wh6%HTMd&tطA6,eb x\3s˵(#٧y- Z b K#_i >N$xT!M2w5粥&CKm?HEǓ@׽q@ɍ/S5UcH38z#u5{b@\@{\Ȼ,o@P}Lup}&WHZšFRw}d^u tk.|3TJ\I "$gSlfP0| +A9jݸ I֨NJDBPᗤ2@$@J\ y{B>8:<0k- pXsڟxB0QK}Hbu]M ]N`mżɯD(tJ0|>Ġel~Jnu U-H(Cfm JxPuR(Wjq B ʲ/]gYkQQAn+,? OYr}9a8nRCF#>GأgL|Z:LXX+e:B(3|zs Af+i6\A搜3,w90+{t0.9.ۢ!A~so;Ǥ[**ό7}&,f[KV%ʹKa ڒs{2Db̊ÉS(jh8՛ߎf7kl6nQyA1(/bۻ _Ln_V;E}‰@ mucvO`S@l#L >L2 33tgb*@4c?BnP7>+VO5{Ho1n e,$}04+4E(}wjZ[#!ܞYZ\"]VH6\̠&`D[jʿ$zQ-`z÷2%3XG +,NVѓjs`9g^'W*Ɵ"70g"7k2Az`X”MfStb%&_E|M>b9r`e+Yl؅xa{{55m,pD༢K=$ʇh# kCDϔ%O&@{ +i?2dlܱn( g;ߧnF|mƒ@XL5*>FH֛X6tK'f~m]c'/0&IISRfq +͇:)5(O)3Zm#HX lt .fS=5Sd8=faˣ!x!g\qjsaJ7=U5 X{ktU>Nh hA)Ί2 ̔oza}J _拏Xm2qpWZF;9rqa֖0(8ι;%\df ^S;-~')c0^TUEۇY%u,) @{v|޸O^F}aop̟DL1ͻN@ p=Ʀ_`upډ9L {fy~gI$:q@`XORba"T~1+UX J'Sp!Re )쒷jsd ЗG K%&c4'H-h3yC/ +@ \hqz%w0Bk~&DeXXHWnD/=IA Dgz-UҞ &Ltu)EŐ\"{ކ5tLzFD$z< ePZczF2]B+}_RXl>v>{i +VnhDE l1 H^U^&!)H2wicA˚@+i$k~JzA"c;H\`/h&Ӥ]HhHShiY^R-%t(j`"덼z:b ols <T%g@9n&eFGeOt5p~*F~Íht!+sD.Ƹ lk +ɑFoc`65ѕE[ܭ'[sh9 {7g&fJO4QpY t>Z;%#\ʼn;_G+ٴph 65Hʫ"B%<93;+]*YA8N9NH?@Q*JgaKvg4`"lz"Hf5[f<- t̾oU4'J\ф3=KްBR>$+Zp)#a䴜\2pt:Ud7p_ +3 +7>ItIS!\`h#cq6>v?:TDrA M .ㇹ1fѹfEc Epcf0F2{6ҥ_1ZV|9mٟ(>nu ·v WJtᲿԑ3+̦Rl3f'p!7PܥfGg"lG|۟]oO%ϼ d0}xEs i2_9AT+b=Vs0V[n.,J1.T0Fo*OHjt)>D

lzu0ar?Ri3-T$~=ovmseSD!BmᯨZjz7WO N{G) FҔefĠImBnsPQE/Nb;lW4r|NrYR%o2^s|,I>!ZEtT!8MDFSLJTAU2I$ 7]QMDZ MلM&ldƅ j`怉 ecx7/KoOئi0YMtMTsKm;getND4PheA+$>)Pu{c<'!A> sL@i:Y +6sP&aIyjo+q\8&VXVW-wBBKSw~nyYe=Y +>^V#9(C + [r0LMթD?*:D Q [Z:a@/U ˠ"0a)/wG\'CC㭰'4i)W#x#s5MEt׳qcAV2<&$kۼ.}LC*ZI9Ab8QOqY 1P4v!}@E~}=F2R5;ڴM\'d)t( W'dD{WX@,zmWe'~S)3J )0ƒ%3}BdYcc)c<^kHZhO/F.}=i ؖ7T DrerF  MhpEf]xR䮔Xɤ| +h"9_^K/{2_N Y+C+3ks3K0w%Gvy[= C+UjG.YyC &h&HysU%}섘4r +7\cI&h[3>9/k4ҳFI-8j%[d^X"aD ,"tgN 0iU_\4ha<?;g| >9?{ԋW7|K+N쯾*HCK܍8py&$GFGgitz_$8<Wiwc ['D,| 3|HEَ&ʞn"a#aqhF@ [@xtlH񔗊x1&WzT=L`(|{{:G4(w[ +=pWO,T|J]B2pAU30C.@ϰ@0U<Q{+)[Kt~թck += mf\k9Hl9}~W PJlZC%H񌭠@TU 3[ ԭڕ\Gg1<ݩQ()|:4Qx~e6.~JdC(;I<@(fe7wI؂T nU T=y %q'zHJCB d ~>rt]4S:.蔵CTҽ,Ef9NeU+VG*n!zR/KaP$pÁ @ <)PD9T3|9':RHdh:TABHmCGd/"dØgp>HPk<`QaPH?!^iC@D|HCN{e,!?C!^?H!}g9ļ}@!?D7$HƆ15>C`Tew5 qEP| +D˵T"d=v"$!|$K p"{n K$!`#$\"s헕C !SG\;Hg'T#paoO;tY[ @lq ҁ L`!p:_$QmA^'y&P)EO%"D9WBĂbrK`IE@pSn4Ld*]ȔbdLTie" HiY(M`MLh(@D" WN`@bӉ ûH?<ϒ'&?nO?G>2Np(?&(@3]$ QT/o-(PR8~bȸ2EMxڰo +jx +@EPEE,ݤB||8N;#I>*GV>sdE|VOيݣ{+r@f^!X@e` +}X둝 ; +Y * ԃ4uzĝEc9B/zV=L "T-p33[d hvf(4A7 6ۑ=V" AhX)J0cOհc0})ChjA:P4Q U!CXk:KƔ#e#)Le2:d.#XnfsP͈n|<#;a>Q(5Hsahqa9@hr&| Ft#K,rsAFbc/q(52:m5c!ddֶNk$Q`CCG \Y8lI8zvߴ1oژPpn#n$7FƐnHgF{㊬z2o捾G|݀@F/u-S8?u8>g87/ 5q|Z46SJFˑ@+sҗѵI+)Qå?_T5%@tZk -ը:"CXAYʾO592F_9[Nj45x6>#F{#5biR4PuE-6Jø#ix2h9"Ns9Fa ?, ̙#y9X*7])ӝKuƈrlSҒKfXK<J-9f:EʌJo>q.eYee +2u ꪌC SWI(#>'Cta2OVd$<8XVdl &>] C{4dxc˙1Ut#O.F6bb ,1ՍHb`|LKLs!GF0?{,}I Y]# Q#q4-^ǡ`@CXhj 2&"KH^)%"5EXBsjP d/{b@FGC?9%Qx5qx)ZwrW% +ؒ9, ,H$9X<_Prx(fz g^-ËX*ȸv!JZvkϑ⺈KO]D{J8EA,@|'\ @(n( + +D6D> /T;xC'2Nw'@ىEn4tŜT 9Ra8M(t!GOք&wtEGwV!GNځfT3L!#"XdJa)GLD 7!Y{dr uHn @(Z",%\-=$ҤJP_U" e̔!%Hg(a"d$ft_({$4Hɒ(=#eHD]# GHFdE"O)ԐȪ#$B")bݝ/ Tv=a@L@G p9G=c$n4FCFp7H-#n5G"B%[G0HQzEZy~R@+H=)l$"Ai"v p%"}$!F%?DZADoLr]Cl|=Dy$gI8D; PҢ! +Ɣ䙇Jh$Jb+D^I"`U,I@t;KIגLD!f:tI1K4fD} +wc L0%b""vN@m('#x $$w&h~iI?pakdRMqM+8Rl0 I8 +V{.:`IyT;=T=N"~v=pԭ$CU,RD%߬;.r'@Ĉeh[O(b2xw0z;wp'ɲK}qݡۉ~'Գ!; 3vn'x::uX50Fw wšϡ@Dsc9c>"j9PPP ǡ(k>hwbC ;pI<$h2` i7 : Խ߆qݶa9AYd =`l`Ȇ|ذ#נ*55*'XJM9G5ב~q6 qrd߆(Nfdrr=IJpK:" uYwݰlc߉w ݫ{N1'y"aDj' 1|z?5(?~.z@?ߠDjP E,h@P".?׏ %P`5߇z(48 p^CC7m}(;̆4F~6Dq Ț 2]Em+-'z uҚ(9CڢSN*COxG;&4U [z.D!{WԠD Q,r%BA@ny+3VW5RF_-rz-+JzQҥ"\1@ H-  =J!!:h#%oIc瓒bUE1°Rda)j0h0( /9@`S0:{J~!$ ?BE2PYaTJR!/Q~Tڶ TRITTal.ĭdR%<*eeB6oct-~?4g 퐕kޙ8yUV8qvgѭd,VU,>v**G+vttBY+/W:%1V`ud.@r*o+նB%"c,8s,D:2ͨO,#։eU%(UxYDNI͢VTų5\]\FЂ%|H)HZ򙷊7-|B+@*,)TtB +(q-a^a F-i' +=Ԗ +u[s͠{<| ր.h K<>!z N;ے u-ͅ.%&7ޔںtcԲa1ow6&+ `/<bK<z*^rN +h/(z/+$@/$/ً%_ xяPG:$S#T &k03|01&"0-^Xa 5L&>xÌBPhdU O[(;9BxN 1soAhtU0i G L`"i?`?2+AIL)41KM>u2P2c7A?/Zgz[e¤42)s,S"2 ă dNUQ_T̈l2s<rf4:0]3QAn3ò8p<?9Ht=HvqV8xg@ +Lp`r UDNH\e`Am054id#laѤHaM" 5}4S# idV/tidg`ip7|@(4[2`vICP Ȁjr7ei5q1 vvnٕ@صQBmڮ5A,e0@  &^ɽ r'p1&d~wK,^- SyZyk"˂]č*E‚r[FV)l'61c88I6&ِ;)HsR +fV+S\ѝU@ͭ]c!(d&2 )/H0@%K `vGSmAAƙ(@@ȎR+@zmS@|3L=AfgL\>b`CvKʜA Mʠ*3L:W+-GU 4Prfƈ+٪RˮM GC ꦁ` +o@*qA]5+DO9o7ʥ'G$YH5sCwAVyXo!??!fN>PEJgt\4T>(EW= o<T䈄G9 )i0|?N ֮ lT%@|@|׭ Z?>G&apoQpݔ@}@S#W<`4P*$ꈐWu SF4Tm&1]Ӡj,_F2C0JS;,1P bovآ V+2~~ H4p_+}v JZ`#0?9@TӔI2- Tcx|Z_HX|Cqhp[D>ح&IuU^ ]ZF:m? IH_2Rw`#I- +]HF^W@ؤǯ(d&Gqs!p0I83@8Wm+ (+;448k6ؙph6A[dldeP0X$W'- +&F=$9>_&無!*yi94TM! 5 Ql=ބ}>mE x\he5i2~꿍8-)h/2wԽJ'm/6'R)0ӄxn!J55Y\l\i@sN y8 d%^+u s%bZ` GL  Ъ%򝪟ஐ}S^mO?+Z*j8<=CqDc+~QpMEC%,@^Y* p67R 5 ?!&KC@'PNR L6-TO%I2: U1//3UZpjjv\"!l[_0ɠIFOb1P[@, zxlINGH&!}BqgվqN"@q<ԣ @)'⒟;ƀ/)8lq_g'P.LC}` %ҧR|~mI'aZ߭`1f-y_b_1 m'C ua t`ÐrN1]/DOP?8l_}¥|㶲cǸz)fo"2{Za' n4_`Rc N$>TJ,‰nt`o!qhf\_u)4x:Hإ` O!;|00?) 'Yg1Y2=ݲU\=0$j!<Ap +{Ǩuؒ@Iz9@YԈi%߸]iiwYv̏ qͻ+ +Jt; B©6;w ^g\~ɮN)4BNjW +C1mu.ȟ'2? oSs{gRC~e 7Ï?Kc3*#l2`W5>ED}V|)2e{;7i;4 NGv#QktLX.{6[!uuHQE:be<زdқFG5ei]@}Q\$FY߁z}O.s`­JSJoamynv bOAUM4 Q?0bWM}ǢPE$t2Nwi xte%Y&bN[K[}Mٗ ;?Ws}k;vf=y}Hb^)NKu~*ʆ5U8B8XJᾀk-0TӘ usjVB3JED|_<~3_ǾYO^+|SR-_+Vt_<1>R/(P e*2QN7QG~0zQqB(\nQ"H#Շ|lE]FYoscR9X;\fIB1>ߗ"[&|e?I lkG~hݐ^ǧTY?gx/" +4>~:>?:.Ixa8B'_tbZn {|[V\ CK'YqU $* B0~XL6xO%oV 0y!/NJ5H4MF~dT,af!gnbfe! ++Ҵ% $RJCÒ~F +v!/lv*V෶M"@br[.`,{iĐ.^98i(?Bn,Q{3dyQr E#؄+G +yO<1aNI<ŏ: %RŢ3po7cX#Tյ r*7Vjۏ63:xweqsVd-&2fw%F~PsäT%-H~.eZ\̔m3sF9yhIqdO'c'kbz!^/L¾[ě潓-_/ ^*׹~.TT/zxl^"ffHn:v_*󰾚izg 4Q`v`c^ѩSHKHq^Fܢl-ģ -1COzK qiBXjd˗^lL@9︋aһrƃ.L>+P}q X6pԕ9wa=vᔃӘs"TGEoӞ k"hlBcR =٠%C͸QfC:u> WaҎ Z +>ouEߜ(ᇽ*>2jM+_e +>*;ɳـG"mMx;Nf>s`JֆO^G>b;=yyYbdO>(6HxӛmpU-ԇ4"yj@()#G4~]|L4ׯi}8x@{X[lt&zx_p +*6~~=&iךu/ix}݂#NG.ۊ±9?wUȓsb€徉a=.]BItDe8萸 h[R='Nu jwGλ=LzorE*%?W$s@{'9HfLW]Yʚl1J4;f%];: .Q4֎=2DNLu!tE,A3GL$q= 헿|Cڃ>;ܡe#1}Eg#-^7`]0w4L6mappMe#;A m…6t6k]Y2E/YA:r#BdyvrrI-CZѩXqol'yrg['%Z؊_12Sq T<]`ȎN^Y)lr!iv+΁#o8Ӵ%`Fɍ,o$N<#Leq }=0lbTBWpԎG{2*&1"pʵĉ#?_ +q}%81H}J ݾ[ + ?|o:KW6\.J+畁' ȍ 'nl.+PQ  *=?ɇs0kT,JPz$b¥lbuF,C`#u>,?n~v &nxSEA Sy`l()2DK:JjY޳H jv&pڏbjڧdjKzRߢ.Ń`tgOG{RX[.kpzp7h nB@15U} N^k' 7[evݝ7L,u(~589 ľdw܊ԣX1h/g(Q60z|L{g|txgv2KX'6"I(gK9TA+ZE <]Zh*@ik"pGYy) xCwohpfg'K:Q!ﻖg՘ԾCJE~[']iV<[K= +wQ,Q&u7lnfB w)PmuEu_OWd~zQ:_wcp8&i"Bz/i9c +;yyiETun4:%OD "@NHx<:2U+ +P~n._B'Aq7h5HKmjJ`EGם EI&Tǀ_KNdu xKxƊY:n0;.-m>ŒRQd.=V׹~%Itl'W5\B-I—LoBuH>"8 $)Z 6[0D0(a]iecn$hs.1k3#ԛ8NL^,sQ W*F;cn4wՓ>NAG1%dQ =斦[1ln(3**csCǃ|YsS_(J"gs{ռĊZr­cbs;CB8Me`ۆ9wHIwGyuɚ@ц~|@(X/3쒾n@cx;Uܔ77:BCiUmg>"]t8:Z"$tK>T2}nۛTZ + }nO4*ii=dй?!r:&E(O[s!/U5wU[܍4͹*1,ޫB +a endstream endobj 21 0 obj <>stream +vUsPn望+|&H 9҆kM9[He;a#9THCu ٤Qsr@Rs3!"6TsQ +3-;BA^ҹ 6~v[>vs%Q^+wQ u&f.6LKsCѧj(DnN4?{]@^DTJn?t.Ё厑D 2G []^:yg\ר30-+n}_O$ ^Eܜl?#ԮF3vyDθ;g~ B%)*B շ/9ZHSJgo{P&JVx–Χ֬GaX?ڑOP췏6Qp΋ZTVkvꥢJxvcmA( +L}%P@0R^P>mCim8sSMΖ^w& .x)67 Se3+ÃaIhw,[{/h! +nl6(}Լٸafڔ -ABll>0Xuo~]c6 XUo+ 1Ƃ ݅SddK@Ů%${3C =MXAVK;LJlccB[1&ZzW'mdke;LBk)6E<“2=S(gbqγoح$NEH +LoZթSmE ;QRB|=!z3vqnvpeµэ|OiA)|2{Z3t- :-%v"NƗeYϹG!2)r׬T[f奰1!|-HڧЕ\g>K5UNr`C*뭟5.}ZԬFcOƯc&vZ6姺: Z͟brdr g1 !}ŐU2LZ{aHkrDڵ6,7נi`-YGHW_?O )Fv=6sW_{|H`,VXޤhX|V׷XUU,RXY1RmgR|~B6&yZg5DYm+ky|R!\e39uu&~KHyILͶY=OaMz*)dPj4gv$F~ōjԽmطQC8AAEZѤ#09ja3A%ԶcG +Q..LX,5GYߍXS \Lc> +̗hgJLxh)6Q%߭2ܚǷ2V`_.4$wX#̣OG5>Fe[`XnOtA_+@8h߁FE^Э#=QpL@m$C̺ ͔b:e&mˀ ?#G D2G=_œÊ!3h %8"wxUCxn$!imo,}a=KJj m$y6UULPftL':PdozwΕD,0nĝG.H%A;8Nŕ:q&7OV᳔uL$Ṁ/kt'0>b|ʊƜ8OUYYC9~:4qVjn9 DUp6jt0Fp +oߌR +ݗ"oNw$n&N;ƁU; +0Q ul\T۰"Ɵv)JcDڼfYiY3@ ^P0CUdgܢ--,u޻4zI7]l/D/agM¢g^z MQl@9#JeP37 +*g/ ~ЙEzB5s3mOg֞at6̷$Ԅά˸fCG{͌c53:X3Ȋ͵kfTv@?kf_V,P!#!fˍJRK̗)133DDZXSgF(|y0Ū,|>ݫ3=(֙@ڵ.? .Z6qi& $:3^Ir2JT(06ga(ifK 4m‹!,BƜ&͌FTDҘ`ր2&=<0a\|#_M3Dw b*rLS`h8t9 {Ec>b PS,s^Dv3*?Lewkc˯ +3K\~g8Lݮ+7`~6~N.کA!f@O&CqVf:/#'aߟ<`Qe?H䭺| ?tO`.Q. R{A?YTxjꖏUG3BF9%ӻ X#; xΩ_žRt~lr:7 qub|xf@VN +ig,;r)& %/Dto8S)8XƔ? JG+k'`\=pc]M跫kCPjЩ(-\TWvџk،5:oQ QL?}ƣm@QJ}Tc9յ~ MHVOC#M#dc1KF 2/wQe)<Ҽ4IW TEEKR^kg9RRti4R5 ӑF~L39TibfUhLՌj:x̦A3ěUcӷ!v KOW> MRpcFy\ P(34ՠF@a,χJ^!FD[/2n"<,ek :KBNeō;DPU.+-KrY&]@ - yzUvF9ө:J}L)/8VKCn)q㢲de9-{Ykyp$\ҋؙ +KZ@2O F`Mg L1ۺMw+hy&+A.hM\(٢%0iinegE9]g?%ȃW[EṴx׊f{ Wf^PoĿ௪|dp'?CYmeE:lQ`%iNaah#6PA5%MbF:c'C,FtM%W~+JL`oP^fYW˲.8qr{'B~6Kq#j W,Y vvlL{bbהzqDM|Fff%ig-Nڴ~Z*6vV$!HK0lf=T].߯m<3[ f] 3M=k{J"xXqmvL!]gZ IŖV" rX93,l.\SHBw񓌻 UCC@MnW޸Yؕ/ҁLs/[6(Vzd}A +kEC=]-{ +aː? ם2cl-d0"uiWĠt۵.'ws̜]#NVx#o{_xO Dxc%Ԏ72y +N=V8/e) YzC%o*sAunI;fvŖ!Q>9{0mF>FzJܜ;_VoBӶ( 4ˏBj7D1~E/975wYw=ɀE/'tdz'EVpQ +; T&S)E5`e_ffBxr+ĸh# xSh9 iYAzo[?03Թi}#*aPb_yrv.,uIr9F9 +p37@Gs-ʈ$ۼ>_d9\@e1wq4M n,W[vxf.3 Ip;@Љ՞~5 +yQo9lk2zWяBFQKjlNu$="_\"|7 +nYc)NV~^ék \rf}H(Iν%[Zo߷$  +$lE9wDp9>EX +;؁\K+RqTM%)neA)uNF:|c";elyvյMhq +p᷀=m~5@0z70.Ёߤµm~SI*6t;"G%(߫T&PΥ{GE ɕp◾>PC{Vf*}ZC ('Q}qEKuw)̙g~~op3kDU7 Z7j 5]ï_b+o6-Ӽ3$&e"}iCOܦ}y`p$@M}q5ewɲ#L ͧ姩zC}GyGcԍQOPQfԋDǩ'7kG}qľ''};caA"%9:uyR4H3\D/ 51T̎V`*@!Oj FxC]Nn؇,6ڷdڒa|LvJ;=Y/tо9#+3M6 Ͻo%Q@HXj%(}%@niHfϞ@lTZ{56f_;/yH{z&B=鯑!{lj/T-mph@ڥ+nlߗ]jew}u̻|.~< ̄( >_=b@e=醅* 5?LFC/S by + + 1_$Wz_ Na I\^e3}Aե}C5s j4W{GI2JYa2Qȁq'B0Xj% .X|lL|8O38`"`V)"j_IOT\MQgcRxH ƒK)GAHèxuÊkŨMR!Evģԭ>`18٠@Dt`b!}xCby9g|dqƀEt+vq|e~Xpc!O-Uh&e"2B;RqǺ'K,8iXTct!gC1|31M9yAIo9T J<`D޹Țĺ|#s< +ƏȉZdGbE8Jece2YfBX,&fWaB%6ȱeqdl:$Q%Y,4#%9Q4L<5uGI]Jl!H jlKySbۇRIK32Lkg "eI~8D%(1U8Ι\KeQ/8"J6 ⪮')R/??}A-J+!)yF䜒j0Qa?髏pkydh@$)Xt`?]BuR 1 #T\4NHwPn&8}/-Nǿ)vŢqdPUc ulT1Z[yފORHn7=eRaR_ gM; +PB~;ZBgx_}>I6Q#c[QO\6KϩE`|x15oj3)RyYz]OQEm6,tpPQq^i0ðP+>U:Tg +52LmNXac짅:?TbEޤFVH_67# p, ȉW!vϚq* ZBvF%PiC *P.ΧV&ܾ50 +Dԛn@+3)o<@@=`'kj>ZPX-F|ZvCY)j^bnIf6HV1ՉQ\W:&&[ǻ$ǎHRsqkM-T%9opsKA˝'ƩZXĦ[2 KzyB|W%Mq6FX-Ab ݿjdԬh=6Fҍֺs Ik-%A~.,*3k-[jޥFuf3^jmԝ/4jMW=5kd^XIÞ̸ܻ0`I>jg_CmK#gKy%oZˌlQ(Xk]Y= 4 Z6ߵ5Ip1 +d9emxuڃO']Xc a2'T=|u05Ov@d^"nôuio r{B_;`ń;{zQi ݺ /CճxJvql,*;՜4- +olr V5FSZACq-bET:4S\AE }F85aU?xqdK[>|"(&l H`FfTC4Kļ5pcu\\D&< }[Ck˿*9ns}c ͺbQ]*Q#_ _{ثBs綰ތv-W ;1f"ǖ3dC3*BCʀiZڲ}s 2VfxA5} %h$4,Ծ2Ez}ϕ"k'/ήKX;|,$,oΓGbMf,ȡoC-t9@]1\=ˉaȭ8 >ɽDtdspB>wvjts>ݯSQ/$Fŝusҿ-48#cLAwwM4i+]tMP]h'A_"rlg/>{q΍7XLv՚.z\Xr=Yi2*gy^?[#oz>u朮4Ae"oQ)ۈRqq Zj][.|9 wD4?y Kʿ`LOuȉr%N7 TvSkW+!h ޳??z]5bſLN"&]Rm\ݭ.a^|ZЕ@tF +|]̈́ټtmwᝀ7~k/Cx#"/&ʤÂj| ߌ!2z> `G7i% _ijOe||uY_XH"բ 3hS#Q!n6G[r8&)>+?z<)Vח+lQ~X?FeZdtg ;_ټau 1r ٷ:v6D{# +;=}Aj8$%_S +P=Os +%,CaH.\MfYO_ +*# X苶4ƙ|8jJoJ;|1q ֕n1$ Wfvm\ c C'hrk)C[L3@~@pw]bXgQػZcm6u/ ֫gj1/$Y8 +(9S\n+)M/<^3=扣 c &~R5p}dAD$D8O2E=GXV'8Q% +%g63B584U-YC9z?tifүٙiD|,;s]!5TO VH=3Jɨ& +% +Ds*}⢅GuTpb#<ĦV*]$KoGy> o|s{\Ҭِ͑Ilc'qa.gO8$n/w7,J; N\eAI Ac?4 7ם~aF p(Vηv x9y8"LM;hY&F܀^cQƱ&ic_92Ma2JriN@ 6Nx,m90+ X.AQ$~<^!ʹТۙzg}PP}tєԲӍ ©ܝW;9!G%wвȇcwTX7,O%^V +H>ݍ4hxTx}MDVj h|<3k)QbP!Gp/lwh|ubA5#Rƭi hjM- Pf`;U*e}TrŎ ">q;<_ު:lB) @(y{4pΧ xp:=!k#U#Q>"'Tř=6pȱoH2І+_jmL h8ݛCANk؀}d8`zn|aB8~A|Cú_(VF_<} s65n1&oM`] N@z URgĽNt9ثlT^TH +VHq0='uTĎbEF3xkuM`',1tfs YSXgnHB3ORby{-)y`mv#91Fv 1̳sv}OShbC9G@?{=kd*hh RDF;u F?*hJ({ALb❠H ?:]CXm> [#wyGw$f%So 2uil־}8 a|agG":Kx5v |K]Q&@ij>K'1ϞKch?$6}rn4q百5:L+ggifC緜{aӊmy!@źz3Qu@.3uu} 5|'(hcz.3N᜗;>FcjARoĽgQ`JzAHkeSVТ/v ʽ9!p +@<~j<= ʽ@*`/vA6?FMq:!׈}??V8ݸS81~y󰄵VD?~2tn=+Qkߺ ڌӝs0#[> "v%7Pĺ߳wv_\g0}Gèg 6pϞa,&mqo=j##tˡj-cIXRŪ&zFCg="'C;Ϯ{0ngNNeHw#x?An)R^)p RL}9ےH,}PA})ہ$<`_aI3xY_ոoϢGil7?U J`Eo_ܷ :^:c7(9ċ 5k-)r*b' T`kȬnpW3,O ԙmcfO"_P-L^Om8b+8!IsTMJEM^ ;{1ݏC;v4u맬cs6 jXFef'S ij<'g3VΙG`ţw*= +F8"zg +h'0ءX=FCT)F m'w׃&k=ѹIoKX TLGquQf"ۦ EuviQD80}9?V}Ih@5XX&a~JA<h1"`dpgԙi( +ZTa]J`z|KbChg}$¯ {|p ER#vQ }t9x1xfs\Sǝk +~")|شZ 3wk{ !\sW&mss߆P =vreLAϓg;4y/8`: w:(tvt 2wju`hDIhQEPd]DY26J/' @bߍS8ijĻ H?{'st<⼯i̝[}?M,F (VĻ{#av}L SgIԫ'!>nsuueab9{ YDJj&?} UgѸY5.'^ +=oކ8::LV2}j1yfۘ2ymSa e۝žu23yFpM9⺺Э4O˴cޒr MCFC#yv=boaܸLZa7޸e[,ZZ>lZ?-֭ky &FvgWrP9~D>;(Ⱦ;[e=^v;WϡR :;g*eI kUẟSx{>akeȽnccym.6 a%%T%[0-u#rd㵋$TD41y?6_3qp"s0ve3lKU`>V8a:F2b~;gmgdƼڦ Wܩmc䘸3:L:tUOBπEdW2ziϢ7H^]ue,}iYܭ+ed?L{1^ڶc?{0|Ǽ.Dsu5 _<&9_nCm㺎QBү|]#y?lqrhR@9⺚&ƾqXgu̟xWQ1܌zLOmX7G[YB5Q&a]IX;5D$׃*<ͣץN(@>;u_+[;dX:/lξdNƽϓx0埗cԙimo4W|!y C(3'}v?Sv2 'S*Zm<_H}> q3wvR~J5m +>zqIܻqsf4}muQ'wB{Ro";XANDJ緜ہX>(%3( ɿcCv cI7x(o/^99^S8*jw?&zCooM7x>x7$sy>M^ w6ĕ:?$h0}Ÿ =zL|^luxu' O@+b':aڦ W yǽ/$g] +ՌKZD +"Ρ]yJժF0zR/H_9؍< ZA +.UK`NoI$~GHRw/ E/}md*6>iǰ!JA$jh;?_(yLB[ile@}FOSmd9x1=h" "K;km:O$6o!I?;kstf=d 2 #?d .l$B;kMA~1o~r eh#q4{l>Yg; qrVklv6hm>ٵDeNImẌ^-dP ~';$2~k^\}"LBo)shlF0iܺM`8]NWclv5o2:l)5o}Z?7Zy;/ 8W&ørݙ?{gQ 7u cx0v:Ob^@~}5q5%w*sDo(Vہ "Dot9^󽫕B~Ed Պ@vSi/u~TT/.]G7p*0P$iCF]HYB oVha~ƿ#{Х-D}Pc4yo>Kg >.cVž{)kKP N8PVO6IhG8TH?hϮ5mq+q~m$Gz H>0 E(VD;A Eh mjA8w~ޛ}l$B[il}r̝|mw>VΖ ;wM}¹#gVq/a9]6q( =QWήo +shׅ(ew2 'oC&'9ݻH< `nٵJjX -b?H]U|C.'UE + ?cu |ΗxO w I>~qU~$OBD zh]>pܩ5quO^17r>[wP?F~3t:LY&ArD;{gawR5JYĻst?,g J51l5C xN;#[b18 8^emðwܰ9 S mgٶ4lLwMg1dÆ6/ida/gc6zEM88a ZgKK +&&&.&*JK馺ڢjjj:auSZ:ꦪR:xkzygv <4QeimM5Qeim5Yeem靍5}:l:PaaQ]]ae]5ꢺ꺲ʚⲪjŕu*j *˪jˊꊪUՖV֖֖֖֖ܖVV֕U-+*[\[]UWVUWW[[X[[ZVYW]WV[Z]VW\VVV 洬d:l:t.la]5ڪjPuťՠ +jKk +k +CSUߺʺʪڪڢڢʪʺںʺjuuuuue@+ kK+KV,,+*-[Y\\ lie]iemqeiieee5 +:N5utf&ḏɘ3ӱNGZ XVT<9ě8?@<q&>c7%-Å?@|XdRn'MdP*%rZÀ84F`wiG)(+g蒽Q,X)cĒw6STGfL5N/+]^) J2$8BӢ,*e-ti 8.nk%`0عi$ 0.h1wt9ۤERU2S +LA&0(^{pvjҶ7^,;~kJĔIzDeHL+k%]1:4bfCKY&*kb^10=F`yXqIw#R޺T.:lԁXt1-*ls=F`b0t$Y$n*YI $;uRz꒢CظGX8IVP* VF'xPG%K8;;yFdqrH2&W|!*tԜQB-|K8:\amSǕ4![Xa \wB3chgK#^QT&xL"J%d,r.li(D5TqH&iPO1 tV+YXLɇn ȇFF{@6oc-qzca¦ixij3܄J\a,'Ѱ BQ0&aY +uKġr 36#S.NR0]hI,A-҈JPXE)MX2gdA<1 I]+^kZ +0bV  d=ˍ)J,\LV'pK2GmfP \,yiP3 }s B62ĕB&Lz\"AqrzYxdĥ`LtP1ѡJ$'d¤o†J# Lh2J{ c]̟'.} TB)qأQH$'(np&YK:q#h'o'fFMG ?0!]p IsQrD#GR~&)pbNn2:?h` +qY⒰ KB##, &t\"| VBOr> '& | \qEmr Z6qdQL9&{M^ΐ@vkIl"8(8+gV@eLq &.1d@0S;$e?.=wކD԰5:k؜'`QF2I/C')>Zz˕S1`fPVb /Ę[h-_h9I^f+jPQP+$psJD/TItɣg(N'spxvPa]\VǮi +A#_FMYԾJn + A!RAQWdlB[v*w+hK؆LxK#Y>aHq, +[(Z \f1@U~ClCt q JV1, &f*jNؒEܜ$e&$ubr "3Q'AX&wpWRʚM @@9! rF3l"1q'%= n#%f|@np˘dMZDoS3XRi=Q4mPIKSvX6e`fղ +8zU-c+joڠ)ʚ$g8MbEGeS߭SImI`\Zi +SHg&U̳Ȁ?EV.Hb,]I\4Yu6Ldԉ((q4]b=Aʹؠ~D"Ol#\>g -k*2zb +e+gE^#I "6WaQg?,pBNAa)a1ٞ݊ ;Fό(K3[ĽFdN .ߐelL +bYD 1k%ɜؘxTbYD+5h)DlV(p32 B%@d hD+8 +䊽D_lbOb$oc&~%D +IgJT'.]]76Z4 . oƽOaĬHH;ʏ?tjGxbm[Q]TmXlx'/]!:и+p1-,]RuQYRQIB;J!`1\1T1MUY7D!C5MaBtbp7293Z @or ņrE y,,[Hl qzvl i`aXZZHlUPI IVwb̘4ZE-f$f\L9hi1tEU0T)Sx7\1^K HPkOdwF cŤzUTk0(>CTY &MucdT`Tr*GHB 6+am;I]kMK9ɸ Q,\WQQQPB-%s.,%gB÷)ѤɊޣd[FbRDx\;8, K.A33$ 81(VjF$ծEfcrv@ijJZoP"zHPiGP%[2öȠ?4[ u7oJ/EGB.{P'M9poaH%3XٝT CR3vm"?',ondoJ5R#*!i܃`$t-D)@EuP}ţBX;~(?+He]Jll Pn3st݀"`<$DAʾ 4Mzf@X@.(;ԈEZ aHcnB2yU:쉪2)S騜tL[=:ND^SJg( k'ĚB* L4zVůN C.v(rxT,,;ՊzK'sIo蜯hTxPH~O/wA˚IOB:'DzXtC&Z! [94k)T E +b׎NeRMDL@ţw2 Y"A-}E-RP X,~PYx`4\9x~ѥMsI7hI@ Qf΀Ed7,C̙it6fL&lV8(k%o3{l `|SH'0ueZmL]\vy7߷>6up\gVF*bOJJB(D]th8}/eBѻy:6@.$[WXi,ƾIhGP Zu"Sx5LS* }ʏRI3l(K`6UID㏣O_G,T FL(*kSpb1Y7`AY/8XI^s +HcCDJ5QiP~Ed@,op>'LGA +vnRƒ9T,,dd\92&*n$OB#M*^FYsvFoR#}FMa)$zHeߧ def7LPOxOϾ:wCȲC8Y>8ZHKσGiں]Cw6̝3fЭ؅.^/PXI$Ļm>^\=V8tvLފqX#*+z{ XI`ΫD4$i2"i/, jF\u6`HH| IF}TD?8ļ΄ +U:(i MJ!H:Vs:]ۯ*5VMY ['v0.$3s ŚZBP Ii*2ڹrhU.(4M`gqP=WZ˅ +>vԪ- H + +`0ɼYT\K!zEIg&" NJ{Nف Kz2❿8^n9X)P^&Ut!*IaHPo AJC=W I:؅>;/$Dž:EP0oˈEcը?yP*oOA_j2>a|'1G`Y70k! ?e_-&cl,.MsG8?{4( $흌ώ;Da7 \34}$`# dseԶC KB?o >%AY'H@F$"Q9CX*G8I߉5ܭrX\I">BPJ5=6-(hcɨ FLO$JûHtA̳< M>JFMNs:;+4I5laŠ~0+~BjeD"nR +X< X8tv䟭cxu h";ֺYf@dg\=cɾ5Ջ9QSNDN?zfn"rpX.?U9`*B,~'Ӱ-4gȡ0n\Ư=}&OIx~L]ٌ}Z,[(V/*}']wص7sǢyp3X1YkJsr%L;ҦaA*}~WRk'gh Ǿh[H][Yu[!LAHL(*p]i5\b_ov,WL?}4✜Zس\R=N׮yźƏͮlI^Ee_ +{p]MGhJ?tgn@osWI霁*J0^\Jg+AC(3Pjx5òw\;T4ه3̛=gj]R6$l{I}*E NTwPdꭱu?uỵG>!gƚYkD0 ?ϴ|bRRm-{DhEqoq'qOhB*-QU,,;T:E>EV/4ii{TD[fmòUE^X8u>[wZƎM.;g?7J?n͠[sPCB$C6Nk_j1~!9{κYsBb{ L6ؗD ОRt`[ >٨Pp mnR \H^[T >9Q5Pi9& KBS %ݴjXGPn^0vJ$8t2 7˴a/j2YNnn '`qr5w;#M"-FM#6 >|R.qu`,t h٭R-Th魁&j"M:Rp.O%{e j hbĸ8GЮWSYUzef>9Z(yWrֳj_,¸ 8V-5"QkڝP4n|dn'l).d>ͬW^pBb\t*jŬ^g|&:>lY, ZDjb:SBH-$eu[skaKڤSmHP4)7(2.$H + ˉM _Gf«aq)껂n\Pv1 !uA9;70RJt+VdVHhբdYJX>@Rg#J28wX5$**a!AOV[ M"K02*uzUzIDHa!'VGk'7ki׺]Mkn'wx\W4?[1>e000 <nE;x8+~᧳OKacf|`nR0Q&e![ ]Re/.[(iº- LS<.j[ +r- S3.^IbYD+)0+%f*ۯ+ؔu*"h NHiBD+"1!ATsxMWNFpbJ7I//c7cj7Z6LGs$\}n]U qMXN8!V^kPrgTl-,-4u섪HKn7dA!(!(Ĩ2 kF.p . q <e^Go67^ X?. ?1>*ŘL0 f:r% Y#j=T9EAuojV&t3v-QP;i#0H3.Ě8_B{)7nZE/f5KY3^UV=|3z@;PŽxa?`Z{gEŀj  `-Z4þ24JtU8Xf[KBI_ypiZX V +G-$Ъ`!YZuHv|3*9 [BdpNeBsF"-BKO9haMHxɉI + KYbwv6`zZTҪ|(B[ +(dsc@^1C1P>@D=*Wu5L ' PcXJH`&#PCـEY\YNzNp ymU?0 8.Z߭ȉ3QZfN4DϞJ v`ҸbZŁ[4dyAŠPA7t$'/ w{L@A0W>"d +[0&QLP"ǟ!쫋iAVBOljGS⾛mBdbM@ HD0&)$7Cxrj)nJBR1ԺȯCX~r:ƹڱݶ<r]8 kP዗u0 K>BQ fUpaO ݗ 18 ˶0.rvcLm@"Tb#ə"gRPkD֮2cFMn;+HHKyzTDZ“QBҭ_cXW9Q6 qF"5J kG9F- Sgoch9NjW*B|&5&^l MB?\1t md@ŌkY%|E"5z!`W,6-}ms$*3P\7md5 GBFpb)gvIaoVEfX jϿ( [sHGiHų[C Ygwk,ze64 c0~bTR g/&!.C`6b0"X 5bBwƐ402#1n \ZgQp0(* YT+3VPUNmN-!=ngDz5"|q68I"it(`䛋J4"a%1{*q9TH:I6 +D"! +KX c&oh@D y+s+Pa!_0*-aZ]LŠ^%80*KmN/ K2!akbbR Q*_ +m6.DoQx_ ÒY% ѡq  Ɋ59"D#PV +1NǨpQ0,2ho$!.X7@"K-B i[OE +^c"U,׺B;eR0U߳b# VJi+u+ʨ:gh8Z@8U96J NS[28S9m񬇰]BME +NCÚɝeɸn恃Lᚇ(ld̏xc.`lc> X8,@C._P qn%`Qdu00QSPeUBm)+<]fAvpi%e\;{i4z؋<۬#[t-mai:9!0ư\?C75zw0$(\Xt;$MץGmOKZdKdq%(` lx^GW4+(`U0?&"b"h_;&Cd2zvaKkȡxwQ`6T 9nez(o7F;6Cq <4 +^{:`b~N8y*gt@Knj62 u@eUR vV>W =- +>jUPx.% v'nˡ! 1҉1'Ma+lvb3{yb1nubDbbcaYlMԒ9p?ELZg@tnь 56Ar(nŐ +xwJ5=< BU=vr~zV쀬X*0c%g=ܶ +ZF`\Sۻ7 :g%6`2q(ٿ/-h)ME0BU\i%c@||]x=Z Am, \"Ƥv4rؘY\;ŷxߑ4B'н YYbvՌZ&NBMH5miJ(q-Thq mQ@h:&EĿx""E$a^<bm+f*.vn>FqVfybzyDyyoEǯ8xI $A\rYx$/,?U0+g cVǬ!Y24 +sPC|ejT B )a'#cS{5ٳ LB A\/ }ewGM$]h9C쑀07>kC1 /!j^uvXʂ_Pp0%5AiBJ 13x M2?H!$wppx̝yeC'% -B^&frJ׹xCSFi'kKU6WUpvKgcw 0rxWJ+nXn!p<(8!p\GI +7AS?Hdg@-(Ag8!Ïpff`"&dS!3"-c0VA6.@ mW ^=Nq !iiyE2A'lV4XuX8*i7N(jZaY9%߬ p3+) GHrd~}ᣳd(xǐί!`><elٽqŧsgv+Ͱ)'![) ΀Kq&?|pu8Qo!<\hXuu%,ℴ$T,bYJ>prESQh 8:)SAh6"&5lY=q#~3īn8oq* 3ķ8tįv8T ב4`w` !ji4/]&q0LqC12ubERjI9䛩3SQG'fn,8 KA0T0;)Cq&lG?#ċ^|83+ :]&KXQ 4rI0rHaBC_,:: +p%5!G 4Jh2U$dmPUH8O?<etMw頉TG/BzxXd!$Ly`nLdo|e;5Aץ[ pux<~30/)2R[:`В NJWdIe!_ :)1ADyD1GcN!aR&vP2Ui6Ya %gZ<@ğd|x@ah8 rNa ܆΃-Z `ټJ ~imd )v,"KDUSqH&$'%0&L05vlsP o&4kJralxЀ0hd8/X09܇=0pVnex`s sa}I(fo^12=T`zuX)Α3PǩMC685uv"'iEpPnc.a +#4Vr!^ox /a^^tA܆ 8\({ptCxb^'{SxJ666@|%.G'lj`%<%RrID\Y؃%!>X3)kC*^'nT6oh}റ.+u!U͙ jA*cl_f2Z$F@LTWD~"{S(5;3kR(3@!ȔjtQM(G* )^G`ţS:_Ȭ m R#{Pd VE{.HhM Hg-$%%("* Zm#ux +HS2J/y~#MRz*Z#h7~o +!HGG1hcѠ\;;h>6PA _ e蘻[)|2/HY;pej=6&p1uyugќx4z"L/{H ֎M:eo* @6sZ e-||O^Nޏ3p\%P;`H n[iC*XH)$Rhٽ^H~%!4U.iv0Xhq=Bxp~xZ76r)$OH +Ya~ļ&iŊh?*=Ac]9@ +ʎQH6KR zdw:Nix'y~?*y3j@Rw F:WI+uNxKncʺ"5ȉ^rŴfB,~%Ǻaavm,JUc; +9F]s -Q )-d57qvOb&ǝYVHhCOhi+~& |DM6D^0"̱FwS)*D8+"iWrRK]φJ]\66{Kjf"NjNJIw褹rh H0*uvC; ?׍:E +>4ц"utK0yJao2= FHn+@AL@vsU4Q!mj\͓FXbnl Y=ob! +QiEe=UbU07)KGZYzF!ʿi4T}j$A÷ՋJDڵB$~*mOIJ%N[ɳ{9L[M)oؤ&˾Gm +ZŽIpGlZxz [W&c v u N"^L5nu$rjUE̝Z8w/hY2^g GX-vM#ŔQ2P0,DgaF_ȥDފٓ6 =6: {9u +L,T+ můQODZdMFХ5{o>Q~'o,-$& HTѓЎs1|eڲ4ls׮?& +LRe \Zg2'T? ò[pRJGٓ6 7p谯,KCj_ T0V2,;Po WŨpTֲ9OJ|xX3( EJaT}ó(SPT\ D$ [3W6ٗ'QƊAimzWT G/ R%?~3lTYhK6F6M[r6-|ܗ< hX8[;&q=ZOmAry, F+/ms`暽A7#ǝa2L̳x!4vʑ9q?f ;h9`ţ_Qƺ,4|m~f-k#]z?}w$}UlKh L4z%PZe[-ü4|u7ཤi}*EN"URc0 Y HgS +xncOTGzK6HeFf8޸; kbڣTO_O> ƟeC"BJ]ʡYg1#R_B7zC~iO X1̳")<ԩ3vj/pz l ǽsNs8w ];})ilY0~!-_հ^O}5"H$@^)sQi<>12:ţAYmv3ڰ> [_Ÿ?X ٌc(WE.~,U UQ'lqt]jò3hIJ("iFW" ѻ㞁C4anzOIh|]D xMr0F *5/1rfK z@{?fL71̞ZS&,J+xGlgtg!YvĽoXGDBSY H*y*!`` +@@G^[Ii3@zhoV1,qvAJ_Kez [6o`]vy,y+sĒD }v× # %$9n/߭ %0#g`eQOG]*eW*%4(\-6i }D9x/zm%<~i@rfPQBnZэߜ}#H׻t XXJXk%K:[fέx㸀6sjػvtS&"f"oGLGmj=^숪mFعp\zErGw$֕MA}_ MM 1po2#ލcuY-3ahƪo1|xAfqj)x?*MCKkϥs9߹?otu̝Ų4L\]f%{Z]bJL +MF K>m+e<,4?|3~"d-DБdŝ)Rzs wul􎡝'=9|i`_~<(5WO hG"~MG");0:SgK4Q(iFBg.kef' &|PY[)BQ*@Ɇ\Mga̋C7"6X=Adw4 H(VD(Sx:vf,P{An6 H7Q߽$Zxmz"?#0smL=J`5%-(%rp^LѤţ`Ԧ$6=vqGrV 5L[W޽֫yj0߼d=DDǠ~+r f\CУ ǭ&U[nbg6`AY eJ4|p]4#nl~VE2wkMw~B +H0Nb_l?}^Imr2 d:kmpuO^GpBvPdGY,3M +ŴX J wzFiz=S{Q:omyۢQi7mٱҹBQ)߈69sScrV:v%ߌH]ѥ!(B(/S)"cGmvYZ{-&sPeaKvJEF Ǿ- VT#Jir|lS3#7XSaY+`ؕNks- 1h\vpM?a(A WxDڭB QoC0Ed~Xع[t׷\+}& .eԲ3mM7A|B !i,4XBVoj1rh۝ "NoQ+,I4Z %Ү D3G 7p5Yv1n"/h},MxWm K.ç6mq K@Z+a踲"g2{.sć3Ho8y"Sz{f/xtL?SVCT HH2vh?`NH~u4g(=b>1qh4Z1,\Kcf=6ӭ(koX?Ƴ4e!81\9yj &u +FP* cd=12(/|*!fOsO29'}z ǎ#efl۬KOC.c Cǝ_ζcos؆ cwkeԲ/΅{P%m&q +;z3$4ꭁ,h-̙ X,0'=<5֍m_ٸ5\"#dXۻQIfdJ!Y²WBJoHZv +S*c',9ߺSu-`Gm_l1l |mf,bYmTC~G񮖹C 4lR!ΌŭSΕ0Fu`d_,֭&}; Um缜 fOPt1,$Ρ]1\:< KL"$ H>D>Ȓ6ꅄ*2Z# jż=a_'I_|!ܕS8FdڶE?I4uùǰni{" L?ZG1OCСi}(R+#kfQT2,i)R8qH?H uL +:}eS yEe;$ŭi ʿ4?$ aYvSI<,uCb/l[9;57r\ "1 5pYR2)1qSr$mDM]Ӿřތlo9RIDVȔh\`C2VE':cCAZi԰xAMhGX8;󥣗BA z 4ed

KpR5Xcn-w6YM>@p%UDTV49^~ӝ<{]\CxŔ yT 9A4XKpQ"'6Ɉ~/AaMZxRF ZUCiK$6r`"حnX[J8.$WU-s܃ah¯EB·`f`㝧!\bEy^&q1 ^)X3{8U=zx +_k W=0g QLV9:@2ZfkaY'|WGP|JpREq nqL +H@`@rAkC0@Ăh ݆P!c"ӞC;'9CL6L$tbb4zHlǚUVO~XYϮN% x7cNH~̭^&f%惕]}9P0}?8j +rrt[|VNAgIkMj\h[g^ae'TbtXvS1ˆ%B+"]d &tBa6 `+ 2voJ饵^9@X NBĦu5zLB_ͿmuA̢QV)@/)M +!!9F?y$FϦeawu~q_%)D+}x><:Cm%΢7x"Gk 1O} N. k{XL,9aFܺ{ܾ*](@tI֜ի׼=T.@9K/#N^gп@%'n7e˟U8x?+h,Fz̩teS0_> +Lw +L-n6pBqOfa.)`Po +6W韨gJ,4˧9< }IjUU^ +G݋d\ȚpBHs{>ёԱ Y)1y4齇YV'cώ91/<cM9w=IՑ2ZKU_ȻZ}r[y3wȍ$t0=(~zuޞFy֗[|_h N N? OdV/1ǚUZ*PL̥[mb7ox;?ݖaKNS6;|Ú~}|:%mjCT"-GD._ +}Ea-ny,էܭ%M|C0;n v6@N\Mv!gAu\L|O4Q"Qa~}G# i>fϭ0}ЦTÌD+թYo?l`s jĈzy&7uA[ty^fHz`;P~&.oI~I;NH52&SNOioʎU&z|O$o䡗lE<]MkfTT@ܹ˚3j9=PsPϞ}Skμk{W x W}.$Tw?qϦ=]#slYa('a2ߑaTڗ^uX6-*_ kg6uoRDeC^>D]JBs\/35fbO>&ǃo%|wStxL_o){EGiSa)m!$w;4 +=W>y[Ya s?VtvŌ7=l.jm֕e f|iB#Pvdր3JWR5Fg)x;cp-r zc.4%)TE|!tL#4spv972]c.ʓ1>y_F=I9C]ŒCVu~UZ>9%<$ܨ=$p͞Uvo3R샗 +r?[hc+G8.4Tݱ9G;$7>wmX{xWkA.OY0&]mI* >*mmWZ+>j4ʋ허r"y*el䇀r@F}?%_|r&6N=yw)/&L$h^/Tگ*_Kuxbkx k{G˾ީcqNH:u.PEYoZA2i  Dl<;nW%z ؈KvZBR/|ߊpE9 pVa"p`d#]PUI1#l5i}L+ƷR0f֙T*9- +ȸ̤K&IDs qn+)}5Qdg[b_Ltw=Tt +  ҴG*p֝3Y&)=%F +:mESVˁYXdᲷKJvچmbg[;s58_\BjZ$3|[" ضLruĐ.KH*>jNZIiLk+pɱV)G"7h@|gc%9D[~#FrFNZ |a @0/ ^zʪlWC/F&0~=)  %=MQxk\vA'D2L;],F۹;Kh.\; [>ٱ|'*Qݙ>CxQ# *$WDpB(Rf[O U9}6TڄKC׌Nթ'O--7 +_k%‘ʊ*" +P:TЛU2J4eeZxQ?ЕSHģBMbIu9EwjŴOӃkE4;|M8pCyj">4-V>иg| U@bn$&5]B)m+m$h˿|Q҂:a$#2/weT˾`d*ܧPdZ#ZIkhD\K(^ʁނ+m2'M7wZmHbN^9Ddr9ۂ6umH36(667*p'bwoodBYFA QeAEӘv%`v,< >B6ԊX $W9k g!^(MWb%^]i(GҨXkZ"Q0⤖F@.ԈH،Ґ{V3"-(6HQx|^e0g:3fɗ03 +jlހXx)o8Nm ~zT qC.4rke_$EGb=tJ}pm(e:r|ڡdɿRSJ"Օ54;zn+ɘ + ٓzWY{kDÀd鋃cS# +ָJH)ס/h(k$J 5:FYDUMDGE.MDm7(mH};=1v002~ܑj2L`#_[%b =Z}ќ=#kC5ftpt@s1Y/Z2T,U@[{+& ^ױra炩x񈣋'3wR"jRp!Q@d6`͗!{L6軤}i˒ľDIчAU2~2)Pyrt#>pjZtU(} *J JDm3Tȝ53 [#޿Ijގ p2HkRαN$-# yr + +2ab26b842-765f-4d94-8cbb-1fc8129b426abec6e51c-3bc0-482f-aed4-6fb32ed00cdd4 6237906a6442-b806-49dc-b80d-4ca4d26fc2396dad5342-730e-42d7-8c31-e08c2fb9f87e03.4638.25212525013. A!"<٭tpfXy#1"Y  0@P9cű)Lnm} > I=8;NQoXx~sƒYc4@o %`̀7\@onqOx?bԮ*b57i30303޹)H&a&K2SZxXTQQI{WD! m+9"! MF:<ٽ-)#=I(q?sll=NF dB%V)j KQ~ +XZIdl6p%d. H$H@m(vډ u)C`F2J9ɍmnIB0wuO{Kb2qTP% !1q:Z' D&+) W14 D 5`U 8$Ԁt24(𿐨BM&r ϰw(<\0. c$h"+rKU;He.g ӜUoKQ!^A,0|tF$$ +q+r1>)"6:Hv;Q6 y-'K<$Vd*' n +h6աFB&w=Ȁ΍_l\q t8X ["[K|q{16kt4jsǛQ9Xiw94ftϱsy֞s{sS44@آc6gylg +rϸ7.ѽyϼ_;̫jL! u3/PL@(漀%Tmt$^&z!'" Kq ?>ܐ&Nɋ` ќoep_>in\4 Z{fcqלbrw)GdƩr5Е"?8=)P 2 /C2S + @cHpHN"ϥrwF@`( pb"9(X#TmDLΊ Ɗ0闷-DwC".H\5U^F6IVuzie0gm3-sS`m>DS*@ y3k4є6s' ds&[@hDRZ8D7DDrvH*IBf--Xee ZPBߢ +Iu^AS9+_x W`)@ +LCN$: YL*N'jTrHcGF(4`t +PaF"2F>ɦw>`|FrSY*9c).RT]$AZCa0r4Iı\hY|Ԧ;UOfbn>L\h3O"rϽn=DM3B"iژ;Z7/'x9=j?b?ĖPt9fo{"vXmz(?52u;{ЯG_k.Ќq'42m +݈q< 4]y^%am-wP猃/2 eZct%WYtĮr"F#16]ң:P4GZ*8vCa3P;t$Aw YAe(ah8M&40 +O&_Kv-s$=q4wdfaMH,`]ƌ +jAxRd&}xh &-7CYFWgIp< ȐMn e传E ċEV]bh;α?Ee_ycDN.0yt~u{Ԭ<UajcjBh,2I \j2)JqoĜ_?fZVM 99jX ᅋխ dAtM ցd,:F9Lx?"$*\aXs,MҐR-jI$S T8Eg`@4[E(Vt'di7y =eYX%HN;ÅTOr{2]tՌ2 +.rW* WNYh,ek%M@^'$C8vzrF,_.STDm3*Y%q&y2ry+\wsxq+H=Ȩne#0\W&/5M,cՕVϒ3feC?ݗhthmdwT>f^(j0Ap?戨?)x:)OeǡZ$&ix^-3ZF"o2ӓmO5ඤ1cjr7x6w\:ҘE`l,V1")A%xd~GV#wϸd "Rr󅗐6lC'#Н06hV쐎eQTI.% v{Dy-|T.* M"ڥ+ Fr`#i"ཏͬкApkTCbԄe 0@-2V#o+k4M.R]Ix{K?GW],4 pziZeEZMya@UݩҼ^ +=0dcZ3i k fd""OH9$I(֤n@)6P''T"uR(xejC:M0"Hڅ,M*IV0aLÂ~f<7 +}h"q>ؘYVn [4% +f u+w4:"qN6ѳEhE"!a DQXtj⁎)f$"bFh ]C*?Λ&+=0́~ҫ]~ eTE|3(i(Uޘ1 cfШq4KYܼqwIS|,1LLm^R(߼+V킍֪}#rܴu!X=!:Mz<<*ÍbQ|ʪ3Y kqP ,\B |H\nVn 7M+WbhnJhn !G2C +$SL"w܅]SxVCA J>-+h?˭`pKnf+㶁ꬊ]'iC{|9G*Dp(#ݕX=VC1u@C$,jԻRyʝ>*Р 1}L+(LNBIéŒic00 n\1ݰsFeat0hTŅ'5 b5J>-fFqՄ(fGõgK̋gJsLY牰a+j+TgʈWoɁWj C)!m!E?"<~ SLt_+)”ZsJ<$X$b_c?ph2Ɣ1 |%Agd2abR3p.9k/(9WfJ_jT %(ģ঒WJ(c'֝" [ u'yy0aF0ϲ\S|.b*ks ٮcђ}eAE[\!лWq"z@ТH].ͦ k2 m;,H571C4"g^ F[wY|F€ܮN@t8 a,ZRBM诌*6[ke 'qTZ@,m/=d+xzU bݥ7"K1Hk~FT{c$ v<ryPF4j¡/$gyi5ΗdJ4G7 Zld,gUW2d]RG:+ƀ6*g~Y""q*?l4J5-dM_0>.stO^,I<Λ? ur.bcU' H߽N}S DW-md:P~1p-|O,d s.rX0~+;&aJXF$0 + E0°qP^6G3/rHUБ%NƧ9j:s'sjE*Ν:ΡtpO~fI(fgv肼i GӤ R4D^sCs> f .Ξ ?YfӳVKl`YnԢj](͓ E[щ:g®UhQȂyԔis:x)dgMЪK$0(t!eItte+E{ J#߁{_Eqmʣ_$rs'#y,΢x{1Iwn80Sn+#`#ekb`A:ns/;iF; _]A̰rnJu +׳H'BT<NLn;Zg/gmG`$"pg,?2aˆV.Ү:qq8e o@."B69ߤ<*U)X7TmS&@6/N4+sm9 *YJCPId,"3c]U5 Ef@% Z eoD#m+1daXX)RJ Խw-^mƝOFq؞&_Z櫳*tR);q8y,x,q`X<L8Y-4x\bFH@8 >PDçHHDpy^"`ԿVZa`q80FG]-ơ{1m~8<3U9*~]ur&Ue8*Gca|Vym$GoK0HunT8X/Lu2v:zeZTA."L ǢpX<cXF4bF%x.QLx, f? oqFbTTvBi\bym|q7c]*z(Ɒ`,`<|٩5|ӛ<x,ǂ`L@h +K$q4`. H_SR=[{b[\uw?EVr"+?SGl\ōv\+q5sgEF\|QױcBgWy띌j=]}j+ĥ~򍄣ؤRDEfNI`ё(3Mu+ovjmfR;'h@|/[d6j._w<|c|5P}hX2 &2I.L0x`L } +/E +z*4Xc 8q,q06 qZՍ3aՆv*KEjvSo|ulL1t?;T 2;uՙ:2/*23˼˼5S(S0y  k*&( v \*FDA(PkLT CᠸP@**Gd1>d`STTLMSk0 M<TH c P +IŌq`ۭ4rV\K k3kc.$tlVVOWVkMw=W0ZQVJ1MHO#⑐ǮxC\?/ ڄu|kc󍓆ޟNa#3Q}jT0f DqZYLh}W*[]7 *STWרB۵NY%J*vw%6 SzƁ>Qqd7*FѐU?&5[Uj_ۼ 7Wicn:`؜֖3S)l*ؖ[/Ur;YrSU ms-ըKyjfQ{βr4t=uVx,$z[sS9FB[6~=/զ#.^Uں"#BV^*t5XAyRk)EƁ-n _-e]دWGUZ0Viף)m\.\u֪0T*׫5Ɣ:ղeS +I Ra j]1YMBpqa+o]ܶY-ă1#aʆqg]ӱ'xꞶ>H{F4 hBm;7&:1-[1WbL,c q5xicyyw1o,sRC,m 8+9z]6Mj2΄[LKJ5VƷ Ud)31o;7W.d/L@cc779*q-[˚qزլV+_7VC.!(Oc_݆민hZ cG\+^խz}duɦh*2LsYSU-oeľ}UNVD_tV]++^;~%d4L3 CG32uW;"tW=u܈zz}k}h]ko+neNSM KNKUW+cu}j1aδq_N ]ꐯR]og)b8.f.nGVF>暬y˗_]s&a2` o7OOu_KB\Wg VF)$9 fo+1_uש` 晐H4A'Bc=`@B&I#5X@d16 ITqׯ\W)3T!2$\(HODRB!EX*P$,A "5,By,8`fH 8Ѱl5I$0 Ltxk&('?Zץ*&*gr/';%2[y,0 FLzp@f4y,0 DUG=@D(jI&(, b"*ADpV]ͩ?66׾7>bUxQuN[1o]q]3c~\9_&ޝ:Oĵw޹*ײkj&6.Q^fn2#7 zvs"t| 0B8DP@0ys-}V?% .@! +|cE Hy.UG_]|}β]RuKbDH~D(4JBa`H@aC1E2$bTHH JTARP$iQ c!(= +Py( MhQ@(I Dgb Gbi.Q +,:i"Y P$eRD""Aca\"TIhHҨ簨HdP@<0hz4.\ +6A(T*P"P(ق J4= U,@GzA D2' HJMP$ Q D&vA"pD"(GwKs-.u^λ荮kq*7sux dMUwxS }ߩwS)bvg4̝`ʊ7Ch2ぁѰd>Wn<]DCS`@"0P4.Ph4L{;?uպy5sn"./zݣej/O|"&"l}]ο~|`؝rq_6bSMG=͵<53_OB|f<ýlFǬp43*T9BP@$r>zb6R:qa@ 00!!d2L<Q|Bi@vϺ5jms$5$-:!>.aQA_(y +v1{WGo zz;^"9wh_vƒkgWE^V ՘5JYr;A:`=<Ӛ)5)=Rx"f n4VMT9ndR? a-os5'l5(vOv;؄x#fn@Vpl)B:&l.i0oSH6 fhڢ O;fZ8!?( +@DM?,d ǣ錿G9l3IlWr= T6l3+lOfWh[W}jWlvv▄*Xl"hcӕM6R%9DRNnAتT9Iar)8iVJ…ׅXؽ4f +l}Of֋gXvdE}NF~ $+y +. 3cGoPQң/gu2B:]Kg?=ҥNvu0|D.5c6`J].rF\42wRny2XLȀ7XVUOC#)*ɁH_7?@^Y<l6&PfMv{8mMi`IׂȇnR[9) 7( +d c_Lxz憆u~^ZCxN a8:5N ^ 6BTqQ9Z'&Ӿ!dmk)M  8>Ot#DTC̝J> HB,tL"/b0;r\ʞ,Mh>>#w}4Aذ qъu{^x@,$8 vVDc({I. DO(ZskC<%DM0 +,}՝4 CKfelDAB!LO}&Ev"ZH ~{31B#b2o%R/S#*4Ǻ׍є6mgɫʚ~%hrƲ% [ 22}zJ5:N=q#û0mv!s07]NOe7Jb9AB"_)|sr˼% PlA[xz9YF ^cpsu  +ڌОo[lXr##Z^~4b3׵xU|4r;TFut<;)c.\DzsCTU7H45*?Kf1'K\CRq?؀aM be4Xٻ)8Pm.vBLbi~ +jTE?"RSDG%vؽz !eQ~qK6#1&6#e 5|.^`qB^8=,R,tV;h#EhX& fBPע`-:0Aߊ!G+ aP.uzҗTq\!zIJXХ)7J珉 ;)(w7O\NjHgI[mzJAC'o8i8K~QB: ҥ)Ws&~_O0]ǙG `TA^ۖ?ʅ8H^|ϖP endstream endobj 22 0 obj <>stream +/'4c#:>'Yb'-,O֒$KG_Ik:)iы2Fӑxzk@wDO=XfJy!$L}4C9 ʿӵtR߇"u2-$NJV=5ftl='v*<R&@vՊqxO,[zM } Yr$OjXL A_4u@T6Y(LV(:MZ bsЋhyjucnOմ3&'x4˶fOhVN3|A jBbg-uO]Ҳ#U?R%7OE^ KSxXAb#74VHĩG;f-3d˙}y g)9o0._'15j*w[5ަ|D91$ق frҦۄ,zK-v h"Q>IRjѽ [Xԗy\j]۵ Vo91ܲ獊`JC +lodp$$w!+3#u4SH #ю|>K>ꝉ?p2ΈOJTm"/[!y5ͨwlPn܏j+2G<4UxG~AIۜo{& +Li83WǷ8j+5W/:{9jz3p_ucSW+nװrKޓ34<ԕ&_ +e0WP`0UqѤJQU)\/9"Es1)r!ux>+,7hJvУ8- $r9ȡjdx,MefZ2)3!NN=LxŤxV+:l0H7PxYA㑕pmo#$`qvl͂*e ]֟ +U'Q]d,bsǸՌMᥗ ++f/ ]*gdo2IAyNP Yީ +qVѹ5/.6`N !ߘf90MI$L; QD(4,Ȱ.)0l0lDj\JW2m*>Fr]<{[ژ n ^kQ +Lu FOEgwLθ .ځ)LҎ蹼{ͺ&|ЭI9X~@(օyN邿k{AIX2I]tJ =Ҁj^0kc+K9 +s9Dos#,6ȂcCI}Kmr]1Qο NC;OY?!Vg ke]*JSgp~qYEH.VĈ fܭȿBƺ`)3l |/*[N[ ۥ +mv33&GGܘN*qIq9v|Jt+Ҩ$%Ψ[O~Cd̼iOH1`z4ڽ^/(ltl-2y:SVue5D}өh'T.:vnlYnWR<ԥ? PK1wPc=g8m vi~Q3+K\bHP%W(8"]K(3~қ%^P6{%L"98A1GDd"@k+έMG"Fh=,% zF@wy%Fh1#oL!_JԴA+W[ٺq8yZ!LWV;`Q>L8NNn=exE2ͯ ? }yZҡ%|-1w'xsմJ_ }_˻u.ai?NNٺ#dЪ!~є-b4uU}]XVgH!g%8mla,a~ƝXBAF,P(I3[ѿsQY?6}\Vd/d ݈rͳ:@k\K:n2v(%s`P#'2)J$|VpOxNw8S!dmmI*S]kS WWq:BC.B; @ |IJ%ڳF3E2Vr݂KLc]h7X CH8FU\˿1\D?yd-U!rIUQ䱂R2#2Im,iJ$fX] c ;u q˳Hn0c! em;wBx'.UqRf <^V_~#KKOP,YYr:JrDqz[ECS^|ժ'hɒ:st(YN t9EeBܟ3ok^.9yǫƚjaG23QryFv?jBfS ‚_:@s8B/gح W5ȥq0>\ qn>Fڒkd&KzRd^էLiaiZ2up A=1zuN*\1U!0鏿e6B&Y1tފ_ 8Ϣc~ |Z@s*PZQƱnաBu_P?;%!FJ1qRj5\u {/mOZKFA3a5eiFʬ-#T%tgVg=siJx[R-X9;{`辔Nl}]|fU,K t lAlͧҡ#}B)+oNk?a]n1fNɀ8 9Kj1̲10zhC1 +XV outbVㅥb(G"&?3k K7qacjL(](6q+$0 ?y|\y˾cT +̥ͯ&%C0V ɘk F3#TOfz[v+KO06^4d0-"4rMI0Z#YR2IMkҔfl|l52wbUKaˏg#N:OНa`>GP[NKCzSP?a;:D9̲9!h>b bDEFf*)" J803n"cÕxHLR<;vPi@'?udcX> PP{ՁWJҭ ʨ }B/FxiQKp0ZU9Lt|[nHQ[Q2嬫EqT82@ + O&GdzpڣGIS0 p 7U,Ss(0?.b'MUt`z>[q#ݮ"+qRm e{<5N*̸ +/˥4(clwp.;7=Z,QpYcSC'Ǥܦqp |\*[-&7—=h89LnjI9 *Zd{^5lrR1 ő@91ĨᘥI$ʇMm'h,>Ozy1Lp_-~gK2n\ُIjZk!ғrW +rU+#{NjLYaRcNW𙣺 cK7{lCZ`W\%er+={xz,R_J5 (Kw#j[s]昧bfq# +9h6]rO˖COk{tOMA\˼88>G@< +9?Qճ4NGžs›15~n vMѢPN*IKw̒ ? JA%s+0s92gM(<:51l# '#&b{*%ϢFj|,أ9 ylw+ 1>V{O>|$nƟUP^Pg{T{+ZÀDJ@n U/qVB84ViJ_ϖ : I #/Hj;4hM#-0X7xvm ? D?W']7F9Je8-O15d֒F|L- 'GHyLGѢuڛ[-Г!s|1 {2;nG&OF- OR76cvQ bNspVPeDX H9ܞC-k LZcwAC%' IT1|GvvfDj{b~Mݷ+ ;E҉7W]H qa=$=y} EE!x2T_s#~DHXJBg`<KuQ}cK񥓂_o'<3R쵛$[A2xl7ܮb) +>!OU)Y(z?3~>=cl"YcӕƗO_ ~R. ՔQÜWǛ6Wc#RͯvupmfZ2FP[*O^ѻnn2b#rzUiO]iIO=|а@T-ZsV'z +_?LltSg 1HO+_C!vL!6.nkG#H˙r)% +E 1 l-(Oƃ& +BHLv˄<+ +6a֙ՄE!Q ΀4Db;b6lCWEߧ0:.KTҦG} 1VV6ұfZp?MHn؟)Z^E.6>vU;bh)ʲhhl&Ca~*=))TC68He,8sM {jÞBxMYj&#ϓ Q(g'`3 +r7:e%5 S2\l6xiKMİuG-.Y9&ih9 q4`T%ȝrE[Nl^z{;\1M@~nY5)uXn.,D ɭ UTD$Zg5Mb4>/S#'|WowCm؟Mr/ɻwl ż >2kJw'#ϸjZR> eK\G$  d*4гSŸG>0FJU9 lzn/J-p&|{7-If &Xh,N3H?j@졄s6UOs-H &Pv71yPRC]U?G_u lgJ +E_ Nȹ8bA%5E%?8-+UeQRO» ކo 9M$Zx~p2Y7ՊGyn7-d|m0۵ߜw۶mWp8iv uٶq8%kB\Q$/_%+ o%C!\=:"i}ynnzǠx6۷L`p<0a0 w[ v~wz0q7h{0 s9A[,"]-]y\-^]|8 9s~}[7-\w߷An0;qy-d[i%$(t 6ev~>kruX]OZwa,(ރ˲5̕,ЈB# 9m):+rXN9Ʒ+tFꬂqaAj %ghod-r9#Ӷ{ud}r"(Ҷ+]-|6|E [90 V|!ڧS ÷ . &@n8 + q{%a\f{ͻt,qza9ܸ w8qׯ~=aAZo%m2Mde]N]~.KR44s\w9?+{ltkoΗہM6 r| w/hrݝw\i=c<,p=7ˆ컋:^>,;-&&5׹zGmSCl΋xK[m: j| +V=>"M1"*&؁^ϏݡɅ+Hs&T\}aq_"#mf<-`=G,Bu1Ǡ@_unuH.2IS5,JI YNHq>QwIJߘ: ӹe ʴ03SǰT\r 0ZIH`JR䓰ZHj ˦;.U><FHd#2G>PG#8^ @LFM1m# G57\5i%elY%Eu`p&Glaw}B PV-kl,&`1`E E-MY 9;;$'x¡<%1"abDIK4\WI!8RetJK.(oڕA&F2@rLDT)W$$O:N{x:#EFt-܁$cmq26֟Ik$:EXD9 Uub@hH ,'T}*q#|?/- " "H201/5'EW4$+QчlGm3CXK(;)b]W "B"ʀ2G=yyۮ^Ґ<[ElRWk! +o^uiS(~*7\dBD;908qAѰcݖMB&a>H5v5vசtf&:^v: 򆅈چL~ B821 7^cXJh`ز +KVLVA3BnIbRHx 05JJ>Hs IBvq Ztp0m)i<8Hp99O\ZXm6 +mfnn&l/݌{[fS-,UfE8 .3 +Q!(HeK(jJ9$V(& +  3Q &:}0{e/ @.ywԠ LO + Tg IAEe^ʠaE k S r 7 t7' n@A`!*ږY\K3h@ZZK^mA+MOqE"-9Ee4ےh >sL:ESCf(lRh[ӌq5O'JA(i|k-> r3=`.>>!/>>CTB-%+"^J'4Ч- ;o0s,o:Oй|d4i~-aU_mjd| Q_~?(/]j>>Z'ϊ2G?3z$oT?R߾@H*O8Xi}-u/S}?ARap8 ѠjZ~-Ǔm+Ϳx:/F ekwShiSlt +آ<^0gߕF4`„k󠠕ʘ +(cE7:1:{BT2ǀ'1ʘѬޣ,K%R]8\es( ᒙ /1MeVj%GuwX"Hz6n=%Ҟ+vQFrr{X#rs (iݨjl,K>X8`UU,V,X2 󘠏b\>u}uu#A(YDf,gh:G, %7%[KXV8A@܌@6]1Ve뗢|4.0zE6}زʆ_SbUזYjN*V*fB9v%JEH[ƾ, r݅8mm֭@wK) g([YFTUf )#΋dr~Ə#JZG$ϴeĀM \8EvBjz,*TE䐰hQMDơL|/#.|y~dPCIh?j$T e{N|S( +*fR:bSi2}˺٣t2ٲbhugAVET$~ +[s hP]b5\ìزO(%PcG]7bl*Pey(T փҤt=e60$H N 72%Ŕ>/>{_iP"-!e{ȔH<)AQ()( A ZܲuFKH h. FNYd`b\D2e2= śqFXrJ*!SE@P:JiP.qn+-"0>&ׄ>(/8C< +VGRJLBthOن%-%^GGBfoT^LUCJ~Wn;\=3oHA(SX#QH9?mIIN~jbvQ(mI[9 JyB 0hDSrsTʍ:%$OJ23ƆR`q)v'+sz\A#ԖQIGVܝFXaOr!kiAM| c]P"Fz-O*V=)$:7c4XVHDj |jp*SGzHj80SfP>,P櫊O*W9xt+L BhhTLv SzEi5[:I$Qu,B;kZ#9kFDՐ.P@愊# z[+1<:$y(89]Dg6Fƫ|Nht ٲx4*~QKgdP1NRTHErTT i]64$- +iR65?vi4gg2\I2&a4a8\$1`Ly4_Rs(.׻\r +yirere+6Ѥ<< fc&1O##m4,,OUvTW! ]WvqɨKXaeimzNWRQ`5M^33wB; һEy W\]GlКOeґ͎J(nri%TL%KHR W@hOhC1Te4wX [ZdZ:֨4,uLcxZ░^ˢ0!a0e#v[XST:t0\,[*J]}cKǕ+ 밠Պ鎣 < g{LIDLFѤ+?!Fb2J JbCn+"CK;]b2x < M`O4x3\(WDVvS/bDlD7EGviԱ%eE7,rvʏ֜ݰqTbޥ_aoTy`YV ybxUl@s&䅓ߌ44ƹXWjf 3E =6 JBN.4(,,E8$bEB 1ŀ%Ap/ +ˆQBrЖ]y*%V`ɛ+ +;'MWKcKϲP)z׼^2V\Qt}U\@zn <zvu5n2 Uo _&W/+R g_Zfr8{]Ƀ0uUo)ZbdЇp5r;PH-c +"63RP|ܬhZ } R6-+{C|x͊zhV@9BRN`T^e.+k'ƳREhYD6ry1xLc5p79@{ޤ3UԷ?Q=VC &HOdȳ5nbLw1G^*|ҀoXE ) gpϳ]6NvlBaxJaEHġ ǀ>T0 ʦ ){*r~Z]'gSA΍Uh.p!F*݄/r LBen}KR/EsW啊S@~]s9+`g|w[@].`ؼ͑TDaeeqN;(2^#Lt6Q28! +82j5O0܆t9WCKDaM(&|F}`[fUZ؋D8W|wGq4a4yD.SIHSn*MSn+\JP9] d4X4&x*[;j@ fP+7Ί1߭*:<,uӄrʶeC jP < PBx+FYڠKVՍSWpŻЀϔWо^B(WK6̿Jw{rQbc,FBE" b Åeu2k>+bBiCآ1[_9[aU3  @1kgji q{<>vcJsnS.]6_#~yYXj2!wHIdlC ⽧3 I+ ph1"#Y^b#5-5gCB~$aZg=\e!qF!)TӕW $Lb8\WCŊl;iW2\7Ş=[A.auW1fA +?-en[tȏ.(,NHWG7SH _Ve".:!Ep)>:vZ̽R@ٟcHOG(!#;ֈE-ٓC9;UY=@NK1edCXu\#{/0)U2*RΛ<5gPGPS&ϼB']d'<8L/*Ml /J](E2W2nM 48)|uX/ X;2*PRai۪>#]RK|_^OKC})TGqB3~MVJ%iH*VFQ_ K[[P07aZK)fFl럷( qcruvmH&%p Ϲ2\^"EKݨӔ`&ʊLYE%1 +|LLw)#jc~*LW o733Vk%Qt!`1[UH.*TՆS2̞G#wY庾/)]"8q+c{SS x150 ZkR zmZ׺t" +(\DǾLLIw5 ?8BjAoe-l'#2yyWf+ty⋉+#]ai`#©E}N> mŠ~I9A]\Yul5}$N&O"Wz1!.h%-C ė K}olSȮJdLq!kVj(cN`#r%DDBݫ3Zh[0pi=&  bN| *uMsʞA:%TjFPiQ`\sHږf JwҜjZ_wE=쑤jes騢U*\J3Lb.|> zi ss +_I#XNokݯa+xT g |8Mݭ<vcTǯt<QnL̽r]Ï%"1iL8! IȬIm^)c{kc;zrQ!|>5ʺʱd]i:D%0= g*µ>#55Ml3FW6y۬u%.deBf!{/Y[]wedƿ _cbeֹxѺM T"bAuTEW&IeSplp)&ȅ͖hXZLeHd̘jK pz.0PV57aӘ`t#h\}8[i.ӧ'rCh miˡ dihZlWݜ!{\]dJ2S5c[߉Pŗa)φY9y-56 $fG)o9AU#(SPK'eZ$wYd4L ER!,8 V9' (=jSQ_ctz-8JBc/R7}*.'_-9t.TPTyϴ[vGt"D Y3tL4o5lQ9ΔDjM SOӄ8]b6]U,%g}n2,g䒟PTd™-X1MZF9}ڦ` H($_.aj^78mA1xQxTM"zG8eh CF0q%fMޗ|aBPӫ2^/ 0@h@Oǁ !/)+k68em%]M NuXT0q3=-t^LG6= {ufD0ɼVF"l583Tʊ`TR4 /H@x. l= ku7x? )9y @b//3׭uV)v$š"rP5j%3qN:)lۘNiw@LH6Z.KG7&#󠠝m$`sI8(.k2'ckУd9OE<#.MUZl/ߋ` eK^ndZ#49=A +W/1 6^S8ead/Fc"pf93g%kkAn'oHs\z,**Q=x]*W0.^mUtVߝ|ܻiOH[`Fe&+Nfsٱj()#?: xyzAW{( Sh%.ȈT6m Ot;%-A!eiMw _C '8wƪ(c)-*>p>,RfO%$wN2:O5~hoID\ wIgۣɬL՟t?^g,فQˣw'ז9g'D.SgMxKQ}?5mHÇ{k3ą<0ޓW,:/~-mC՛gMۊП>`D(P6f@wz5i~Y }!P:{\<J0- .m75Ӹ1w[p?LӰ˭4)FP_7gùZy 2`L|mYo`|s;]p_5I]`:1EN$x5 w|Vib!u2ky$b0K X2=A*2Ȇp6ET%{ }QQhT[큟Y!>rR‹\̋}d`Gm<73[HVk&|6~*{/i6|QVUmbԍ)J=b׿wW= XHDuFqj'?XlR ^Z9Z9?_?!>;1qIX] ~z=ؾa}w6TG6aY3diMvA)UNP + +K#W""|)c9أ B)3b "jV|NsO- pՄ >B c!8 t7`Kj4/z_jP$,usyBׇ0ӲA^^A{_`ؼ2ӳ-IqQZ>XA 5ɚi#МJ[|mF/  Wl#]Z) u2q11(+Q@ ш,GAN_ 6DFk ޅ؟t!P2"?'k)}a`qN<6NIU>?Kpff4?] ZP"s&k;=/2ExE&eV/+dN8=a2:.n=6i<ݍx)i@^0jՌ ^c*: +?NѥdTXru:m$hJ,{B Lt+R\ᾡ[J&:Ɨ4}d cqHٜ<KQdfl6duz5VBktWbݏwo$YYcPӿvn"ցXg@(uUnGUmtaD8aAG#cG&}U <Ơ" FӉw2C/ W7AzU"%|n̽5pR4x3 c|,L1GQS=r;M| oXZW#o&JsZd!dg rWee2܈=@bf{Io3KWP5|9dҤ*ZS0o.rs$6LB%,.]1\J-^D.s&6#jXFM$bc1\~"5h>qd|HgRAaCg~9B$g[Цn20iǨb@C3Ġ,񮐈baG 5Bh)3fD 7b> miHA]#Vj`ܣIN?H TET{YeoxꪁٓnYΧhL7<ՀB֡PѲȨ)wD=ݞ(דe<,[Ǭb.+ՙ@Kk d7`1NZc:4m׻/E\\VOa}f`9+pr6BG)CXMG2>g"GFrV͡v[!85OEeDh(<&>FVB$U9ެ@V2@ +6d@nw, +K!e A){h,-35y~D8Jgݦv@E +YzYa%R̯o =4d;#D[.rSꯖVŹk|bm2Zi%qR~fbMU<9X]dS拒*GBv.8UCD6;j#[a}}JGL绍1BzcnD@uIzrSJ_. +ϫ,Uc(.ƨRu"Bn-> +[uໍՐ;X?-E20G=>%}VN +fbWrkN5׀Xf~ [Uoc0 +*;UeLaxț(!HGd;o: +cyW$D_ MCi9mY Bo D.FBb#wPIYn+|&kR}<)v"zXQ&kq`74<!+OxiMoT3y ݶ/߲DM:65ܠy}ى5m]/J4*=P;l;J"WCxKjWDRýћ}t[dk2j-&ϫ*X #zkGĕ% HVX_j8 2QCo>s)n㗯QՐ/oLDqJՐ Q$c1XAw4:(zM>maN֛Uo(nX +%a䫡$-WCt_ǡT6G0g1G$V>WCp5; ׄ#A(4z=, =2Vau6;Z,N;x2%K!FTB9gG.RC2zb sưTwYcܣ_%|ڵ!_!@2qdr<9SlH}s  +\0 PSxD0Bpӵʺ-VȤJ:$U6 4rX$f*-<6j#[):s&:@rB$meޠe6/WCө;˹&5TH/-ѕXEAJy85X `tȡ< :Te2j2dg&ӯL&&6pi#3'V@ˈ}Ќ][4Eۚ=fQ=v';ubU6jnI1[z9{86bZݯJ `0`ArݖCOFUQ- +E +|4 0}PX/S@RhIbtV !#.x;pďy]üaցu fM&Z Wӷ6xIZ뙶DD/ x/Rw۲n3#0|0`D`a#&$<*$Q Hj|fxcXinmzP;uf4zm{̳Ǝ-ܖc(;B,wD ݑy߭PPLŨp,]JL"1J58|/Nì q +Iz2aЇ9 sn&|egE1jh3 M עB9 D7ZrodV3:Y=PSS,&{Vk3CJYdꉙƌkwm e3}+D>͆xXj41ü 6xgX,=vBZN.n`%x0ak*vG1!"- xTߝDYoIha|d@7 +ymx,%Tc:0\B Br FK̘uDŃIH m<ϲFCf0oPH*?"`4z0tg#ns9@SNaZe4ZNa%Z@PĨ\5ч:a)ٙIDvSQi3ۛr_üa,Q0wClvӲ% +K?Ν_7ϑsZd!A qˑx!1+\_ A䪄a Mm8;f}2 /Vg>- 2m@^ļUGe 75},U^"ʰܾJ +acm4̚w{OQR9(1T (ï`=G%;&l8 a1P⭢n kA.零Rj=BM3_CL+ke0Z53y񯾦PWL<;r mI+ޭm V2 oo[f4N_[vbU6O0 +yER E!wt{ Ϙ;BySuyG|Vj_+5, %5DEM  VCY" + {潘e7Ig`)鳒3q7` Z$uZ?"zλnEf# *X:Z{c:Tl}pO)k+mPG ݆cj,#mjt1+KX{X s:zܿXTCԊy௔Ɛ&X [NmCANv/3p/ %2bFМjYޢ\qHf!1 ]Y=,^,2F(v[$aA@4P/x#6Y7kO.@YoIak2+%^31rro.4$99ج1<ފBY,?1OLUbQi-?d{c A=P D]}C6huȥIzFtd)zwFW,*oN!;rwpTFPG$!h#w'*m9tiԚ%:DN,/iaID!w%n2wV79Ļ5Tzu4F0dJ?[J%Tӈ8U҉c|~ɛHga1/E,qw6d"Awb!*NREӾ%7xX 9 f龜(YflY̺A&2S@ϳ(%x*=) 1=G~]B~z#|"gr\ֻJ#^n+MhJ ΐT 0mqDAdAm\ާ=F- |8TĶ\ w >t8/ˇa:$"}pުe6~I-_@{(r?d(3)ȑNeMi36Ԋ=m2n`$$Ș/pMO#00__%?f/Bʂg'8mtz>@O;jk$EH&uq56|{gݫ>])u|=_ _tdȑz3Z(F+A1%7aJltFRC2f%]+r{;LDJjHRw%"ߴT#=dNG ORXKx[_6sw;c xl@@6~]QUАb0K0B%$nAVW=LÖEkaeS|ʇ0%O@h\˒dr#zLXb°ݦb&:#\V0wD\M؂yc>6!XFN:&MRȁPIL"3NH#r#:JJVy[(.r&irR">: ɞ9J 4B_`c3F5?`(;n %yo/-,# QLMԻm]*mxϟH-rډY;oDQ|9w00<Imm@vUY<ŠLy5UD>ΰCC$JqN,P"g.5 Ck+. *z@ Ś& +\F+faQ002Xə=, h&zY!&@d ٚ21P@%c`}rzt +jbΧh[VjPB"$6iD@3NQ! 6˞wh#zWWi |A~FjkDN_=" ad0fBBqc!&Q 趓H\.QUUi0ׯOd75d=O3J=Nc"Ή!{U%9mXR`3 +?=B0( ,DҨ +]EG!a!LwI܌iB)Hf$20vvڤ! XDnXNht/ %c*03D{yڮ ;@}bD] 0串J_.^ٍ \- =R}rw%McTr:Enggٞ `~`F'BDkh')q&rHD5 㯆7$`n,B!XA-rm_Aɼ-!6f"T-m2#o-먡mDśӬVThmv5P12aq]aLZj^nauȒ=&, 6vMMn[`SHrzZ*ms^E?Fh)~ALI3oPC4^[+~g +歁;0|"qG5|ILsհ jv]m'Wj&8^IP#؉6PRd'ҕ%MMiDR9|FneYDn}L%o-yYGK&OlFM4K4Kԛ~k ?}?4Ҵ?i442}^:?i3 Kq|4|_>^29?I9-F{.=~ɄvSi>7#:xKJ|n[|w^iGK_e/˓Y{Sy?F<ҳFN}o%Ai~eyϷy3Mώ4{GQs%.KtoS_(Kmn%Aj~o?47'4-ic OSQizۧe.M%韽4=Lry4HҗΝ7?=*){Gw]vrRL?$=Q'D}ss R_^O$VQ㰑` S &; `$LW|5jHZG\[۱ O_ F̳ T51A_ Cn";&Qs&thhJh%!%lbi7)+J*M~DC$I9$3 +iT: b}][n kxjGI'jW,J|^J OQJi%a ;jUMyyjb/ͺLmŻS&fB(y8e z1v!Rߔ;-&@@ SHOÊeTs!efzU? ]WMySo U) F@,K׌v~wQe.Du.+- ,o>D,X?x?a!6(Ԅxi$X ABjˉ``s[g()e>Yp8pa8*nDIՉB>1Z_JM M,Vrn5zIJ3zwR<"v7;B{r(xQy~c=oq͛}QF6zݸ/#Y[Yh͋Q81  ;đ 27wmI@GDJiesO wSkCnĿZґZ>S`fm ۫ttz&C~Ǿִ@Z(V्I,)ƹEn,, 6j£gg!Vc}fxg3d>6W" +2b&(M# LZ(L+l&XoQvn'ȿ+~Zź0^"RMG(h*R~LgvxJ s.چטAXF9 +NWSMM\ %<P>HCIx +o?vmo95_W9cHgUKS0ouY&BX-ىUsI5= S . G .p.Lq5dc2ښKoD.\+O +ЖH@ED[K^"QոG{@{s;}H8UnPj`5cђ,C@08[F_dd:oVQ3>xk1GNY; pVO:=+ZlmkEKķ}kQpr}{$z WCso _ +]݈M}D|5 (-@``Kpsw%ydj*oR(+i?hjWJoH] 'vXۥi#tRVZnqՃCNџJD>91x3kZ"z=U68F+ }uwJ/+oCZ\b`ojU#G!&ăcbIĢ!`n0&}?.W6Re (D\YfW]]P;3?iѰ_xn6wr ҅Vo5)&BeVU\zPJCn+U齹s^ +0k\\v +"qq#\-R<̈́?GnRizkJaF6 ~uowQV,2I~cl*Ĩx.>䵏r𯏭uq#_ӿǿMb I7O+Yl|"&bbsZWA9/yLKJj$'"Wo"uX\ 2g%5 SWr .#F1kcj?#fRFyZ z7P~o9v/. ;A.&NvRE?ҿpԭWȟǣ*<) >jE +v,>Х;HP--lQ81;bkmc/> + '΄1SVDy JuMJ6|Dy8́,8;}Vq^bY94PS͐mH]"D0Y(X5Ռm_ K@ߵ% 9o-FzQb;QQ.=+z\PbDP +XPAd. N\ 4 :`v`XU:,ue8I*ǸJf7Fdž$*i͎K+$A bak$VQfxrpPJ4ByHn}EB+kQtz/x{aue^.Bp^T²;qIsI{V^&=.z>#hHuQp E<-\_#BZŀ +0dptjB)Ȉ|a3eU5gm3K<>}Hư~ fGL +=#r7jL5쨑 ^/%2Kl]7Mg[wGpio$ֻ~]ϴ +|fli).E T>!3Hr gcM`e/y')][kP杁=TA7ԘۼoNhh6s)}>%Kf5pMEwBwss>kpO= ] T B,{vMF-0#^T%"H$^Omt5VO-h7e2QF:G7 ~^i2ĐdEN+N./+&g)'fV"BUA)Fb/ DuKјhڗ߼Nx%Z7EO8Cm"|Y:6xG<DDE@[>֎Fl8 Iѧ%Y+ۃfɷ#C@t$ڵcyTIOgZ&N4.9r`+!Xr9X}IҙBNh:뷺PYMsL(cKAZW7~{ +>Gڋe4h4*Ki٧Gځb{cM+)Nwp\8{`Oq'?66?3ƷsaϪ80TT-@%v=9NB jC0PExR&Oŝ584+;xޤ^O P.>CDt^A(&ɗ"AX)}y:HWUi- 1t˧>\ ёK:Ώ;'qd =9b{cNtbhPU?hwn,urnέ5䕽`ZRI{#a!k,ݪ0qj`$uZ07A5g) ʠH>*)]8Uʽet/@|uJ0+TK?ZBT8M{ 1gV( RɁ9k=3{􋇳pD]hys4uOL=Ǎ2Q)kHj0 VJ;FQlq}>+QI0'}mTӪyCRb c м&FsṂ%:"iV5)B78Vߓ2p ESi.NrVsi4$J_^mu$YF+"a<79ok*P}j m팽?zLꎵɲna-.Be ~j)\b<~{NMӨl'j|Ub8Fv7 $\b~޹1d*?yυm j9UtTQ웛g8&="tO om+%Y$61lL.+̒^Gba>FtBjlUI{v^Zn1t1yl#. Ạ~QL x5TDW@)7BD_z9 do:=|AH_k}䇹hᨅUU*ɦX6te6cHF(J717ư {Oxz{2rs%օZ{ŌsǧWg (8M x2q2LT-!0CEo7ESRhJ342?ţG8(EGKs8"> L1ݓ?[Q +BI'lW#(iZ]qNr^ݾ{E/'k0x0"VU5i$$~E@G,3 UiB+7yNgF`]2cլO&uw 0tegk5 se1ĮeA\Y}P0zZeog|2(5jxo +7WHuQz+@SX1XG!,`urWP%,kL5ӭwVcG#|B`@%2^rGg&n T$6l-{$@V;X]sakbQB)r 0Sbˬ\TA}<:b2ii l"ӁE#O>/ճP\>ۻ^,IEVJ y\I҅ " ^s0g.ؙuqɸw´"9kK|* b\DF\1,?M,s!Z4d: ۘL? 0~AMi  +pՁ+@g9.බ ƒ_+xH4:F^Lǘ Vե80K{ +o٩VyкK P-cwykX֏]M!$͙0Z4~/Avu&R_MƗߛo_Aʓ{ovT?̗F +MYy4^pVj^&?m$әV5ЙAqa L3H\fJo7AJpHscv`|[,z]/ ¦qtIdF4뱟PF>Q9a2ơ뛣śfVc0)q\By%OF~#?YT':OJ(V&U{/5_ɯV]ʬ#t|nl(V\Rlɖk{]gъgu+zvx#cag_^۰Gdȝm#ۥ}xڤ_.%-&~ؾ|./\TSY9>i=~Z="[LI+ GQ+h/Y֊/Z1 ԫy#ǕyO*/#',́S cP:п QĿBp/rn3Ү4ߺ]();u|OWIxMѥQPbEWTQAz>ٖ:zuؤ0lBe9A@A11›f>(6d^rįq|tMJ0DbUsF9rk# +\Ԓi3ed t Ƭ1 +2q ź.\[/3/EW,"oQB3R֨(1R >'p,sy=@ k($zD9HJ +dmg`K +z}@,ߨ;J`q58-ԛ"-w!5NC/-P{E4: Jh c=K R@H`;vha^$!9(Buϻ5{!^dM:*u!֙|pd(:ѻ E]:`3D4#X)&7~bكBevz@\CU⃅K٤86o)RxW|1.JaO%~\Ք$ +GƑIMDk7~φ|ku|Y7Oɛ|4%, +(fv{ +=͚iJw endstream endobj 47 0 obj [/ICCBased 57 0 R] endobj 32 0 obj [31 0 R 30 0 R 29 0 R 28 0 R] endobj 79 0 obj <> endobj xref +0 80 +0000000004 65535 f +0000000016 00000 n +0000000189 00000 n +0000049935 00000 n +0000000000 00000 f +0000049986 00000 n +0000000000 00000 f +0000000000 00000 f +0000288865 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000288938 00000 n +0000289134 00000 n +0000290405 00000 n +0000355993 00000 n +0000421581 00000 n +0000000000 00000 f +0000259337 00000 n +0000269664 00000 n +0000270056 00000 n +0000252950 00000 n +0000268922 00000 n +0000268996 00000 n +0000269063 00000 n +0000269129 00000 n +0000465588 00000 n +0000050604 00000 n +0000051414 00000 n +0000246199 00000 n +0000199354 00000 n +0000259161 00000 n +0000288619 00000 n +0000288742 00000 n +0000053253 00000 n +0000053902 00000 n +0000054573 00000 n +0000055220 00000 n +0000055592 00000 n +0000167634 00000 n +0000051476 00000 n +0000465553 00000 n +0000052692 00000 n +0000052740 00000 n +0000268859 00000 n +0000268796 00000 n +0000259274 00000 n +0000252887 00000 n +0000248936 00000 n +0000199397 00000 n +0000246234 00000 n +0000246288 00000 n +0000253089 00000 n +0000253114 00000 n +0000253414 00000 n +0000253585 00000 n +0000253654 00000 n +0000253936 00000 n +0000254019 00000 n +0000259636 00000 n +0000259904 00000 n +0000269548 00000 n +0000269579 00000 n +0000269432 00000 n +0000269463 00000 n +0000269316 00000 n +0000269347 00000 n +0000269200 00000 n +0000269231 00000 n +0000278640 00000 n +0000270313 00000 n +0000270574 00000 n +0000278909 00000 n +0000465634 00000 n +trailer <]>> startxref 465849 %%EOF \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/aws.png b/qosf.org/designs/infograph_creator/project_logos/aws.png new file mode 100644 index 0000000..f9d679c Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/aws.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/aws.svg b/qosf.org/designs/infograph_creator/project_logos/aws.svg new file mode 100644 index 0000000..03c912d --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/aws.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/azure.png b/qosf.org/designs/infograph_creator/project_logos/azure.png new file mode 100644 index 0000000..e3ee95e Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/azure.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/azure.svg b/qosf.org/designs/infograph_creator/project_logos/azure.svg new file mode 100644 index 0000000..ff5dfa5 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/azure.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/bbn.png b/qosf.org/designs/infograph_creator/project_logos/bbn.png new file mode 100644 index 0000000..6f3d51d Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/bbn.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/braket.png b/qosf.org/designs/infograph_creator/project_logos/braket.png new file mode 100644 index 0000000..874269d Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/braket.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/cirq.png b/qosf.org/designs/infograph_creator/project_logos/cirq.png new file mode 100644 index 0000000..3421f6c Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/cirq.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/cliffords.png b/qosf.org/designs/infograph_creator/project_logos/cliffords.png new file mode 100644 index 0000000..a61ef0c Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/cliffords.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/dwave.png b/qosf.org/designs/infograph_creator/project_logos/dwave.png new file mode 100644 index 0000000..b53f8a4 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/dwave.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/ethz.png b/qosf.org/designs/infograph_creator/project_logos/ethz.png new file mode 100644 index 0000000..b3c0ee8 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/ethz.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/forest.png b/qosf.org/designs/infograph_creator/project_logos/forest.png new file mode 100644 index 0000000..f461e08 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/forest.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/forest.svg b/qosf.org/designs/infograph_creator/project_logos/forest.svg new file mode 100644 index 0000000..c28773c --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/forest.svg @@ -0,0 +1,15 @@ + + + + + rigetti-shape-blue + + + + + + + + + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/github.png b/qosf.org/designs/infograph_creator/project_logos/github.png new file mode 100644 index 0000000..56fbaa8 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/github.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/google.png b/qosf.org/designs/infograph_creator/project_logos/google.png new file mode 100644 index 0000000..312653e Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/google.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/google.svg b/qosf.org/designs/infograph_creator/project_logos/google.svg new file mode 100644 index 0000000..b26d4a4 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/google.svg @@ -0,0 +1,28 @@ + + + + + Google-color + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/ibm.png b/qosf.org/designs/infograph_creator/project_logos/ibm.png new file mode 100644 index 0000000..021377c Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/ibm.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/ibm.svg b/qosf.org/designs/infograph_creator/project_logos/ibm.svg new file mode 100644 index 0000000..7422e17 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/ibm.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/intel.png b/qosf.org/designs/infograph_creator/project_logos/intel.png new file mode 100644 index 0000000..1aea51f Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/intel.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/intelqs.png b/qosf.org/designs/infograph_creator/project_logos/intelqs.png new file mode 100644 index 0000000..107e789 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/intelqs.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/liqui.png b/qosf.org/designs/infograph_creator/project_logos/liqui.png new file mode 100644 index 0000000..fca5be2 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/liqui.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/microsoft.png b/qosf.org/designs/infograph_creator/project_logos/microsoft.png new file mode 100644 index 0000000..f03abb3 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/microsoft.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/microsoft.svg b/qosf.org/designs/infograph_creator/project_logos/microsoft.svg new file mode 100644 index 0000000..0dfa7f0 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/microsoft.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/mqt.png b/qosf.org/designs/infograph_creator/project_logos/mqt.png new file mode 100644 index 0000000..9da3c7e Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/mqt.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/munich.png b/qosf.org/designs/infograph_creator/project_logos/munich.png new file mode 100644 index 0000000..1004947 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/munich.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/ocean.png b/qosf.org/designs/infograph_creator/project_logos/ocean.png new file mode 100644 index 0000000..33ad2e0 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/ocean.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/openql.png b/qosf.org/designs/infograph_creator/project_logos/openql.png new file mode 100644 index 0000000..b85e79e Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/openql.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/pennylane.png b/qosf.org/designs/infograph_creator/project_logos/pennylane.png new file mode 100644 index 0000000..d9a2590 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/pennylane.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/projectq.png b/qosf.org/designs/infograph_creator/project_logos/projectq.png new file mode 100644 index 0000000..94b9ecb Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/projectq.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/qiskit.png b/qosf.org/designs/infograph_creator/project_logos/qiskit.png new file mode 100644 index 0000000..02ce7a3 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/qiskit.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/qiskit.svg b/qosf.org/designs/infograph_creator/project_logos/qiskit.svg new file mode 100644 index 0000000..5b04ddb --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/qiskit.svg @@ -0,0 +1 @@ +logos \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/project_logos/quest.png b/qosf.org/designs/infograph_creator/project_logos/quest.png new file mode 100644 index 0000000..b947cb1 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/quest.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/questcorp.png b/qosf.org/designs/infograph_creator/project_logos/questcorp.png new file mode 100644 index 0000000..4f4a43d Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/questcorp.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/quspin.png b/qosf.org/designs/infograph_creator/project_logos/quspin.png new file mode 100644 index 0000000..b957e88 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/quspin.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/quspincorp.png b/qosf.org/designs/infograph_creator/project_logos/quspincorp.png new file mode 100644 index 0000000..6017687 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/quspincorp.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/qutip.png b/qosf.org/designs/infograph_creator/project_logos/qutip.png new file mode 100644 index 0000000..ccb9b6e Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/qutip.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/qutipcorp.png b/qosf.org/designs/infograph_creator/project_logos/qutipcorp.png new file mode 100644 index 0000000..edf93ac Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/qutipcorp.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/rigetti.png b/qosf.org/designs/infograph_creator/project_logos/rigetti.png new file mode 100644 index 0000000..2c4d139 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/rigetti.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/rigetti.svg b/qosf.org/designs/infograph_creator/project_logos/rigetti.svg new file mode 100644 index 0000000..31d4612 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/rigetti.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/qosf.org/designs/infograph_creator/project_logos/silq.png b/qosf.org/designs/infograph_creator/project_logos/silq.png new file mode 100644 index 0000000..d22b948 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/silq.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/softwareqinc.jpg b/qosf.org/designs/infograph_creator/project_logos/softwareqinc.jpg new file mode 100644 index 0000000..b8353a0 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/softwareqinc.jpg differ diff --git a/qosf.org/designs/infograph_creator/project_logos/staq.png b/qosf.org/designs/infograph_creator/project_logos/staq.png new file mode 100644 index 0000000..87946da Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/staq.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/strawberry.png b/qosf.org/designs/infograph_creator/project_logos/strawberry.png new file mode 100644 index 0000000..720984f Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/strawberry.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/tlm.png b/qosf.org/designs/infograph_creator/project_logos/tlm.png new file mode 100644 index 0000000..1004947 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/tlm.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/tq.png b/qosf.org/designs/infograph_creator/project_logos/tq.png new file mode 100644 index 0000000..fe5ffb6 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/tq.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/xanadu.png b/qosf.org/designs/infograph_creator/project_logos/xanadu.png new file mode 100644 index 0000000..0f36078 Binary files /dev/null and b/qosf.org/designs/infograph_creator/project_logos/xanadu.png differ diff --git a/qosf.org/designs/infograph_creator/project_logos/xanadu.svg b/qosf.org/designs/infograph_creator/project_logos/xanadu.svg new file mode 100644 index 0000000..f649d84 --- /dev/null +++ b/qosf.org/designs/infograph_creator/project_logos/xanadu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/qosf.org/designs/infograph_creator/quantum_projects.csv b/qosf.org/designs/infograph_creator/quantum_projects.csv new file mode 100644 index 0000000..39c608b --- /dev/null +++ b/qosf.org/designs/infograph_creator/quantum_projects.csv @@ -0,0 +1,20 @@ +Name,Languages,Url,Description,Architectures,#Sdk,#Hardware,#Sims,@BrandLogo,@CompanyLogo +Qiskit,Python OpenQASM,qiskit.org,"Open-source SDK for quantum computing at the level of pulses, circuits, and algorithms.",Cloud Superconducting,TRUE,TRUE,TRUE,qiskit.png,ibm.png +Braket,"Python, OpenQASM",aws.amazon.com/braket/,Fully managed quantum computing service for building quantum algorithms.,Cloud Superconducting Ion-Trapped,TRUE,TRUE,TRUE,braket.png,aws.png +Cirq,"Python, OpenQASM",quantumai.google/cirq,"Framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits.",,TRUE,FALSE,TRUE,cirq.png,google.png +Forest,Python Quil,rigetti.com/forest,"Rigetti’s software library for writing, simulating, compiling and executing quantum programs.",Superconducting,TRUE,TRUE,TRUE,forest.png,rigetti.png +PennyLane,Python,pennylane.ai,"Cross-platform library for quantum computing, machine learning, and chemistry.",,TRUE,FALSE,TRUE,pennylane.png,xanadu.png +Ocean,Python,ocean.dwavesys.com,D-Wave’s Ocean SDK for solving real-world problems with quantum and hybrid solutions.,Annealing,TRUE,TRUE,TRUE,ocean.png,dwave.png +OpenQL,Python OpenQL,openql.org,Open-source quantum programming language for quantum hardware.,,TRUE,FALSE,TRUE,openql.png,openql.png +ProjectQ,Python,projectq.ch,Open-source software framework for quantum computing.,,TRUE,TRUE,TRUE,projectq.png,projectq.png +Q#,Q#,microsoft.com/qsharp,Microsoft's quantum programming language.,,TRUE,FALSE,TRUE,azure.png,microsoft.png +Silq,Silq,silq.ethz.ch,High-level programming language for quantum computing.,,TRUE,FALSE,TRUE,silq.png,ethz.png +Strawberry Fields,Python,strawberryfields.ai,"Full-stack library for designing, simulating, and optimizing quantum optical circuits.",,TRUE,FALSE,TRUE,strawberry.png,xanadu.png +staq,C++,github.com/softwareQinc/staq,Compiler and optimizer for quantum circuits.,,TRUE,FALSE,TRUE,staq.png,softwareqinc.jpg +Cliffords.jl,Julia,github.com/BBN-Q/Cliffords.jl,Library for simulating Clifford circuits.,,TRUE,FALSE,TRUE,cliffords.png,bbn.png +JKQ-DDSIM,C++,github.com/iic-jku/ddsim,Quantum circuit simulator based on decision diagrams.,,TRUE,FALSE,TRUE,tlm.png,munich.png +Liqui|>,F#,stationq.github.io/Liquid,Microsoft's software architecture and tools for quantum computing.,,TRUE,FALSE,TRUE,liqui.png,microsoft.png +Qiskit Aer,Python,github.com/Qiskit/qiskit-aer,High-performance simulators for quantum circuits.,,TRUE,FALSE,TRUE,qiskit.png,qiskit.png +QuEST,C,github.com/QuEST-Kit/QuEST,Quantum Exact Simulation Toolkit.,,TRUE,FALSE,TRUE,quest.png,questcorp.png +QuSpin,Python,github.com/weinbe58/QuSpin,Library for simulating quantum many-body systems.,,TRUE,FALSE,TRUE,quspin.png,quspincorp.png +QuTiP,Python,qutip.org,Quantum Toolbox in Python for simulating quantum systems.,,TRUE,FALSE,TRUE,qutip.png,qutipcorp.png \ No newline at end of file diff --git a/qosf.org/designs/opensourceprojectinphographic.png b/qosf.org/designs/opensourceprojectinphographic.png new file mode 100644 index 0000000..5ea5baa Binary files /dev/null and b/qosf.org/designs/opensourceprojectinphographic.png differ