#!/bin/sh # MetaCard 2.4 stack # The following is not ASCII text, # so now would be a good time to q out of more exec mc $0 "$@" T uRIPides1 on openStack go card "SplashScreen" end openStack function GetUserPreference pWhich, pDefault local tReturn put pDefault into tReturn if there is a field ("fld" & pWhich) of card "Preferences" of this stack then if field ("fld" & pWhich) of card "Preferences" of this stack is not empty then put field ("fld" & pWhich) of card "Preferences" of this stack into tReturn end if end if return tReturn end GetUserPreference uRIP1.01.00cConsLastHandlerNameGetUserPreference uHelpText}

All uRIP properties are optional.

The recommended set of elements per the ECMI spec is:

name

copyright

creator

date

description

help

homeURL

downloadUrl

interface

EULA

requirements

version

And the suggested elements are:

type

updateInfoURL

props

HelpTextAll uRIP properties are optional. The recommended set of properties per the ECMI spec is: name copyright creator date description help homeURL downloadUrl interface EULA requirements version type updateInfoURL props cConsLastHandlerScroll13  UTahoma WTahomaWVerdanaWTimes UVerdana UVerdana UTimes UTimes WVerdana WVerdana U Courier New UTimes U Courier New UVerdana UTimes UTimes New Roman U Courier New W Courier New ULucida GrandeUTahomaWTahoma UtahomauRIPcreator Ah, Software copyright public domaintypepluginhomeURL'http://www.ahsoftware.net/uRIPides.html descriptionAIDE plugin for manipulating the uRIP custom properties of objects HelpTextAll uRIP properties are optional. The recommended set of elements per the ECMI spec is: name copyright creator date description help homeURL downloadUrl interface EULA requirements version And the suggested elements are: type updateInfoURL props version1.02.00EULA cREVOnline fingerprintTpylJZFd0tEszdedbTHeUgcREVGeometryCachestackID1108 cREVGeneral scriptChecksumbhK@ debugObjects handlerListopenStack GetUserPreference breakPointsscriptSelection char 44 to 43 bookmarks prevHandler openStack tempScriptscriptX

on openStack

go card "SplashScreen"

end openStack

function GetUserPreference pWhich, pDefault

local tReturn

put pDefault into tReturn

if there is a field ("fld" & pWhich) of card "Preferences" of this stack then

if field ("fld" & pWhich) of card "Preferences" of this stack is not empty then

put field ("fld" & pWhich) of card "Preferences" of this stack into tReturn

end if

end if

return tReturn

end GetUserPreference

Widgets @cREVGeometryCacheIDs1129307691827103711293083831641042112936043757210621129305951995103511295677703661066112931551124910451129665246184110611292174962391022112931505680810441129591345324108911291680305061005112921719133310201129608696581109211295825310461070cREVGeometryCacheorder total14 cREVGeneral bookmarks handlerList prevHandler tempScriptscript  *.AD&REAbout P[on openCard put the uRIP["version"] of this stack into field "fldVersion" end openCard  cREVGeneralscriptChecksumӸn!4 bookmarks handlerListopenCardscriptSelection char 38 to 37 prevHandler tempScriptscript

on openCard

put the uRIP["version"] of this stack into field "fldVersion"

end openCard

cREVGeometryCacheIDs112966556325611071129609023361109811296656498821108112960884463810961129608877335109711296087690331094cREVGeometrycachetotal6order FHIJST SplashScreen P>on openCard wait 1 second go card "Widgets" end openCard cREVGeometryCacheIDs11296150317881099cREVGeometryCacheordertotal1 cREVGeneralscriptChecksumR<:FcH+vFy bookmarks handlerListopenCard tempScript prevHandleropenCardscriptSelection char 31 to 30script

on openCard

wait 1 second

go card "Widgets"

end openCard

K InfoEditor P----------------------------------------------------------- -- Generic check to check for latest version. -- Part of the uRIPides collection. -- -- This now conforms to the ECMI standard: -- There is an xml file on a web server with the update info containing: -- latest version -- update url -- release notes -- -- This requires the following custom properties to be set up: -- uRIP["version"] -- uRIP["updateInfoURL"] -- uRIP["version"] -- -- Fixing up the two constants and then running the _RIPSetup -- handler sets up the custom properties -- -- The xml file contains, at a minimum, the following per the ECMI spec: -- -- -- currentVersionNumber -- downloadURL -- -- ----------------------------------------------------------- -- this is the current version constant kVersion=1.00.00 -- this is the location of the info file constant kDownloadURL="http://www.runrev.com/files/ECMI.xml" local tDirty ----------------------------------------------------------- -- openCard ----------------------------------------------------------- on openCard local tRIPxml local tDate put the date into tDate convert tDate to dateItems if the uRIP["updateInfoURL"] of stack the topstack is not empty then put the uRIP["updateInfoURL"] of stack the topstack into tRIPxml else put "" & cr & \ tab & "" & cr & \ tab & tab & "" & the short name of the topstack & "" & cr & \ tab & tab & "" & kVersion & "" & cr & \ tab & tab & "" & item 1 to 3 of tDate & "" & cr & \ tab & tab & "" & kDownloadURL & "" & cr & \ tab & "" & cr & \ "" & cr into tRIPxml end if put tRIPxml into field "fldInfo" put false into tDirty end openCard on selectionChanged put true into tDirty end selectionChanged on CleanDirty put false into tDirty end CleanDirty function IsDirty return tDirty end IsDirty cREVGeometryCacheIDs11292175868861025112921840588810311129315573636104711292176614771030112936062959210651129308205620104111292176202241027cREVGeometrycachetotal7order cREVGeneralscriptChecksum#9FqʅU bookmarks handlerList,openCard selectionChanged CleanDirty IsDirty tempScript prevHandleropenCardscriptSelectionchar 2029 to 2028script

-----------------------------------------------------------

-- Generic check to check for latest version.

-- Part of the uRIPides collection.

--

-- This now conforms to the ECMI standard:

-- There is an xml file on a web server with the update info containing:

-- latest version

-- update url

-- release notes

--

-- This requires the following custom properties to be set up:

-- uRIP["version"]

-- uRIP["updateInfoURL"]

-- uRIP["version"]

--

-- Fixing up the two constants and then running the _RIPSetup

-- handler sets up the custom properties

--

-- The xml file contains, at a minimum, the following per the ECMI spec:

-- <rip>

-- <file>

-- <version>currentVersionNumber</version>

-- <downloadURL>downloadURL</downloadURL>

-- </file>

-- </rip>

-----------------------------------------------------------

-- this is the current version

constant kVersion=1.00.00

-- this is the location of the info file

constant kDownloadURL="http://www.runrev.com/files/ECMI.xml"

local tDirty

-----------------------------------------------------------

-- openCard

-----------------------------------------------------------

on openCard

local tRIPxml

local tDate

put the date into tDate

convert tDate to dateItems

if the uRIP["updateInfoURL"] of stack the topstack is not empty then

put the uRIP["updateInfoURL"] of stack the topstack into tRIPxml

else

put "<rip>" & cr & \

tab & "<file>" & cr & \

tab & tab & "<name>" & the short name of the topstack & "</name>" & cr & \

tab & tab & "<version>" & kVersion & "</version>" & cr & \

tab & tab & "<releaseDate>" & item 1 to 3 of tDate & "</releaseDate>" & cr & \

tab & tab & "<downloadURL>" & kDownloadURL & "</downloadURL>" & cr & \

tab & "</file>" & cr & \

"</rip>" & cr into tRIPxml

end if

put tRIPxml into field "fldInfo"

put false into tDirty

end openCard

on selectionChanged

put true into tDirty

end selectionChanged

on CleanDirty

put false into tDirty

end CleanDirty

function IsDirty

return tDirty

end IsDirty

) uRIPEditor Plocal lTargetObject local lRIPProp on openCard put empty into field "uProps" put empty into field "fldContents" RIPInitialize put empty into lTargetObject end openCard on RIPInitialize put empty into lRIPProp end RIPInitialize function GatherRIPProps pTarget local tProps, tKeys local tPropValues put pTarget into lTargetObject RIPInitialize put the customProperties["uRIP"] of lTargetObject into tProps put the keys of tProps into tKeys repeat for each line tKey in tKeys put tKey & cr after tPropValues end repeat return tPropValues end GatherRIPProps on GetRIPProp pWhich put pWhich into lRIPProp get the uRIP[pWhich] of lTargetObject if char 1 to 3 of it is "

" then set the htmlText of field "fldContents" to the uRIP[pWhich] of lTargetObject else put the uRIP[pWhich] of lTargetObject into field "fldContents" end if end GetRIPProp on SetRIPProp pWhich local tValue switch pWhich case "date" put the date into tValue convert tValue to dateItems put item 1 to 3 of tValue into tValue default put "newValue" into tValue end switch put empty into field "uProps" set the uRIP[pWhich] of lTargetObject to "newValue" put GatherRIPProps(lTargetObject) into field "uProps" end SetRIPProp on SaveRIPProp local tKeys, tHTMLContents if field "fldContents" is not empty then put the htmlText of field "fldContents" into tHTMLContents put field "fldContents" into field "tContents" if the htmlText of field "tContents" is tHTMLContents then set the uRIP[lRIPProp] of lTargetObject to field "fldContents" else set the uRIP[lRIPProp] of lTargetObject to the htmlText of field "fldContents" end if put empty into field "fldContents" else if lRIPProp is not empty and the selectedText is empty then put empty into field "uProps" set the customPropertySet of lTargetObject to "uRIP" put the customKeys of lTargetObject into tKeys filter tKeys without lRIPProp set the customKeys of lTargetObject to tKeys set the customPropertySet of lTargetObject to empty put GatherRIPProps(lTargetObject) into field "uProps" end if end if end SaveRIPProp cREVGeometryCacheIDs1129330452208105011291778080141013112961584316311001129177801132101111295729518101068112933525587910551129217384645102111293081621141039112921713419810171129615881430110111293155549501046112933622349810541129177782467100811293314123441051cREVGeometrycachetotal14order  cREVGeneralscriptChecksumqgJKdQu!M bookmarks handlerListGopenCard RIPInitialize GatherRIPProps GetRIPProp SetRIPProp SaveRIPProp breakPoints tempScript prevHandlerGatherRIPPropsscriptSelectionchar 1823 to 1822script

local lTargetObject

local lRIPProp

on openCard

put empty into field "uProps"

put empty into field "fldContents"

RIPInitialize

put empty into lTargetObject

end openCard

on RIPInitialize

put empty into lRIPProp

end RIPInitialize

function GatherRIPProps pTarget

local tProps, tKeys

local tPropValues

put pTarget into lTargetObject

RIPInitialize

put the customProperties["uRIP"] of lTargetObject into tProps

put the keys of tProps into tKeys

repeat for each line tKey in tKeys

put tKey & cr after tPropValues

end repeat

return tPropValues

end GatherRIPProps

on GetRIPProp pWhich

put pWhich into lRIPProp

get the uRIP[pWhich] of lTargetObject

if char 1 to 3 of it is "<p>" then

set the htmlText of field "fldContents" to the uRIP[pWhich] of lTargetObject

else

put the uRIP[pWhich] of lTargetObject into field "fldContents"

end if

end GetRIPProp

on SetRIPProp pWhich

local tValue

switch pWhich

case "date"

put the date into tValue

convert tValue to dateItems

put item 1 to 3 of tValue into tValue

default

put "newValue" into tValue

end switch

put empty into field "uProps"

set the uRIP[pWhich] of lTargetObject to "newValue"

put GatherRIPProps(lTargetObject) into field "uProps"

end SetRIPProp

on SaveRIPProp

local tKeys, tHTMLContents

if field "fldContents" is not empty then

put the htmlText of field "fldContents" into tHTMLContents

put field "fldContents" into field "tContents"

if the htmlText of field "tContents" is tHTMLContents then

set the uRIP[lRIPProp] of lTargetObject to field "fldContents"

else

set the uRIP[lRIPProp] of lTargetObject to the htmlText of field "fldContents"

end if

put empty into field "fldContents"

else

if lRIPProp is not empty and the selectedText is empty then

put empty into field "uProps"

set the customPropertySet of lTargetObject to "uRIP"

put the customKeys of lTargetObject into tKeys

filter tKeys without lRIPProp

set the customKeys of lTargetObject to tKeys

set the customPropertySet of lTargetObject to empty

put GatherRIPProps(lTargetObject) into field "uProps"

end if

end if

end SaveRIPProp

ML,/ Preferences Pon openCard local x local tField local tPrefsFolder repeat with x=1 to the number of fields of this card if not the lockText of field x then put empty into field x end if end repeat if the platform is "Win32" then put specialFolderPath(26) into tPrefsFolder else put specialFolderPath("Preferences") into tPrefsFolder end if if there is a file (tPrefsFolder & "/uRIPides.xml") then RetrieveXMLPrefs tPrefsFolder end if end openCard on RetrieveXMLPrefs pPrefsFolder local tTree local tRootNode, tNode, tElement put revCreateXMLTreeFromFile(pPrefsFolder & "/uRIPides.xml",false,true,false) into tTree put revXMLRootNode(tTree) into tRootNode put revXMLFirstChild(tTree, tRootNode) into tNode set the itemDelimiter to "/" repeat while tNode is not empty put revXMLNodeContents(tTree, tNode) into tElement put tElement into field ("fld" & the last item of tNode) put revXMLNextSibling(tTree, tNode) into tNode end repeat end RetrieveXMLPrefs  cREVGeneralscriptChecksumEmWlA[iV` bookmarks breakPoints handlerListopenCard RetrieveXMLPrefsscriptSelectionchar 937 to 936 prevHandleropenCard tempScriptscript"

on openCard

local x

local tField

local tPrefsFolder

repeat with x=1 to the number of fields of this card

if not the lockText of field x then

put empty into field x

end if

end repeat

if the platform is "Win32" then

put specialFolderPath(26) into tPrefsFolder

else

put specialFolderPath("Preferences") into tPrefsFolder

end if

if there is a file (tPrefsFolder & "/uRIPides.xml") then

RetrieveXMLPrefs tPrefsFolder

end if

end openCard

on RetrieveXMLPrefs pPrefsFolder

local tTree

local tRootNode, tNode, tElement

put revCreateXMLTreeFromFile(pPrefsFolder & "/uRIPides.xml",false,true,false) into tTree

put revXMLRootNode(tTree) into tRootNode

put revXMLFirstChild(tTree, tRootNode) into tNode

set the itemDelimiter to "/"

repeat while tNode is not empty

put revXMLNodeContents(tTree, tNode) into tElement

put tElement into field ("fld" & the last item of tNode)

put revXMLNextSibling(tTree, tNode) into tNode

end repeat

end RetrieveXMLPrefs

cREVGeometryCacheIDs1129588916260107711295889000701076112958891626110781129588808449107511295890057481083112958900574910841129591493675109111295889120221079112958893993010811129588939929108011295891991231088112958880163910731129588934615108211295890009371085cREVGeometrycacheorder total14458;@CbtnCheckUpdateep ----------------------------------------------------------- -- Generic check to check for latest version. -- Part of the uRIPides collection. -- -- This now conforms to the ECMI standard: -- There is an xml file on a web server with the update info containing: -- latest version -- update url -- release notes -- -- This requires the following custom properties of this button to be set up: -- uRIP["name"] -- uRIP["updateInfoURL"] -- uRIP["version"] -- -- Fixing up the two constants and then running the _RIPSetup -- handler sets up the custom properties -- -- The xml file contains, at a minimum, the following per the ECMI spec: -- -- -- currentVersionNumber -- downloadURL -- -- ----------------------------------------------------------- ----------------------------------------------------------- -- mouseUp -- -- Get our current version info, -- compare it with the latest on the web. -- If we're up to date, just tell the user so. -- Otherwise launch a browser to start a download. -- If there are release notes and there's a field in the -- current environment called "ReleaseNotes" then show them. ----------------------------------------------------------- on mouseUp local tLatestVersion local tWebLocation local tTree, tNodes, tNum, tStackName, tSpec local tResult -- set up the custom properties based on the constant values set the cursor to busy -- get the info for the most current version put url(the uRIP["updateInfoURL"] of me) into tWebLocation put the result into tResult if tResult is not empty then switch tResult case "error 404 not found" answer the uRIP["updateInfoURL"] of me && "not found" break default answer tResult end switch else replace lf with cr in tTree put revCreateXMLTree(tWebLocation, false, true, false) into tTree if "xmlerr" is not in tTree then put revXMLNumberOfChildren(tTree, "/rip", "file", -1) into tNum put revXMLFirstChild(tTree, "/rip") into tSpec put revXMLNodeContents(tTree, tSpec & "/name") into tStackName repeat while tStackName is not the uRIP["name"] of me put revXMLNextSibling(tTree, tSpec) into tSpec if tSpec is empty then exit repeat end if put revXMLNodeContents(tTree, tSpec & "/name") into tStackName if "xmlerr" is in tStackName then exit repeat end if end repeat if tSpec is not empty then -- get the latest version number put revXMLNodeContents(tTree, tSpec & "/version") into tLatestVersion if tLatestVersion > the uRIP["version"] of me then -- get the release notes if there is a field "ReleaseNotes" then get revXMLNodeContents(tTree, tSpec & "/releaseNotes") if it is not empty then put it into field "ReleaseNotes" end if end if -- get the download url put revXMLNodeContents(tTree, tSpec & "/downloadURL") into tNodes revGoUrl (tNodes) else answer "Your version is current." end if end if end if end if set the cursor to arrow end mouseUp jCheck For UpdateuRIPcreatorECMInameuRIPIdes copyright public domainupdateInfoURL*http://www.mydomain.com/files/uRIPides.xmlversion1.00.00date 2005,10,16 cREVGeneral scriptChecksumrmҿrcG#9 handlerListmouseUp breakPointsscriptSelectionchar 3194 to 3193 bookmarks revUniqueID 1129168030506 prevHandlermouseUp tempScriptscript$

-----------------------------------------------------------

-- Generic check to check for latest version.

-- Part of the uRIPides collection.

--

-- This now conforms to the ECMI standard:

-- There is an xml file on a web server with the update info containing:

-- latest version

-- update url

-- release notes

--

-- This requires the following custom properties of this button to be set up:

-- uRIP["name"]

-- uRIP["updateInfoURL"]

-- uRIP["version"]

--

-- Fixing up the two constants and then running the _RIPSetup

-- handler sets up the custom properties

--

-- The xml file contains, at a minimum, the following per the ECMI spec:

-- <rip>

-- <file>

-- <version>currentVersionNumber</version>

-- <downloadURL>downloadURL</downloadURL>

-- </file>

-- </rip>

-----------------------------------------------------------

-----------------------------------------------------------

-- mouseUp

--

-- Get our current version info,

-- compare it with the latest on the web.

-- If we're up to date, just tell the user so.

-- Otherwise launch a browser to start a download.

-- If there are release notes and there's a field in the

-- current environment called "ReleaseNotes" then show them.

-----------------------------------------------------------

on mouseUp

local tLatestVersion

local tWebLocation

local tTree, tNodes, tNum, tStackName, tSpec

local tResult

-- set up the custom properties based on the constant values

set the cursor to busy

-- get the info for the most current version

put url(the uRIP["updateInfoURL"] of me) into tWebLocation

put the result into tResult

if tResult is not empty then

switch tResult

case "error 404 not found"

answer the uRIP["updateInfoURL"] of me && "not found"

break

default

answer tResult

end switch

else

replace lf with cr in tTree

put revCreateXMLTree(tWebLocation, false, true, false) into tTree

if "xmlerr" is not in tTree then

put revXMLNumberOfChildren(tTree, "/rip", "file", -1) into tNum

put revXMLFirstChild(tTree, "/rip") into tSpec

put revXMLNodeContents(tTree, tSpec & "/name") into tStackName

repeat while tStackName is not the uRIP["name"] of me

put revXMLNextSibling(tTree, tSpec) into tSpec

if tSpec is empty then

exit repeat

end if

put revXMLNodeContents(tTree, tSpec & "/name") into tStackName

if "xmlerr" is in tStackName then

exit repeat

end if

end repeat

if tSpec is not empty then

-- get the latest version number

put revXMLNodeContents(tTree, tSpec & "/version") into tLatestVersion

if tLatestVersion > the uRIP["version"] of me then

-- get the release notes

if there is a field "ReleaseNotes" then

get revXMLNodeContents(tTree, tSpec & "/releaseNotes")

if it is not empty then

put it into field "ReleaseNotes"

end if

end if

-- get the download url

put revXMLNodeContents(tTree, tSpec & "/downloadURL") into tNodes

revGoUrl (tNodes)

else

answer "Your version is current."

end if

end if

end if

end if

set the cursor to arrow

end mouseUp

uProps)pon mouseUp pWhichButton switch pWhichButton case 3 if the selectedText of me is not empty then answer "delete this property?" with "Yes" and "No" if it is "Yes" then end if else ask "what RIP property name?" if it is not empty then SetRIPProp it end if end if break default SaveRIPProp if the selectedText of me is not empty then GetRIPProp the selectedText of me end if end switch end mouseUp  cREVGeneral scriptChecksum˹$Jih handlerListmouseUp breakPointsscriptSelectionchar 438 to 437 revUniqueID 1129177782467 bookmarks tempScript prevHandlermouseUpscriptL

on mouseUp pWhichButton

switch pWhichButton

case 3

if the selectedText of me is not empty then

answer "delete this property?" with "Yes" and "No"

if it is "Yes" then

end if

else

ask "what RIP property name?"

if it is not empty then

SetRIPProp it

end if

end if

break

default

SaveRIPProp

if the selectedText of me is not empty then

GetRIPProp the selectedText of me

end if

end switch

end mouseUp

`@ btnStackPropsepon mouseUp local tTarget RIPInitialize put empty into field "uProps" put empty into field "fldContents" put the long name of stack the topstack into tTarget put GatherRIPProps(tTarget) into field "uProps" end mouseUp 2^ the topStackStack properties cREVGeneral scriptChecksum{Tm74z'0_7 breakPoints handlerListmouseUpscriptSelection char 46 to 45 bookmarks revUniqueID 1129177801132 prevHandlermouseUp tempScriptscriptf

on mouseUp

local tTarget

RIPInitialize

put empty into field "uProps"

put empty into field "fldContents"

put the long name of stack the topstack into tTarget

put GatherRIPProps(tTarget) into field "uProps"

end mouseUp

btnDonemp#on mouseUp pop card end mouseUp 9wRDone cREVGeneralscriptChecksumސef f;SC revUniqueID 1129177808014 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelection char 22 to 21script

on mouseUp

pop card

end mouseUp

 fldContents)`vZ cREVGeneral revUniqueID 1129217134198  `@w  btnEditorep;on mouseUp push card go card "uRIPEditor" end mouseUp y uRIP Editor cREVGeneralscriptChecksum4  revUniqueID 1129217191333 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelection char 23 to 22script

on mouseUp

push card

go card "uRIPEditor"

end mouseUp

 btnCardPropsepon mouseUp local tTarget put empty into field "uProps" put empty into field "fldContents" put line 1 of the recentCards of stack the topstack into tTarget put GatherRIPProps(tTarget) into field "uProps" end mouseUp 25^!The current card of the topStackCard properties cREVGeneral scriptChecksum2sz TTSTq handlerListmouseUp breakPointsscriptSelection char 77 to 76 revUniqueID 1129217384645 bookmarks tempScript prevHandlermouseUpscript[

on mouseUp

local tTarget

put empty into field "uProps"

put empty into field "fldContents"

put line 1 of the recentCards of stack the topstack into tTarget

put GatherRIPProps(tTarget) into field "uProps"

end mouseUp

btnInfoEditorep;on mouseUp push card go card "InfoEditor" end mouseUp "yupdateInfoURL Editor cREVGeneralscriptChecksumoE ~ bookmarks revUniqueID 1129217496239 handlerListmouseUpscriptSelection char 23 to 22 prevHandlermouseUp tempScriptscript

on mouseUp

push card

go card "InfoEditor"

end mouseUp

btnDonemp\-- this is the name of the file to save constant kFileName="uRIPides.xml" on mouseUp local tFileName if IsDirty() then ask file "Where should the xml file be saved?" with kFileName if it is not empty then put it into tFileName put field "fldInfo" into url ("file:"&tFileName) end if end if pop card end mouseUp 7mRDone cREVGeneralscriptChecksumY_/i r revUniqueID 1129217586886 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelectionchar 335 to 334scriptm

-- this is the name of the file to save

constant kFileName="uRIPides.xml"

on mouseUp

local tFileName

if IsDirty() then

ask file "Where should the xml file be saved?" with kFileName

if it is not empty then

put it into tFileName

put field "fldInfo" into url ("file:"&tFileName)

end if

end if

pop card

end mouseUp

fldInfoi`+,j cREVGeneral revUniqueID 1129217620224 bookmarks handlerList tempScript prevHandlerscript     uRIPides  1.00.00 ( 2005,10,17 B http://www.runrev.com/files/ECMI.xml  `@!, ]a@ btnSaveep----------------------------------------------------------- -- Generic check to save the downloadInfoURL xml file. -- Part of the uRIPides collection. -- ----------------------------------------------------------- -- this is the name of the file to save constant kFileName="uRIPides.xml" ----------------------------------------------------------- ----------------------------------------------------------- on mouseUp local tFileName ask file "Where should the xml file be saved?" with kFileName if it is not empty then put it into tFileName put field "fldInfo" into url ("file:"&tFileName) CleanDirty end if end mouseUp 2&RSave cREVGeneralscriptChecksum:CEfswx+L revUniqueID 1129217661477 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelectionchar 626 to 625script

-----------------------------------------------------------

-- Generic check to save the downloadInfoURL xml file.

-- Part of the uRIPides collection.

--

-----------------------------------------------------------

-- this is the name of the file to save

constant kFileName="uRIPides.xml"

-----------------------------------------------------------

-----------------------------------------------------------

on mouseUp

local tFileName

ask file "Where should the xml file be saved?" with kFileName

if it is not empty then

put it into tFileName

put field "fldInfo" into url ("file:"&tFileName)

CleanDirty

end if

end mouseUp

btnLoadep----------------------------------------------------------- -- Generic check to save the downloadInfoURL xml file. -- Part of the uRIPides collection. -- ----------------------------------------------------------- ----------------------------------------------------------- ----------------------------------------------------------- on mouseUp local tFileName answer file "Where is the xml file?" with the uRIP["updateInfoURL"] of stack the topStack if it is not empty then put it into tFileName if char 1 to 4 of tFileName is "http" then get url it else get url ("file:" & it) end if put it into field "fldInfo" end if end mouseUp 2RLoad cREVGeneral scriptChecksumAh[|[çt4 handlerListmouseUp breakPointsscriptSelectionchar 215 to 214 bookmarks revUniqueID 1129218405888 prevHandlermouseUp tempScriptscript(

-----------------------------------------------------------

-- Generic check to save the downloadInfoURL xml file.

-- Part of the uRIPides collection.

--

-----------------------------------------------------------

-----------------------------------------------------------

-----------------------------------------------------------

on mouseUp

local tFileName

answer file "Where is the xml file?" with the uRIP["updateInfoURL"] of stack the topStack

if it is not empty then

put it into tFileName

if char 1 to 4 of tFileName is "http" then

get url it

else

get url ("file:" & it)

end if

put it into field "fldInfo"

end if

end mouseUp

 ReleaseNotes)` cREVGeneral revUniqueID 1129305951995  \Add the UpdateCheck button to the top stack, then edit its properties with the uRIP Editor. You can create an xml file to match the updateInfoURL property using the updateInfoURL Editor, then ftp it to the proper web site.  Label Field ` cREVTable currentview Release Notes cREVGeneral revUniqueID 1129307691827 Release Notes  Label Field  d cREVTable currentview uRIP Editor cREVGeneral revUniqueID 1129308162114 uRIP Editor  Label Field t x cREVTable currentviewupdateInfo Editor cREVGeneral revUniqueID 1129308205620 updateInfo EditorbtnInfoEditorep?on mouseUp local tTemp local tDate local tURL put the date into tDate convert tDate to dateItems if the short name of the topStack is not "uRIPides" then copy button "btnCheckUpdate" to stack the topStack set the visible of it to true put RIPGetCurrent("date", item 1 to 3 of tDate) into tTemp set the uRIP["date"] of button "btnCheckUpdate" to tTemp put RIPGetCurrent("name", the short name of stack the topStack) into tTemp set the uRIP["name"] of button "btnCheckUpdate" of stack the topStack to tTemp put the uRIP["updateInfoURL"] of button "btnCheckUpdate" of stack the topStack into tURL set the itemDelimiter to "/" put tTemp & ".xml" into item -1 of tURL set the uRIP["updateInfoURL"] of button "btnCheckUpdate" of stack the topStack to tURL put RIPGetCurrent("creator", "ECMI") into tTemp set the uRIP["creator"] of button "btnCheckUpdate" to tTemp put RIPGetCurrent("copyright", "public domain") into tTemp set the uRIP["copyright"] of button "btnCheckUpdate" to tTemp put RIPGetCurrent("version", "1.00.00") into tTemp set the uRIP["version"] of button "btnCheckUpdate" of stack the topStack to tTemp answer "Done! Now open the uRIP Editor to edit the uRIP properties." end if end mouseUp function RIPGetCurrent pWhich, pDefault local tTemp if the uRIP[pWhich] of stack the topStack is not empty then put the uRIP[pWhich] of stack the topStack into tTemp else put GetUserPreferences(pWhich, pDefault) into tTemp end if return tTemp end RIPGetCurrent 2$Add Update Check Button to topStack cREVGeneral scriptChecksumǤa.Q * breakPoints handlerListmouseUp RIPGetCurrentscriptSelectionchar 1544 to 1543 revUniqueID 1129308383164 bookmarks tempScript prevHandlermouseUpscript

on mouseUp

local tTemp

local tDate

local tURL

put the date into tDate

convert tDate to dateItems

if the short name of the topStack is not "uRIPides" then

copy button "btnCheckUpdate" to stack the topStack

set the visible of it to true

put RIPGetCurrent("date", item 1 to 3 of tDate) into tTemp

set the uRIP["date"] of button "btnCheckUpdate" to tTemp

put RIPGetCurrent("name", the short name of stack the topStack) into tTemp

set the uRIP["name"] of button "btnCheckUpdate" of stack the topStack to tTemp

put the uRIP["updateInfoURL"] of button "btnCheckUpdate" of stack the topStack into tURL

set the itemDelimiter to "/"

put tTemp & ".xml" into item -1 of tURL

set the uRIP["updateInfoURL"] of button "btnCheckUpdate" of stack the topStack to tURL

put RIPGetCurrent("creator", "ECMI") into tTemp

set the uRIP["creator"] of button "btnCheckUpdate" to tTemp

put RIPGetCurrent("copyright", "public domain") into tTemp

set the uRIP["copyright"] of button "btnCheckUpdate" to tTemp

put RIPGetCurrent("version", "1.00.00") into tTemp

set the uRIP["version"] of button "btnCheckUpdate" of stack the topStack to tTemp

answer "Done! Now open the uRIP Editor to edit the uRIP properties."

end if

end mouseUp

function RIPGetCurrent pWhich, pDefault

local tTemp

if the uRIP[pWhich] of stack the topStack is not empty then

put the uRIP[pWhich] of stack the topStack into tTemp

else

put GetUserPreferences(pWhich, pDefault) into tTemp

end if

return tTemp

end RIPGetCurrent

btnECMIexOon mouseUp revGoUrl "http://groups.yahoo.com/group/revInterop/" end mouseUp &.ECMI cREVGeneralscriptChecksumi`UjW}K 2'e revUniqueID 1129315056808 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelection char 65 to 64script

on mouseUp

revGoUrl "http://groups.yahoo.com/group/revInterop/"

end mouseUp

 help.bmp tcon mouseUp put the uHelpText of me into field "ReleaseNotes" show field "fldHelp" end mouseUp  uHelpTextAdd the UpdateCheck button to the top stack, then edit its properties with the uRIP Editor. You can create an xml file to match the updateInfoURL property using the updateInfoURL Editor, then ftp it to the proper web site.ɉPNG  IHDR(-SgAMA aPLTEVbIDATeA! %!N [dJ]ebul&4v[AΓQ]1LQ0{UTdS{7iXE3ZIENDB` cREVGeneralscriptChecksum\6[oݑ{SFo( revUniqueID 1129315511249 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelection char 86 to 85script*

on mouseUp

put the uHelpText of me into field "ReleaseNotes"

show field "fldHelp"

end mouseUp

 help.bmp ton mouseUp local tPreviousContents if the uState of me is "Help" then set the uState of me to empty --put the uContents of me into field "fldContents" set the htmlText of field "fldContents" to the uContents of me else set the uContents of me to field "fldContents" --put the uRIP["HelpText"] of this stack into field "fldContents" set the htmlText of field "fldContents" to the uRIP["HelpText"] of this stack set the uState of me to "Help" end if end mouseUp | uContentsuStateɉPNG  IHDR(-SgAMA aPLTEVbIDATeA! %!N [dJ]ebul&4v[AΓQ]1LQ0{UTdS{7iXE3ZIENDB` cREVGeneralscriptChecksumLiGg\Q{Pw5 revUniqueID 1129315554950 bookmarks handlerListmouseUp tempScript prevHandlermouseUpscriptSelectionchar 214 to 213script

on mouseUp

local tPreviousContents

if the uState of me is "Help" then

set the uState of me to empty

--put the uContents of me into field "fldContents"

set the htmlText of field "fldContents" to the uContents of me

else

set the uContents of me to field "fldContents"

--put the uRIP["HelpText"] of this stack into field "fldContents"

set the htmlText of field "fldContents" to the uRIP["HelpText"] of this stack

set the uState of me to "Help"

end if

end mouseUp

 help.bmp dɉPNG  IHDR(-SgAMA aPLTEVbIDATeA! %!N [dJ]ebul&4v[AΓQ]1LQ0{UTdS{7iXE3ZIENDB` cREVGeneral revUniqueID 1129315573636i ,D cREVGeneral bookmarks revUniqueID 1129331412344 handlerList prevHandler tempScriptscriptbtnAdd=_on menuPick pWhich if pWhich is not empty then SetRIPProp pWhich end if end menuPick 28 )Add a property from the recommended listAdd--Recommended: name creator date description help homeURL downloadURL interface EULA requirements version --Suggested: type updateInfoURL props cREVGeneralscriptChecksumu `{3|~ bookmarks revUniqueID 1129330452208 handlerListmenuPickscriptSelection char 71 to 70 prevHandlermenuPick tempScriptscript=

on menuPick pWhich

if pWhich is not empty then

SetRIPProp pWhich

end if

end menuPick

i0Olocal tControlList, tDisplayList on mouseDown local tTarget local x put empty into field "uProps" put empty into field "fldContents" put empty into tDisplayList put empty into tControlList put empty into button "btnControls" put line 1 of the recentCards of stack the topstack into tTarget repeat with x=1 to the number of controls of tTarget put the long id of control x of tTarget & cr after tControlList put the short name of control x of tTarget & cr after tDisplayList end repeat put tDisplayList into button "btnControls" end mouseDown on menuPick pWhich local tPos if pWhich is not empty then --set this control as tTarget put lineOffset(pWhich, tDisplayList) into tPos put line tPos of tControlList into pWhich put GatherRIPProps(pWhich) into field "uProps" end if end menuPick /N` cREVGeneralscriptChecksumJSZZ8ȋ bookmarks revUniqueID 1129336223498 handlerListmouseDown menuPickscriptSelectionchar 562 to 561 prevHandlermenuPick tempScriptscript s

local tControlList, tDisplayList

on mouseDown

local tTarget

local x

put empty into field "uProps"

put empty into field "fldContents"

put empty into tDisplayList

put empty into tControlList

put empty into button "btnControls"

put line 1 of the recentCards of stack the topstack into tTarget

repeat with x=1 to the number of controls of tTarget

put the long id of control x of tTarget & cr after tControlList

put the short name of control x of tTarget & cr after tDisplayList

end repeat

put tDisplayList into button "btnControls"

end mouseDown

on menuPick pWhich

local tPos

if pWhich is not empty then

--set this control as tTarget

put lineOffset(pWhich, tDisplayList) into tPos

put line tPos of tControlList into pWhich

put GatherRIPProps(pWhich) into field "uProps"

end if

end menuPick

 btnControls @5TT -Controls on the current card of the topStack ControlsRectangle Rectangle uProps btnStackProps btnDone fldContents btnCardProps Label Field help.bmp group id 1051 btnAdd group id 1054 btnControls tContents  cREVGeneral scriptChecksumُ B~ breakPoints handlerListscriptSelection char 1 to 0 revUniqueID 1129335255879 bookmarks tempScript prevHandlermenuPickscript

  ) Label Field *Fp` cREVTable currentviewTEdit the file here Then save it as an xml file and upload it to the proper web site. cREVGeneral revUniqueID 1129360629592 Edit the file here Then save it as an xml file &and upload it to the proper web site.*btnInfoEditorepXconstant kStackName="myStack" on mouseUp local tDate put the date into tDate convert tDate to dateItems create stack set the name of it to kStackName set the uRIP["name"] of stack kStackName to kStackName set the uRIP["copyright"] of stack kStackName to GetUserPreference("copyright", "public domain") set the uRIP["creator"] of stack kStackName to GetUserPreference("creator", "ECMI") set the uRIP["date"] of stack kStackName to item 1 to 3 of tDate set the uRIP["version"] of stack kStackName to "1.00.00" set the destroyStack of stack kStackName to true end mouseUp X|cConsLastHandlerNamemouseUpcConsLastHandlerScroll28Create New mainStack cREVGeneral scriptChecksumiG[-kKDxQZ} handlerListmouseUp breakPointsscriptSelectionchar 391 to 390 bookmarks revUniqueID 1129567770366 prevHandlermouseUp tempScriptscript

constant kStackName="myStack"

on mouseUp

local tDate

put the date into tDate

convert tDate to dateItems

create stack

set the name of it to kStackName

set the uRIP["name"] of stack kStackName to kStackName

set the uRIP["copyright"] of stack kStackName to GetUserPreference("copyright", "public domain")

set the uRIP["creator"] of stack kStackName to GetUserPreference("creator", "ECMI")

set the uRIP["date"] of stack kStackName to item 1 to 3 of tDate

set the uRIP["version"] of stack kStackName to "1.00.00"

set the destroyStack of stack kStackName to true

end mouseUp

, tContents!`R[d cREVGeneral revUniqueID 1129572951810  "All uRIP properties are optional. 6The recommended set of elements per the ECMI spec is: name copyright creator date description help homeURL downloadUrl interface EULA requirements version !And the suggested elements are: type updateInfoURL props .ButtonepZon mouseUp revGoURL "http://classics.mit.edu/Browse/browse-Euripides.html" end mouseUp lRcConsLastHandlerNamemouseUpcConsLastHandlerScroll0 Euripides cREVGeneralscriptChecksumʥkN revUniqueID 1129582531046 bookmarks handlerListmouseUp tempScript prevHandlerscriptSelection char 24 to 23script

on mouseUp

revGoURL "http://classics.mit.edu/Browse/browse-Euripides.html"

end mouseUp

4i - cREVGeneral revUniqueID 1129588900070 1 fldCreator)`k16 cREVTable currentviewkaos cREVGeneral revUniqueID 1129588801639 / 3 Label Field 1d cREVTable currentviewcreator cREVGeneral revUniqueID 1129588808449 creator5i FV cREVGeneral revUniqueID 1129588916260 6 fldCopyright)`kJ cREVGeneral revUniqueID 1129588916261 / 7 Label Field Jd cREVTable currentview copyright cREVGeneral revUniqueID 1129588912022 copyright8i _^ cREVGeneral revUniqueID 1129588939929 9 fldHomeURL)`lc cREVGeneral revUniqueID 1129588939930 / : Label Field cd cREVTable currentviewhomeURL cREVGeneral revUniqueID 1129588934615 homeURL;i wTe cREVGeneral revUniqueID 1129589005748 <fldEULA)`m|\ cREVGeneral revUniqueID 1129589005749 / >`@O} Z = Label Field {d cREVTable currentviewEULA cREVGeneral revUniqueID 1129589000937 EULA @ Label Field .d cREVTable currentview Preferences cREVGeneral revUniqueID 1129589199123 PreferencesAbtnPreferrencesepon mouseUp

push card

go card "Preferences"

end mouseUp

CbtnDonemp8on mouseUp SavePreferences pop card end mouseUp on SavePreferences local x local tField repeat with x=1 to the number of fields of this card if not the lockText of field x then put the short name of field x into tField set the uRIP[char 4 to -1 of tField] of this stack to field x end if end repeat SaveXMLPreferences end SavePreferences on SaveXMLPreferences local tPrefsFolder if the platform is "Win32" then put specialFolderPath(26) into tPrefsFolder else put specialFolderPath("Preferences") into tPrefsFolder end if SaveXMLPrefs tPrefsFolder end SaveXMLPreferences on SaveXMLPrefs pWhere local x, tField local tFileName put pWhere & "/uRIPides.xml" into tFileName open file tFileName for write write "" & cr to file tFileName repeat with x=1 to the number of fields of this card if field x is not empty and not the lockText of field x then put the short name of field x into tField set the uRIP[char 4 to -1 of tField] of this stack to field x write "<" & char 4 to -1 of tField & ">" to file tFileName write field x to file tFileName write "" & cr to file tFileName end if end repeat write "" & cr to file tFileName close file tFileName end SaveXMLPrefs dRcConsLastHandlerNamemouseUpcConsLastHandlerScroll0Done cREVGeneral scriptChecksumDeT4i$ breakPoints handlerList7mouseUp SavePreferences SaveXMLPreferences SaveXMLPrefsscriptSelectionchar 1100 to 1099 bookmarks revUniqueID 1129591493675 prevHandlermouseUp tempScriptscript

on mouseUp

SavePreferences

pop card

end mouseUp

on SavePreferences

local x

local tField

repeat with x=1 to the number of fields of this card

if not the lockText of field x then

put the short name of field x into tField

set the uRIP[char 4 to -1 of tField] of this stack to field x

end if

end repeat

SaveXMLPreferences

end SavePreferences

on SaveXMLPreferences

local tPrefsFolder

if the platform is "Win32" then

put specialFolderPath(26) into tPrefsFolder

else

put specialFolderPath("Preferences") into tPrefsFolder

end if

SaveXMLPrefs tPrefsFolder

end SaveXMLPreferences

on SaveXMLPrefs pWhere

local x, tField

local tFileName

put pWhere & "/uRIPides.xml" into tFileName

open file tFileName for write

write "<prefs>" & cr to file tFileName

repeat with x=1 to the number of fields of this card

if field x is not empty and not the lockText of field x then

put the short name of field x into tField

set the uRIP[char 4 to -1 of tField] of this stack to field x

write "<" & char 4 to -1 of tField & ">" to file tFileName

write field x to file tFileName

write "</" & char 4 to -1 of tField & ">" & cr to file tFileName

end if

end repeat

write "</prefs>" & cr to file tFileName

close file tFileName

end SaveXMLPrefs

D btnAboutep6on mouseUp push card go card "About" end mouseUp VyAbout cREVGeneralscriptChecksumwkq u(kk bookmarks revUniqueID 1129608696581 handlerListmouseUpscriptSelection char 40 to 39 prevHandlermouseUp tempScriptscript

on mouseUp

push card

go card "About"

end mouseUp

FbtnDonemp8on mouseUp SavePreferences pop card end mouseUp on SavePreferences local x local tField repeat with x=1 to the number of fields of this card if not the lockText of field x then put the short name of field x into tField set the uRIP[char 4 to -1 of tField] of this stack to field x end if end repeat SaveXMLPreferences end SavePreferences on SaveXMLPreferences local tPrefsFolder if the platform is "Win32" then put specialFolderPath(26) into tPrefsFolder else put specialFolderPath("Preferences") into tPrefsFolder end if SaveXMLPrefs tPrefsFolder end SaveXMLPreferences on SaveXMLPrefs pWhere local x, tField local tFileName put pWhere & "/uRIPides.xml" into tFileName open file tFileName for write write "" & cr to file tFileName repeat with x=1 to the number of fields of this card if field x is not empty and not the lockText of field x then put the short name of field x into tField set the uRIP[char 4 to -1 of tField] of this stack to field x write "<" & char 4 to -1 of tField & ">" to file tFileName write field x to file tFileName write "" & cr to file tFileName end if end repeat write "" & cr to file tFileName close file tFileName end SaveXMLPrefs dRcConsLastHandlerNamemouseUpcConsLastHandlerScroll0Done cREVGeneral scriptChecksumDeT4i$ breakPoints handlerList7mouseUp SavePreferences SaveXMLPreferences SaveXMLPrefsscriptSelectionchar 1100 to 1099 bookmarks revUniqueID 1129608769033 prevHandlermouseUp tempScriptscript

on mouseUp

SavePreferences

pop card

end mouseUp

on SavePreferences

local x

local tField

repeat with x=1 to the number of fields of this card

if not the lockText of field x then

put the short name of field x into tField

set the uRIP[char 4 to -1 of tField] of this stack to field x

end if

end repeat

SaveXMLPreferences

end SavePreferences

on SaveXMLPreferences

local tPrefsFolder

if the platform is "Win32" then

put specialFolderPath(26) into tPrefsFolder

else

put specialFolderPath("Preferences") into tPrefsFolder

end if

SaveXMLPrefs tPrefsFolder

end SaveXMLPreferences

on SaveXMLPrefs pWhere

local x, tField

local tFileName

put pWhere & "/uRIPides.xml" into tFileName

open file tFileName for write

write "<prefs>" & cr to file tFileName

repeat with x=1 to the number of fields of this card

if field x is not empty and not the lockText of field x then

put the short name of field x into tField

set the uRIP[char 4 to -1 of tField] of this stack to field x

write "<" & char 4 to -1 of tField & ">" to file tFileName

write field x to file tFileName

write "</" & char 4 to -1 of tField & ">" & cr to file tFileName

end if

end repeat

write "</prefs>" & cr to file tFileName

close file tFileName

end SaveXMLPrefs

H Label Field 2 cREVTable currentviewuRIPides cREVGeneral revUniqueID 1129608844638 uRIPides I fldVersion V cREVTable currentviewuRIPides cREVGeneral revUniqueID 1129608877335 1.02.00 &fldHelpx"on mouseUp hide me end mouseUp LH cREVGeneralscriptChecksum]Rs˕,{)UTY bookmarks revUniqueID 1129360437572 handlerListmouseUpscriptSelection char 21 to 20 prevHandlermouseUp tempScriptscriptw

on mouseUp

hide me

end mouseUp

 )Metadata and Interoperability Guidelines @( @ Draft 5, 21 June, 2005 @ Originally Authored By: @ Ken Ray, kray@sonsothunder.com @ @  @ +Richard Gaskin, ambassador@fourthworld.com @ @ @* Contributions by: @ % Dick Kriesel, dick.kriesel@mail.com @ @ @$ & Eric Chatonet, eric.chatonet@mac.com @ @ @ @% Maintained at: @ F RevInterop Group at Yahoo, http://groups.yahoo.com/group/revInterop @ @( @D @ INTRODUCTION @ @ As the Transcript development community grows we can expect many new innovative solutions coming from its members. These include: @ @ Libraries @ tStack files that hold scripts which can be called from throughout the message path, initialized with "start using". @s @ Components @ Objects, groups of objects, or stacks that have a specific purpose or function, such as a table widget or FTP settings dialog, useful across multiple projects. @ @ Templates @ Prefabricated collections of objects that work together to provide the basis for a complete software application, such as a shell for a slide show viewer or a system utility. @ @ HCollectively, these solutions are referred to as resources. As the variety of these things grows issues of interoperability are introduced, such as name space conflicts among handlers or objects. In addition to minimizing errors, there is an opportunity to provide easier integration of resources from different third parties. @1 @ 1 @: @ This initiative proposes a set of conventions that aim to serve both goals, minimizing the risk of introducing errors when integrating resources, and exploring ways to make it simpler to use such resources. @ @ Much of what is needed for that goal could be described generically as "metadata": additional information bound to the resources in question but which do not directly affect performance of those resources. @ @ The Dublin Core Metadata Initiative (DCMI) is a consortium effort to facilitate exchange of documents. Given that the goals of the DCMI and this initiative are in many ways very similar, and that the DCMI working group has already expended tremendous investment in defining metadata needs for such purposes, this initiative aims to use DCMI nomenclature and conventions whenever practical. @ @ To reinforce this deference to the DCMI project and as a tip-of-the-hat to the company that produces Transcript and Revolution (Runtime Revolution Ltd. of Edinburgh, Scotland), this project is given the lighthearted name of "Edinburgh Core Metadata Initiative" ("ECMI"). @ @ @ .GOALS OVERVIEW - Must-Haves and Nice-to-Haves @- @ Above all else programming with Transcript is simple, and nothing in this proposal should introduce requirements beyond anything required by the Revolution engine to execute. @ @ It should be possible to completely ignore the recommendations of this proposal and still have acceptable performance of a library, component, or template, at least by itself. @ @ Where the ECMI becomes useful is in anticipating areas of potential conflict between such resources, and anticipating that as the variety of third-party resources grows it will be desirable to have ever-simpler ways of working with them. @ @ The recommendations of this proposal are therefore entirely optional, falling firmly into the Nice-to-Have category with ideally no Must-Haves. @ @ That said, adopting the recommendations of this proposal may be seen as allowing a resource to be a "good citizen" within the larger host software it may be used in. @ @ It's hoped that the ECMI proposal will reflect the needs of most, if not all, third-party Transcript programmers, as and such be widely used by them in works delivered to the community. @ @ @ GOALS SPECIFICS @ @ When sharing software resources it can be useful to have immediate access to a variety of information about the resource, including: @ @ +- Who made it, and how can I contact them? @* - What does it do? @ - How do I use it? @ - What version is it? @ &- Where can I get the latest version? @% #- What are the legal terms of use? @" 8- What are its technical requirements and dependencies? @7 @ Many of these are already defined in the DCMI, at . Since the DCMI is focused on documents rather than executable code, items like version and technical requirements must be defined here in the ECMI. @3 @3+ @^ @ Since all objects in Revolution can have custom properties, it is proposed that custom properties be used for the storage of metadata. @ @ To minimize potential conflicts with existing properties or any code that addresses them, it's proposed that ECMI properties be stored in their own custom property set. @ @ In keeping with the long-established convention of prefacing user-defined (as opposed to engine-defined) properties with a lower-case "u", the ECMI custom property set is labeled "uRIP" ("RIP" for "Rev Interop"), and its elements can be accessed simply with array notation: @ @ &get the uRIP["version"] of this stack @ % @ For consistency, the uRIP custom property set should be included in the highest-level object for the software resource in question. For example, a component widget (like a "table" widget) would have the uRIP custom property set in the group which contains its objects; a component stack (like an FTP Settings dialog), a library or template would have the uRIP custom property set in the mainstack of the stack file. @ @ In addition to listing specific metadata elements, recommendations for useful naming conventions are provided to minimize potential conflicts and make software resources easily identifiable. @ @ DEVELOPMENT OPPORTUNITIES @ @ Once this specification has been officially released, there will be opportunities for developers to create add-on utilities related to ECMI. These can include: @ @ @- Tools to help in the creation and/or storage of ECMI metadata @? ;- Tools to hep in the creation of ECMI-compliant resources @: D- Tools to display ECMI data for a number of resources in one place @C 8- Tools to locate and download ECMI-compliant resources @7 @ Although this is beyond the scope of this document, having the ECMI standard will allow for the development and distribution of these kinds of tools to aid developers in working with ECMI resources. @ @ METADATA ELEMENTS @ @ The metadata elements listed below form an initial proposed set useful for minimal interoperability. (Note: Those items with "-- DCMI" after their name are borrowed from the DCMI specification at .) @ @6 @ @ All of these are fully optional, and can be used when the developer feels it adds value to the resource being distributed. For the purposes of classification, however, these metadata elements have been grouped into "recommended" and "suggested" categories: @ @ Recommended Elements: @  @ uRIP["copyright"] -- DCMI @  Copyright statement. @ @ uRIP["creator"] -- DCMI @  Name of individual or company responsible for creating the resource. Additional contact information can be provided, but line 1 must be the name of the individual/company. @ @ uRIP["date"] -- DCMI @  Release date of the resource. Date is in the format YYYY,MM,DD (the first three items returned from the dateItems format); padding with zeroes for MM or DD < 10 is optional. @ @ @ uRIP["description"] -- DCMI @  Summary description of what the resource does. For our uses probably best to use a simple, single-sentence description similar to what one finds in the second line of an About box. @ @ uRIP["help"] @ )Instructions on how to use the resource. @( @ uRIP["home"] @ GUniform resource locator to the WWW home page describing the resource. @F @ uRIP["url"] @ Universal resource locator to directly download the latest edition of the resource. This is different from the Home resource, which points to the web page describing the resource. @ @ uRIP["interface"] @  Human-readable return-delimited list of handlers and functions with descriptive parameter names that can be called from other software resources. It is suggested that each line in the list follow the standard syntax structure: @ .- Variables are enclosed in angle brackets <> @- 9- Optional parameters are enclosed in square brackets [] @8 p- Parameters that must be one of a list of items are in curly brackets (braces) {} separated by vertical bars | @o +- Parameters should have descriptive names @* d- Parameters that are generic object descriptors use "objectDescriptor", "objectDesc", or "objDesc" @c - Parameters that are specific object descriptors use a similar form, but specify the object type, as in "fieldDescriptor", "buttonDesc", or "grcDesc" @ 5- Functions should put all params inside parentheses @4 @ Examples: @ 7stsImg_ConvertPolygon ,{"bezier"|"quadratic"} @ 6 stsImg_GetHandles() @  @ uRIP["license"] -- DCMI @  OA legal document giving official permission to do something with the resource. @N @ uRIP["requires"] @  NList of system requirements and dependencies, where each line is in the form: @M  @ 3{"stack"|"library"|"external"|"file"}, @ 2 @ where: @ @ V"stack" is a requirement that a certain stack already be open (i.e. in "the windows") @U b"library" is a requirement that a certain library already be in use (i.e. in "the libraryStacks") @a Z"external" is a requrement that a certain external is loaded (i.e. is in "the externals") @Y "file" is a requirement that a certain file needs to exist at a particular location (i.e. "there is a file " returns "true") @ @ is either the name of the required item (like for stacks, the name of a stack), or is a path to the required item (for example, DLLs or externals). @ @ Examples: @ stack,Options @ library,libSTSGeneral @  external,revXML.dll @  file,../../test.doc @  @ uRIP["version"] @  BThe version number of the resource, preferably in x.x.x notation. @A @ @ Suggested Elements: @  @ uRIP["type"] @ fThe custom "type" of the resource. This is most often used with components (as opposed to templates or libraries). This can be any method of identifying the resource, but it is suggested that it be one or two words, and include a similar naming convention to that of handlers in libraries (see "Naming Components" in the "Naming Convetions" section below). @e @ uRIP["updateInfoURL"] @  Universal resource locator to a plain text file on a web server that contains information related to the current version of the resource. The format of the file is XML in this format: @ @  @   @   resourceName @  @  @  * currentVersionNumber @ @  @  ) releaseDate @  @  @  ) downloadURL @  @  @  , releaseNotes @  @  @  @   @  @ where: @ @ "name is the name of the resource. @  @ @ vcurrentVersionNumber is the version number of the current version of the resource. Usually this is in x.x.x notation. @  @a @ releaseDate is the date (or date and time) that the current version of the resource was released. The date is in the format YYYY,MM,DD (the first three items returned from the dateItems format); padding with zeroes for MM or DD < 10 is optional. @ @ @ MdownloadURL is the URL used to download the current version of the resource. @ @ A @ L @ treleaseNotes is a list of things that changed between the previous release of the resource and the current release. @ @ g @ s @ Note that as you can have multiple trees under the node if you want to have a single update file handle multiple resources. @# @# @0 @A @FI @ @ Example: @  @   @   MyTool @   1.0 @  ' 2005,6,21 @ & C http://www.fourthworld.net/mytool.rev @  @ @ = - Fixed startup crashing bug. @ ) @ ) @   @   MyOtherTool @   1.5 @  ' 2005,6,20 @ & B http://www.fourthworld.net/other.rev @  @ ?  @  @ , - Changed the term "Widget" to "Thingy." @ + ! - Fixed startup crashing bug. @ > - Applied universal fix for the "Make Application" button. @ 6 @ 6  @  @   @   @  @ uRIP["props"] @ A list of custom properties and definitions that defines the scope and restrictions for assigning these properties. This metadata item is in place to allow third-party "property pickers" to allow the end user to select only from the valid set of values for a specific custom property. For example, if a component had a custom property of "priority", and the only valid values were "high", "medium", and "low", this definition would instruct the property picker to display this as a drop-down menu with only these selections. @ @ If this metadata item does not exist, the property picker would display a standard generic text editing field to allow the user to change the value of the component's custom property. @ @ The value for this metadata item is return-delimited, where each line corresponds to a specific custom property and is in the form: @ @ (,, @ ' @ where: @ @ h is the name of the custom property. (This should follow a specific naming convention - TBD). @g @ ^ is the text that should be shown in the property picker for the custom property. @] @ is the definition of what is supported for the custom property. This can be one of the following (symbols that should be typed as part of the definition are in bold; variables are in italics): @ @ {value1, ... , valueN} @ @  @  @  @ 5This represents a limited set of selectable values. @4 Example: {apple,orange,cherry} @ @  V{number|integer}[:{positive|negative|any|range:{minNum+|maxNum-|startNum to endNum}}] @ 0 @ 0 @6 @ 7 @ 8 @> @ ? @ @ @ H @ L @ R lThis means that the value for the custom property must be either a number (real) or integer, and whether it must be positive, negative, any, or a range. Ranges can either be from a minimum number upward, and maximum number downward, or as a range between one number and another. If used as just "number" or "integer", any number or integer value will be accepted. @k  Examples: number @  integer:positive @  integer:range:3 to 10 @  number:range:0+ @  integer:range:3- @ @  text @  fThis means that the value for the custom property can be a string of any length, even multiple lines. @e color @  ]This means that a color picker should be displayed to set the value of this custom property. @\ font @  hThis means that a list of available fonts should be displayed to set the value of this custom property. @g trueFalse @ This means that a checkbox could be used to set the value of this custom property. (Possible alternative definition names: "TF", "boolean", "bool" ?) @ rect @  YThis means that the value for the custom property must be 4 numbers separated by commas. @X @ @  @   This means that the value for the custom property will come from a list that is generated by evalutating the expression . This can be something like "the cardNames", or "the properties of card button 1". This must be something that "do" can "put" in the Transcript statement: @ 1do "put" && tExpression && "into tListToDisplay" @ 0 [handler] @ @  @ This means that the value for the custom property will come from a list that is generated by calling the handler in the resource. This would most commonly be used for handling property values that are too complex to be supported by the other property definitions. @ [ The script that this handler resides in will be the same place where the uRIP custom property set is found; for example, libraries and templates would have this handler in the stack script, and components would usually have this handler in the group's script (if implemented as a group), or in the object's script (if implemented as an object). @ @Y { Note that the handler must "return" the value so that the ECMI-compliant property picker can display the result properly. @; @;? @ z @ Examples: @ %uSTSPriority,Priority,{high,med,low} @ $ uSTSActive,Active,trueFalse @  uSTSAge,Age,{10-100} @  uSTSColor,Color,color @  uSTSWindowRect,Window Rect,rect @  +uSTSTargetCard,Target Card, @ * ,uSTSActiveUser,Active User,[GetActiveUsers] @ + @ @ NAMING CONVENTIONS @ @ VIn the conventions listed below there are a few placeholders that are used. They are: @U @ @ This is a 2-5 character designator or abbreviation, in all capitals or initial capitals, that indicates the company or entity that has produced the resource. For example, Sons of Thunder Software might use "STS", and Fourth World might use "4W" or "FW". @ @  @ @ @ @  @  9This is the same as , but is in all lower case. @8 @  @ +This is the full name of the resource, and is usually one or two words with no spaces and initial capitals. For example, a library related to image manipulation might be called "ImageManager"; a table component might be called "Table"; a template for a Search dialog might be called "SearchWindow". @* @  @ This is an abbreviated name of the resource, and is usually 2-5 characters in initial capitals. For example, a library whose is "ImageManager" might have an of "Img"; a table component called "Table" might have an of "Table" or "Tbl"; a template for a search dialog whose is "SearchWindow" might have an of "Srch". @ @ @ Naming Libraries @  @ All libraries should be named "lib" (an acceptable alternative is to put an underscore (_) between and ). Examples are "libSTSImageManager" or "lib4W_Files". @ @ Naming Handlers in Libraries @  @ There are two kinds of handlers in libraries - those functions or handlers that are private (i.e. should only be used by other "public" functions/handlers in the library and should not be called on by any other stack), and those that are public. @ @ Public handlers should be named _. For example, a handler for the library "libSTSImageManager" that converted a polygon to a bezier curve might be called "stsImg_ConvertPolygon". @ @ Private handlers are named similarly to public ones, but are preceded with an underscore (_). So to run a transformation on a series of polygon points and return a different set of points, the function might be called "_stsImg_TransformPoints". @ @ Naming Custom Properties @  @ Like handlers in libraries, there are those custom properties that are public (i.e. intended on being set by the developer), and those that are private (those intended for storage but not manipulation by the developer). @ @ Public custom properties for libraries, templates, components, etc. are in the format "u"_. So for example, a custom property identifying the number of columns for a table component provided by Sons of Thunder Software might be "uSTSTable_NumCols". Another example is a custom property specifying the number of uses of a stack template by Fourth World might be "u4WTmpl_NumUses". @ @ Private custom properties are named similarly to public ones, but are preceded with an underscore (_). So to store some data for a status bar component might have a custom property called _uSTSStatusBar_Data. @ @ rNote that private custom properties are rarely used, as there are generally better means of storing private data. @q @ ENaming Components/Controls in Components (for those that are groups) @ D @ Components are either single controls (fields, buttons, etc.) or are groups of controls. When naming components, keep in mind that the end user will rename the "main" object (the single control itself or the group itself for a group of controls) to fit within the context of their deployed application. As such, it is suggested that the "main" object be named using the format , so a table object (which is a group of controls) released by Sons of Thunder Software might have the group named "stsTable". @ @  @( @ It is further recommended that if you are implementing the uRIP["type"] property, that you set it to be the same as the main object (in the example above, that would be "stsTable"). @ @ For controls that are inside a component (for components that are released as group objects), it is suggested that they be named starting with an underscore (_). The reason for this is that any code that needs to work on a list of controls on the current card (for example something that hides all objects on the card), can skip over the "internal" controls by simply checking if the first character of the "short name" of the control begins with "_". For example, if the component "stsTable" were made up of two fields, a "header" field and a "body" field that are grouped together and operate together, the header field might be named "_Header", and the body field might be named "_Body". @ @  @ @ Naming Templates @  @ Templates have the least possibility of negative interactions with other templates, since by definition they are renamed as soon as they are implemented. Because of this, there are no real naming conventions for templates, other than suggesting that it include the word "template" or an abbreviated form of "template" somewhere in its name, and possibly a nod to the that created it. For example, a template of a system utility might be called "stsSysUtilTemplate", or "4WSystemUtilityTMPL", etc. @ @ @ STRUCTURAL CONVENTIONS @ @ This section provides some guidelines to developing the structure of a resource. By "structure", it means the items that make up the resource, and suggestions on how they should be constructed and laid out in an interface (if applicable). @ @ Libraries @ @ .When implementing a library, remember that when the library is put into use with "start using", the library stack's stack script is accessible, but the library stack itself is not opened; for that reason, there is technically no visible interface to a library when it is being used by an application. @ @ @s @ However, you can also open a library stack (like any other stack) in the IDE during development. It is at this point that there should be some user interface to understanding the library and how it is used. @ @  @ @ Lib4WShell, which is available in the Files area of the RevInterop group on Yahoo (http://groups.yahoo.com/group/revInterop/files), provides an excellent foundation for the structure of a library, and should be looked at for an initial approach to developing libraries. It consists of a mainstack which displays information about the library itself, and a substack for "notes" that is used for information on what the library is and how it is to be used. @ @ I @S. @F @ Components @ @ TBD @ @ Templates @ @ TBD @ @ i-------------------------------------------------------------------------------------------------------- @h @ $SUMMARY OF CHANGES SINCE LAST DRAFT @# @ - Added new ECMI logo @ @  /- Changed "uECMI" to "uRIP" for property names @. -- Change uRIP["updateInfoURL"] format to XML @, - Changed date requirements for properties/files to YYYY,MM,DD (the first three items of 'the dateItems') instead of "any acceptable format that convert() will handle". @ @ ' `@M FJbtnCheckUpdateep ----------------------------------------------------------- -- Generic check to check for latest version. -- Part of the uRIPides collection. -- -- This now conforms to the ECMI standard: -- There is an xml file on a web server with the update info containing: -- latest version -- update url -- release notes -- -- This requires the following custom properties of this button to be set up: -- uRIP["name"] -- uRIP["updateInfoURL"] -- uRIP["version"] -- -- Fixing up the two constants and then running the _RIPSetup -- handler sets up the custom properties -- -- The xml file contains, at a minimum, the following per the ECMI spec: -- -- -- currentVersionNumber -- downloadURL -- -- ----------------------------------------------------------- ----------------------------------------------------------- -- mouseUp -- -- Get our current version info, -- compare it with the latest on the web. -- If we're up to date, just tell the user so. -- Otherwise launch a browser to start a download. -- If there are release notes and there's a field in the -- current environment called "ReleaseNotes" then show them. ----------------------------------------------------------- on mouseUp local tLatestVersion local tWebLocation local tTree, tNodes, tNum, tStackName, tSpec local tResult -- set up the custom properties based on the constant values set the cursor to busy -- get the info for the most current version put url(the uRIP["updateInfoURL"] of me) into tWebLocation put the result into tResult if tResult is not empty then switch tResult case "error 404 not found" answer the uRIP["updateInfoURL"] of me && "not found" break default answer tResult end switch else replace lf with cr in tTree put revCreateXMLTree(tWebLocation, false, true, false) into tTree if "xmlerr" is not in tTree then put revXMLNumberOfChildren(tTree, "/rip", "file", -1) into tNum put revXMLFirstChild(tTree, "/rip") into tSpec put revXMLNodeContents(tTree, tSpec & "/name") into tStackName repeat while tStackName is not the uRIP["name"] of me put revXMLNextSibling(tTree, tSpec) into tSpec if tSpec is empty then exit repeat end if put revXMLNodeContents(tTree, tSpec & "/name") into tStackName if "xmlerr" is in tStackName then exit repeat end if end repeat if tSpec is not empty then -- get the latest version number put revXMLNodeContents(tTree, tSpec & "/version") into tLatestVersion if tLatestVersion > the uRIP["version"] of me then -- get the release notes if there is a field "ReleaseNotes" then get revXMLNodeContents(tTree, tSpec & "/releaseNotes") if it is not empty then put it into field "ReleaseNotes" end if end if -- get the download url put revXMLNodeContents(tTree, tSpec & "/downloadURL") into tNodes revGoUrl (tNodes) else answer "Your version is current." end if end if end if end if set the cursor to arrow end mouseUp ~djCheck For UpdateuRIPcreatorECMInameuRIPIdes copyright public domainupdateInfoURL,http://www.ahsoftware.net/files/uRIPides.xmlversion1.01.00date 2005,10,17 cREVGeneral scriptChecksumrmҿrcG#9 handlerListmouseUp breakPointsscriptSelectionchar 3194 to 3193 bookmarks revUniqueID 1129609023361 prevHandlermouseUp tempScriptscript$

-----------------------------------------------------------

-- Generic check to check for latest version.

-- Part of the uRIPides collection.

--

-- This now conforms to the ECMI standard:

-- There is an xml file on a web server with the update info containing:

-- latest version

-- update url

-- release notes

--

-- This requires the following custom properties of this button to be set up:

-- uRIP["name"]

-- uRIP["updateInfoURL"]

-- uRIP["version"]

--

-- Fixing up the two constants and then running the _RIPSetup

-- handler sets up the custom properties

--

-- The xml file contains, at a minimum, the following per the ECMI spec:

-- <rip>

-- <file>

-- <version>currentVersionNumber</version>

-- <downloadURL>downloadURL</downloadURL>

-- </file>

-- </rip>

-----------------------------------------------------------

-----------------------------------------------------------

-- mouseUp

--

-- Get our current version info,

-- compare it with the latest on the web.

-- If we're up to date, just tell the user so.

-- Otherwise launch a browser to start a download.

-- If there are release notes and there's a field in the

-- current environment called "ReleaseNotes" then show them.

-----------------------------------------------------------

on mouseUp

local tLatestVersion

local tWebLocation

local tTree, tNodes, tNum, tStackName, tSpec

local tResult

-- set up the custom properties based on the constant values

set the cursor to busy

-- get the info for the most current version

put url(the uRIP["updateInfoURL"] of me) into tWebLocation

put the result into tResult

if tResult is not empty then

switch tResult

case "error 404 not found"

answer the uRIP["updateInfoURL"] of me && "not found"

break

default

answer tResult

end switch

else

replace lf with cr in tTree

put revCreateXMLTree(tWebLocation, false, true, false) into tTree

if "xmlerr" is not in tTree then

put revXMLNumberOfChildren(tTree, "/rip", "file", -1) into tNum

put revXMLFirstChild(tTree, "/rip") into tSpec

put revXMLNodeContents(tTree, tSpec & "/name") into tStackName

repeat while tStackName is not the uRIP["name"] of me

put revXMLNextSibling(tTree, tSpec) into tSpec

if tSpec is empty then

exit repeat

end if

put revXMLNodeContents(tTree, tSpec & "/name") into tStackName

if "xmlerr" is in tStackName then

exit repeat

end if

end repeat

if tSpec is not empty then

-- get the latest version number

put revXMLNodeContents(tTree, tSpec & "/version") into tLatestVersion

if tLatestVersion > the uRIP["version"] of me then

-- get the release notes

if there is a field "ReleaseNotes" then

get revXMLNodeContents(tTree, tSpec & "/releaseNotes")

if it is not empty then

put it into field "ReleaseNotes"

end if

end if

-- get the download url

put revXMLNodeContents(tTree, tSpec & "/downloadURL") into tNodes

revGoUrl (tNodes)

else

answer "Your version is current."

end if

end if

end if

end if

set the cursor to arrow

end mouseUp

K ECMI.gif @RhtGIF89ahtlUY ^ acf"o%p*t+6{5?@lllkl7$al.GkfZlil hlllj#UlMXlS/jlll  ?llkl:Ikd"%&(!bl7MllllilllilllY.fl.&%)IT^Tkl-^llililllilllj "dlXYXM2"/^kkkll)fllllACVWlllkl$blkkkeL%7_jkkkl$fllil@llllkl$dlkjke;*DTYSfl)\llll = cllllj#&elXUUK-!&$al8MllilillW?llllY1fl(#%$!TlQ/jlllilll=llkl:Gka!8kf\lllilil illj TlO%fk,+jllilll hll7&dl-YlSFklllllllllllllSKld"3jl):klllllllllllP&bl:`l`#,_llllllllf5Sld%,flQ/PalldS7Hjl2"(RllQ$9kla%,K`jllUIjlkd9$Edkkjlld,&Xllffk_*)RfkfQOfljT.(QllkI1Yjf5*K\YL.!*YllldS:,# *7Odllle18X_4")/1)3Xkklllllllllla7$,/(%DTflllfdZD(Skka!Ykjf!Rkka!KadS2546*,,,,,,*,,!)*#-")(()((!-+,,,*,,-(%*jllllllllllZ._e#9l3%_[%_Z$\\,lkllllllllf9Pf%ja-,,,,,-,Del8_e$Xj%9l3$_Z$_Z$_\$\\,lO(-,,,,,8alOPg%1l8j^$dl%_e Xj%9l374$_Y65#\_,l;Kl61:1l8j^:l8_f$Yj%9l3$_Z$\_,l;&lY/l8f^(kL*,%_f#)-#Yj%*-, (.%(. %.(%)$.-%9l3(.%$_Z$\^,lD!Td#,),%-*"),*1l8j^(kLFklllf2Ml,.l6_e$,X1"Mkllla.2flllklR &TllllX&T^" Rkl/#Kjllld7DO Rllll`,1dllllG&fE/_l\)7dlkkle5:l1Mklkld2%_[ $_Y$^_2lkllllM lSSa -l;Sd T_&Rlf3#Okllld5Pf%$Slkll^(KkkllkI^lllllj)j^7l2%alQ2,5al:-kHTl#_f 2lD^a9,-Dfl.&::dkHD26gkH-,Gfj,XZ*YlSK&'_lS2)6^lOQ_,^a5,-8alDMl^7*/SlS (j7-lfP5 KlY4*-7\lE:l9OlG.,6\lK%_Y%_Z$^^'GGdeDG0Qf**lM,lD#^` TZkkU8()fkQ1,8_lQPf%.ljI.,Dlf.%bkR3,2QlX5DOlSD;"j^%afTl6Sl*_k# fS_e$3flU"-f]#Yj&%ag,(d`%XT\^) Yl2ElHQaeM%Zl.7lQ7lG(dTTQ0lO%Za%:kj[$!Rl8%_Y$_Z$^^#Z_.lH7l-,l;.lQ"RdGd$$df.HlKOf% ff)%feXlE9lE1l8j^/dl,*kLeU;l/7l-_f 3el%Yl(Yj%Il.3l6Sl_(9l;Tl*MlX%.jS""Za%Oj**^lGMk,:l28la.)e^%%aY$_Z$^\#\_%_\#_Y-lD6fd& PlY!8lD!`e%Qf%9l5*lD2lP_f1l8jllllllllllQ%Dl)Ol#"fRUf#_e$2kQEl*Yj%^a$!aS#Ql5Uf(3l:Ll7Qk,.lF3l:)ae*29!:l27lLDl3&_Y$_Z$^\#\^8l2,lG,laTXUUXTYfld) Rl7!Zd2l9Qf&!Xea_Tj'.D"1l8jeDDDDDDE:`lO!^d5l,Xk#!fE_e$2l8Dl*Yj&(fKTb&Sl)%dT"(eR"Ol.El3Dl1(fK)dT,_l38lD4lD&`Y%_Z%^^$\_)kPGf&,laUUTXUUXS6Se&%lX%lS!Of&$kROf"k`1l8j^ElOelllllllllll2/l6:l)_e#2l:Fl*Xj%1elllllllllle*Tl(,jK^^%Ok*5l9LlklllllllklO&eR):PYdla`l39l3,lM&_Y%_Z%^^#Z_Pe&$aX,l;Sd$)lI"ea Pf%%lklllllllllf%#lO/l8j\el!fjEDDDDDDDDE&eU_X_f#2l9Dl*Yj%/jXDDDDDDDDD8$Sl(,kH\^&Ol,5l9LlO:DDDDDD;H0(dR$QlaK6/%;l28l2,lM&aY%^Z%^^#^^/l9.l3-lD!Sd#)lI"eaOf%%l\:DDDDDDDD:"lO/l8j^Ql1aeIl%)k:_e#2l9Fl*Yj%*jKSk()eP%aX$Ol.:l5Il/(dRPl8:l28l91lI&_Y%_Z%^^#\^$_YNd$,l;Sd &lR$lY Of&%lQ"lY1l8j^El2Ol&,E&)k::f$_e#2l8El*Yj%"aZ#5:%Sl(Yb&1lELl6Ol-5l:%D0(eR-lLDl28lK:l5&_Y%^Z$^\#^^7l+$eM,l;!Se$ aa-lDPf%"dd4:\f9k,1l8j^8l32l:Xl#Y^^R_f#2l8Dl*Yj&Ql)(dS Sl(Kl2Ml.MlX%*eX%&dT!9l7)dR/lD Tl38l^*%_a(%`Y%_Z%^\#\_*jE.l/,lDSd Kk2Pj,Qf%Hk,"k_:lD_f1l8j^8lDal,1kM8l:k-_f#2l9El*Pf&/f_$Ol0Sl(&af(5lPOll;Ml7IlE&_a&)eQ,fX Ile4:ldPDlK%_[%_Z%^\R`Pf]Z-lDSd$%la!1lSPf%(l_ Il6ej.9lE(l8j\.kO.jk8!!8je%dkd#_e#2l8El*DlF,%Ll_/(PkLSk(3fjD!&Ol_(PfNdU*)SlO%XlO%-_l5(dQPlQ&1\YKfR(Dd7__.%OlT#%_Y$_\%^\IlD)(-lkI,l;Sd#1lf5&Ml^"Pf%:la.%LlS,lj8!%Hlal_.,j\$fj%,dlllll_%Ml;_e#1l8El*&^llR!:klllklKSl(-_lllllS%Ol*,dllllkE Rlllllf2)dQ$Qlllkla)QlQ:k%%_lllllO!%`[%_Y%^^*fllQ$^b',l;Sd#.`llllkP#Pf&7klllllP&^lllllR%Gllj)-:D9*),&2DD5$)9E6%Ol*,9F5%:D;/):D:,)9E7#*-&$dX,9D6$Qf%4DD6%)9D;&%,,Ol*/l3Pf%Ol,!SaSe"Ok**,Kl:,6lZOl,$TlkQ%lla*&,&.&.)*HXO%*-)-3DDDDDG/)&. %8EDE/)/)GDD:*%1%2-f6,9j(P4D18EGkM9H d18F!:XKD:dO8DK`8DKdD8ZED/OTMYHa&5:!)D:%,*,"#)D/,D/$$,Y%.D5-D5Y).D.,D8%&"5:!5IR7QG0^,*D8 ,E1#8:&$%$%& %(,E5 &D8$)D4% !%&D2 P8F_5D*!(&$(F5!DK(!&1R:!#%,E1%$:6Ha%dTDYX.dIOf!$X_\.dKdQDl1DaEXaE9O R_;^R#QaD^T)QIY:d:8ZDTY"*_a;aQ&aT;Sl-a4FS EdDST7^:`M0dOKf2R:MEKb`7Pa8_O9eGQY#1`DYQ(P)5lOFfE-R,SK%aTD`4%Q,4TDe;XZ !K/1T3S XkO1H6Od:ZX-lRG`SHla9 ,d$)X6&k ,f.-UR2.^$f7P94T$e&0X$d&8Ka2).:&$U%3Z(3NU;5`*%\aTTaS,^-Y,PE&.&T8NKO6S8`MD[$&,1X3Q5DP%/$/O%KXKO4fXTYaDPP6O)M,P6(Z*#L6$Q)5O8X8_)Q)2a(Q*5e2`.Z\8G6G):Q\^:MDDk%f"D9j&f2Z3f%T5f%O6*_S%-:PdRODK6,R)2L%1P4*&RMHkYTRl2 YY*5M%DD*H,$S-)S*T8:kZTSl:T^-:K"O7I9DY%,-T8#adTTdR%G.1TFRF8,R%E5 KDDO1S#HD%K5:L7LE6(lS/K3)\4&2IR1S2)T ^P4)_%%f(f)$`a,%_a,2j.3T5D8_1T..M%ODIK!1OSL(,,-!,f18GT7-G%1Q"8KO3OS%-,-$*aFOH"O,%K/PGGM(X.*,,&DM:5KD&O*5TO)(O-M87XO0,R0H3"D7Ka#Gfk!b$8LY7k$k 6K/M8X%TT1T$]7TIX8SE&T#75R:MDa1T*T,$Y*'j5YI6OOERD57!MD5O(3Y%7M!TSQIRGT6:OKL3: :PO0/O/K$(T4KK$Q*/X,1fIESKTI:(X$Da(S.EEMG OM%T#(M(RfXae*%^d!&kYa`Q&\!#_L5D8OleY8DL)b[eR!(aZeS/O#%e__a%2d^XkD2L&(O(Mb_Qe-d4:H$aaaY% _bZe-Od_d2.aaTk:Q6.d_dS "\d_a(XfYf2(O%;O9L0T,MHKkZd88k)%Xa_^$ L/ YdSfR"Td5D6*d_dT1^,U ,)!, $!4d,*&*&)*$-!"(*)((,%, * ,%()&, "-"()*$,&\R:`P4E/; cREVGeneral revUniqueID 1129615031788L RectangleK@1O` cREVGeneral revUniqueID 1129615843163M RectangleK@,F cREVGeneral revUniqueID 1129615881430R uRIP.PNG @ PNG  IHDR  pHYs B(xIDATxڵV!@І6Id۴6hicDmش}#iiN@wI:̼˻; /oŊFS)6*?IQΠ7E4xWD@) .d\MvP8*kˠ]/v#9  .6QǁѩO~f`tCb&O[icJǞp|H@ 30P=`25 mPM^ ?XM~BbW C J62. )c^)mJszj@ٙRbdvЦRS{4$>M3Wl/82^wPF&zѲ4eAGn=)-M*:Uۆ`y/dϹ8Ehz}uqq.#oǝk!L^0Ӵ2 )"8;HkW3!gZyHݭJ^(B3ٮκ xʖX&tK-^b-2pSvG<ށp8 @F؞@Greil;BzV7i)Fu1@ni@#.*‪]4MӬ+~/;h4 cu߳pI=Wi4gu/Iwux-r2vΏRG?!.t/  PZWVt;b6Zڍbh` Fnf@$d"idg2[6M3Wl/82^wPF&zѲ4eAGn=)-M*:Uۆ`y/dϹ8Ehz}uqq.#oǝk!L^0Ӵ2 )"8;HkW3!gZyHݭJ^(B3ٮκ xʖX&tK-^b-2pSvG<ށp8 @F؞@Greil;BzV7i)Fu1@ni@#.*‪]4MӬ+~/;h4 cu߳pI=Wi4gu/Iwux-r2vΏRG?!.t/  PZWVt;b6Zڍbh` Fnf@$d"idg2[6!B.F\H6K< $GC`=@/s@CB.q3o{v 8y-%hV`=NǮYa kW! 9(@kڗp P#)_BhB=|ޤKNC1!0J#z&`kRjձЮ&+<] &G,D|Ȇt[N6ĨEِP(?Fq. !u *|BHBU-\M,Eʤzt$xi'U]+b` AopŤ U(_@=$r <^?Y`x<4S HhPK;T, #:@!f2~s!dPN)HHT;h@&qkxT7{aNY1h_%KrW&G<R!r+$ FoAM}RJ@={Ez50s/!ձAt$QI5;ʱU μ Ke/Ci\v+рr a:tQ:B fRԭ[)e1>-y[D5ĤpZ]75vGpb:` rvmX+U]t&{(6_D[̞:"'WLP 籧AapPUfxzogUzH nR+ O) $5>E,9 e?n@fh<؅R(Nޕ{}tJen!@rLc.YVEvrgssSuWW$JF]x):wkq |fZZ PPVaͱ5[|kޖn"]y".+(f7UjvJnuAWo X[}C>+30F+IG(ћr3 qG&*s Z3>> $`m+㮤;%}rZDsnb;_Rt/c.FW#jtdrN0@$hGbnp2FZQo'' 99TPR6`t&G< ӒR-!A!uy ͢%S#Q& h-fӣ4h>-K+yfP W5Q^== p&u؃%m4ewr N'wjQ%D: DW; n0(P1'"  ]І"*tr8@sZC'K`=wC'xF0[B'N|h#$=#oPylX%C:ІsPB4!uP{%w!J P0[0[R `=A5LaNԑ2dC?ڱ!=(7!SyIXwuSoC @;Q{a`hW$aE  (QI^y`x?1 ֡ighcc;d8qXic0E Ј`  :u!h0@<( GL4!n8rc@m̗%ц?n,yg3P=aqIF#Z9ɀЏENqh拁hrA .wXEYx` x"[DY.K(qCM-Z/c&`9,|qҕ(?U`Sq2>҉Q:q?8R0 0!)DaRI(()](o@tNb8`<&(bHseB]'R/> {;P(p _p9 L1 :0YgowhXXeЄ599gB8yJ3( T-b1a1 rb>n('Qpֈx8鋓>L|ʈ z;PK!IEqgX;W3qZ0?Q [$LŬX zQ LՇ+>o%"Yh7[Uo#ЙƲ& " "*QANqoOw1+Y*76s>L`&3f3Z Դ<#ҷMC!ŀyi7܊(  ǻ{!;0EnĹR KNst+ &{J wھxL QѶdOT0͏_abӤ=zhx8Y^% tdA5e zQ3hWemK=`CX ! ?;x$:Ug'_ $7ÒF5PхCZhE*wVaAn6P)I"e 90)Μ|#hn2wdl 2._v6.ʼnX>٩ 5d-\?wh Ms+P,ּT}n/aЗ56&hi:w^3T@`] P[-8:q\+dFG psD5 ~(%'J]9 BM}(tގHT`a WhݐIS9̔~uO\dEp#fԇz>Z\Օ)Y⛕ b~A3+L: +_ꨛY3 Nfas7JExyR .e- Ydi2)r`bҤTt" LI|m>dV:92˅hSTW&i)0W^a1&B'S槱]>aO >QifvS+&j}'ZDBL~RWm:(-'\m؂)ߗ}ˡ8'k"؁e Lq,hqM wE>ɖZ{b)Qp"׵Q.;ւVMNfw( bM[*"VAM=<&9M, !7m#6&"!)ݹaAYvV:BfKphtu })1=ak]lF+xN(۝'m:ppuI-S^d>3c6W*Xͣ}˛A-Ӓ(ZӢ`3OFղR  z}y' ^AX\; Um 4 @5bňX_wC̍TZ%B9) 0205S>a {s 7H{PjN8(`xJ0>A(ɚf#|z$ Wޓ :#ذ+.(BAk12SD'RVnEGP8`I+(Y7,CAJZ!az S&%8b΀8ظDJ . E(-?$R-` P@h2‚;N@W:2vP̤9=prJsQB,9+ |`6ϩЌ-ة譴50%>5Pu:WogYLUf*W06">Z8*R kRԖl^,/лKPbeJ *e=`RFCgcHs[3vOk"Η0[=HRIzMTzBIh]Y)~g574bn`"Բ=V $_-nl@GsބBJDɚ6͈S<. \ D u1a㇪d$SDco栺%Wmj2ĔR w֚CavE7F8-~[!UNF:HAM,ν+YM狃E̖,\&&- EK)!Z&M)1oU7t0X[&OXv Hm[ H2 w\%Q gURTrhX$}6 [%G1,KX(qlh3!$ʁ"\dFɴnexO{NT1!I rAZ9Ғ0zSJPJXDeˡ쩉iF\pk7gMN@0u-s՚qHDŶr=MiVU]kU)1PGs"v~^j-ArACWb&[L4c5I{69HX$ r6mSPo@,H HM;}*JFq۳s;L$-YѨh,2'l1wLHSJRoyBrը|=RN?W 6/执(#(1mN]q@䟭{B4v޵z z<~A  8;C䛇D,IYLFTNA^U*.yAg/Pq3qwaCWKw T&Ɓ<?aM7wCR\sKQ@ ϰWi'7'B{U";/s~l4 |p[Ҳ 3Zd=a8kYU^(h .% ,z:!"nC(ltYcw|x󖆺9zRNgxpKFDv P:@`AS80pQA Ѓ|^8_ 5̀!! Ee/ K 0K牼P6h`%`x8X(M  p @5e$SZc &B@ ] @ X#?-nV:3wqB# 0u VA=k! H" a<%hF` '{H)? ;B"a`h\ `)*X#]m@ՀKP ) 0u #3) $ A("H` Sɋ@3a 3qp({Z#C^ s5PO PA 5$al%@cZG"e 0]r \NHBЍ~ ) H#긎2u{|̐( (!0%lRZYِ p"g!@ (F KX‘Eq 9`QZ  &Ph0@<N!"U8/9y/ 7Sg̐3)al)E E} Q12`i-; %y'˰1lYKI&5' 'e@KxoS7@Kz݀Nfn' E E0PhMВ9rѝriPԛSK5ߠِI "ˠי5]%.KY|qИF3A~g*.hwXPPSKđ%fLQKS 8Tgp]A%.".(4RlA JIFH! i'!R  p |YP$5xO( &b0 2^C ÀPê.PW7KgL Y). @@I(F#1J- v^q 0ձ 7~BLQ۳#st P$1[ v- /p$5'TW0 0qt TWT |22w r,A5 Wiw+:5,0W SjH(82cPG-DhGҹaB!sX 'BmJa;T uk%ʞ<P{`0eT[)  Tq А57IΑ *I)-L;WBq&*KFGGECKNR,Y $eSlS]Xp29 >AGHIJU63o ([{\=֭r)GFwޑiaII?w0*uㆵ?xCmےDPJ8jof*0T?8ˢYyb k}E1U,LeQ@!M KiJGQ');0^@V!  D7DfXǮۥ 4.[uQhT:U |kXkv[cA2@Z,(v\ *45SW ]=dkNA3[D48\zN~V$hy}Ke ف"M}t `Q:(P?iDVgmΒ$P؏bC,CE0a-YKEV4&l*&gqCJW؟ Ѡ34 p fni))n XitQ ֋:TȖ肃IיR8룒g%s%'S!vkx /z9L:+4jqΊoGdST'q$u`X!dxrzEjE5j\>l[ tT6-) k nm5>'3m*!tmZz>b2.,@@@STʬ*?:V`4|Fg%3 Ő>Rl\q>GAv41\*}jmBEE-1oVmK-#a]#VߙL1b25-HSK^*CsKY=9{"Ԋ` <֥ =-W&ґZ{<ʻ ,@Z23u;M:j! 0N"X2)L^?hn@:unjAj#ԁ:C2/ VKQ(p#p.ZYgDIy;:"h'Sa%$d#lp+Q6P@wf21u!+ _5.$PHT 􉃀0B6q ]Fu).ЅĄ69/ p@d@5 g2 "C(m!'S;2YΫXj0tO2! 3@GlUΡHb?1KL^"`]4Q[89)螦 /_"D3E S SK4pݠ,PAT"^? "==fŜ[!{Isb{A figx"HIqU h#q1j0XRWCQeX%G[ .n @tvX?)JPE,#86Y`![ ȳ4dB0tSu^HUCZuog0#]&U%ƫ,+֏Le\$n 0[VzWU|lW+ŕ!w@.ɔ2Hiz* XO03`-VMu?#/8e5T8iW@Xضeebns{B1Cs(xN pGp?9AZk:>fp$E%]GHg?nf7/B/3Vlpj_pBFbdV^+wn40DA`N'ye35~P &%]f3C'D=PP}?RgÆ_9B;@T{ $`5""mo @,KU=UHXeZdcX3AAO 0"` C.Bz2hF,D2@-c465|1@:E *sOb5`~Ztz02bF 0(DC[Yr f$;P;Ãq`1!PI)vW- ;00h%Z7z z%[;;ȉfrt** 703HSN()> JIE4$}/#zL ǎZ7LYZTs5UiXM sbZ@lNv @B? T\PFv oz#F×<$ix0A'Y$YZ`RZw%CD!J00Ð9$  Y@"y2B=`ƉLp$Oo6ob0Si!QPIBRd`dIB1Z`&a0;N=X'mŜj1 AS ]GH'  ƕP-H<\eeqWy h=ԩ$Nj yr _ BZHqL#pw1OY0O[%!R`IH(kMa5/IB cjq#  s-['35'=6HGn_{S 2N Õ>4|}`)+^>s2ie8K|5$yH?dI: KE}`;eVp#q'AM4'u531#^;e' Sid ~:[S+PoAE K;$%̠@Ď00Qs/Fy5;ڱ5GҦXx0@ Q|(gȱ'%!b1z#4'P Y[!,xR#i(SbXQBA6 ,D7Ba(P.`Rg3XDgmc<7 #kGJKM H>"UnZ^%c# c #%\o*ms8wK ?yzJMEN"V+^' i f$\k'Ӑos9B?OE䂃MRo41Ud ě! L8P]Q\U{-K ;8 S0GY撬rk\ĠA.m)3Lj(v  `"Q0$ݸ bN7hha%Ӳ 8w .VP@/ hm11Gw'~ SJe]Q;OɁpDC!oLY.c&Q=+Lə R8n%䊶R HL&H0ZxYOnz9 6'pb)E!@q" U .1SP$mDAH0'@4%tYE{zXAgP a :,(ā4_81L1yUV0 EB cr g}$E`9Tj6fISV4˜^AcИiEqE0Gs/BeTCU'#HcLPfCQ g &@!܉B M*naYIŕ(>Exifҧ]J;))H1P6Nz3a@d؝SN\*呸΄5! j<%nRl$qMJAH!,N)-*S3'WI`"i1@$:_3[ }b6v Q@@k\q8~&cOAmjt0I_1mſuY?hF/ӌ8|50 P.RJ馛Td#eE(j)Bm`AsM-+.I/R~N؋_(2?R7dKNlpn.RbS 0~3|,냾qP/3BpdI.0>}) ,MSzd 9%qE( ӮD2L6k6ҖN~\XG@ ?BvS@,Eb%9jHTFp5PvPG2t I5d>Р Vࡈ4)B'fM|W!8w1g"%uJkZ<@r CDEeE;!vb-ITT7*-/RIJ"`9,E~3#FU5ѣ8PuQӞpia :M*F;4*ԕujzF`-.IybzZi˒& #q*~TISnAkJCu  ʯ YdpuɈ\n6P@ULGtl8|2]GIyU$A.ju[J΅{M;U*hqW7 -@q- P酊y`#:bش,b$1n{S'O` ګ*A{aYe '4r4BŊZ֜ 1hl1`E `ԥ9զ1#,JaCc44ER= @kwu~'& @D؇ų1 EWh VY'_QOc kM&7 +x0` 4:ђHѠA `x_ds^Z`@3P( `Qn QP$Q94Wi〥 < n@B!mh!Q7v ND1= 0 Q/,,6xw2v34 <\PV7a1i=F!?QeQeXUy<0=& wXEbv X)*<- k !x R2K)! !p:2 & <249)Dѕz'ӡ2?yE #D X`%6eM&py!!I%!u:I9 ivC  1g"J94#DA QP@ | ^R0S@M' A<h(R>>PU0:V9ypB)!EvIиJ(p4S[bl~ = @!e2 2=ډNE~a@h!QUAK *"hx[@aBy( Xp(V^ѕ) T'vx㝗 @*՘"3=IMpkm ]I9k &;(A3!x#&!-2 6 U0YI`vymi:EUBG'#$G7 ײ p&O !8Q_ l4 ~0 ;q36Q mBp Q*0z4_D9d2a=]9`?YU ' mpC 7Y7I<5eGN-21: 0`Ih#J p#{U`xZFbi UZb0{C&9o3 +2*C`I ř&7jf$kU* Co@H0@)B!q" GHp6k4 IJ< Z@*7#xH&$[oTQ ( ( Côߢ7C 9)"'s)pfz+:BT`j2?eבk24㣶T@A:Y"oP7 Y: =iycU04 d&K9xqCN4 Yh(kә*!K egj i'!!֪"Aq "!PRT&it CըP(T3@MY3L@x;)#kti  q&pFTʊK-\1i2&YP;bt#{ 0[0kQ JNTI 4`g&7U&@$K9@ aQ뢛p0e(vh=U{zș!,xR td=eTY Bp`6KxF!l {DD~O5m(#abc XXY(r1BN>,4`HhI|$f!Y/gR_ R0 B ܔ8X %Hx ńTfT "F&41gX1HQ'HmlMXS(Ti~/iȝ ;"Y稡%:f6mjBNOD8Qd+EvBp61nڸ25 m)$FoiU@P8k& dmvC%?Ly'#/rƭ&*'II{EsJ50Ax2rP^RmLr,')Hu-a]Ob1)gDV#h2jo]! "M9q5,I| Ґ5 PS "\Yj*'dUw kU7zQsEլ."X!%^@gf82]Ą=teBQDM()'d* WWi2zIa>$Ģ}rR (9aR| Iv*V88M# 9\t`6~)'-mMXza!ngCTnpR -e^(f{! J2d(_ɲnVdtB lpڨ(aV(0,Dr&.w(QQ jz#6!hFILԑQdS,PlF`S4jp#%cX[@(bJy)\w>\=m=H?qB?ػ:i)q; 19ȭF>[„T]D,PPA$>5˞MqWd9Cr^{ǀYkNXB'C(8kOĊBwT',/xKK/5+d_pfG;x.wS9^ !ޤmvA~@œĦԕ;M_.mFPpa58Y. 9)U۹d31!BW>daX7& $X,|+"w$0H"2NwF. t';'K20$o4$x땪8 t&w3+ t08B<]RҍEV !E2ndR]ƍ(qLKG?,Uq"X5""*'8G)` ,Q1-/I_23b8ňHc:"g*F B;Tc;P4jp!!pm'fת ƈEEߦDx.7#}CI+|`垹`+lgD!" V9,5B'#l)qVs XFo;} C:(^/ iX% g q^m#O}z‚?kuIPji-/W@PM3!\7"^N,!PT7 IP kF Rhd6g5~a OנR['#T$Iλ:ϯxl}Bee!A+?IǴhNYv /$I]>L ,|['NgP6`RVH K;_ rL^7d=.:ʓT@:͵n^\&n%;ԎlxQ"qSPYMcy:]jj2!K,@/[zehm*9i':O_® smn$8sF#n w)a q]h׵S&V^BHSˡkWє]]\8ʼn<K*k%HA uWS*wҮa&(%&mF4Tu c !jZӲ9^s _Z݌-4ltY]Q|b' SMv LK/7 wk 5.O;5@"ciW{j16 H p*gs{c.Kӹ3u?i&.Eoi, æ&&k~.HEnWQͣеV@-,2= PW<@ YD{g(q$AuQy-^g&x^|WR ` g6pwB_eqcvr}}T`p5V^ Fkd"~Y1yyU7/~V /37>DxX#Du:> `҄QAw5sdR :"!*69rDeXTT>nV>>'q.@QEG0< Xo:S?.B(C&i#3fXs)!s~  @byHʧ|5!ISaB(Ipgy[hiqU U $gr% &67ŒR@ 48Ag_ppuʷ|p v w! -:Mr#Klw@ӌ(u-l1"a(B r(\;a.>БxtЄ1X7p,HJ=8w kԆxT#7Grф5[r w%XE"pܑ߀xN0Cцg0K~y!qWa?pцpr2s#rAEcGoQ s!¨? XP'*1;p @aN_R0J p!Px!g#PFY-sћ Q QEި|ިvTYiiE0gE,y! "p9+Ul7r`J=b CW`urU q=R#"'wcr؛ xw[=,uh7 YDWiV(9RCiu0RsZ$k}P؛@Л02X0kP02<#$1 JTn U @a l@ y rґ H3ᑢ!ʒ/ʡhs5 6*ل )WR$jz- 8@8n2 CYtIM_!&{>'Y%1Y)FwB ԄQGƠiRfsXDa1'B{JJ0s t M9K!1m1@DPE> BAd v !PҹU*{i!3J:zCJsZq C2n ^5&Yp ȺXrt j ϳ7B?Pf)س>jk0 N+ M@z s F>|wŁF.(v؊Ja  hCŽp2K{QZ,+ G)*ŨQzP5k! !!4:)*!`-p(ӆ @6: D>*XA5E}cKH٢IДI0n'sR[@BXXQPxhP@L!Bhyz(@OJ鿩(Bډ>["Il2q2 %EdI4PVۤ8 K@ P) H he۟HZA1?idpL@P!,xR#i(SbXQBA6 ,D7Ba(P.`Rg3XDgmc<7 #kGJKM H>"UnZ^%c# c #%\o*ms8wK ?yzJMEN"V+^' i f$\k'Ӑos9B?OE䂃MRo41Ud ě! L8P]Q\U{-K ;8 S0GY撬rk\ĠA.m)3Lj(v  `"Q0$ݸ bN7hha%Ӳ 8w .VP@/ hm11Gw'~ SJe]Q;OɁpDC!oLY.c&Q=+Lə R8n%䊶R HL&H0ZxYOnz9 6'pb)E!@q" U .1SP$mDAH0'@4%tYE{zXAgP a :,(ā4_81L1yUV0 EB cr g}$E`9Tj6fISV4˜^AcИiEqE0Gs/BeTCU'#HcLPfCQ g &@!܉B M*naYIŕ(>Exifҧ]J;))H1P6Nz3a@d؝SN\*呸΄5! j<%nRl$qMJAH!,N)-*S3'WI`"i1@$:_3[ }b6v Q@@k\q8~&cOAmjt0I_1mſuY?hF/ӌ8|50 P.RJ馛Td#eE(j)Bm`AsM-+.I/R~N؋_(2?R7dKNlpn.RbS 0~3|,냾qP/3BpdI.0>}) ,MSzd 9%qE( ӮD2L6k6ҖN~\XG@ ?BvS@,Eb%9jHTFp5PvPG2t I5d>Р Vࡈ4)B'fM|W!8w1g"%uJkZ<@r CDEeE;!vb-ITT7*-/RIJ"`9,E~3#FU5ѣ8PuQӞpia :M*F;4*ԕujzF`-.IybzZi˒& #q*~TISnAkJCu  ʯ YdpuɈ\n6P@ULGtl8|2]GIyU$A.ju[J΅{M;U*hqW7 -@q- P酊y`#:bش,b$1n{S'O` ګ*A{aYe '4r4BŊZ֜ 1hl1`E `ԥ9զ1#,JaCc44ER= @kwu~'& @D؇ų1 EWh VY'_QOc kM&7 +x0` 4:ђHѠA `x_ds^Z`@3P( `Qn QP$Q94Wi〥 < n@B!mh!Q7v ND1= 0 Q/,,6xw2v34 <\PV7a1i=F!?QeQeXUy<0=& wXEbv X)*<- k !x R2K)! !p:2 & <249)Dѕz'ӡ2?yE #D X`%6eM&py!!I%!u:I9 ivC  1g"J94#DA QP@ | ^R0S@M' A<h(R>>PU0:V9ypB)!EvIиJ(p4S[bl~ = @!e2 2=ډNE~a@h!QUAK *"hx[@aBy( Xp(V^ѕ) T'vx㝗 @*՘"3=IMpkm ]I9k &;(A3!x#&!-2 6 U0YI`vymi:EUBG'#$G7 ײ p&O !8Q_ l4 ~0 ;q36Q mBp Q*0z4_D9d2a=]9`?YU ' mpC 7Y7I<5eGN-21: 0`Ih#J p#{U`xZFbi UZb0{C&9o3 +2*C`I ř&7jf$kU* Co@H0@)B!q" GHp6k4 IJ< Z@*7#xH&$[oTQ ( ( Côߢ7C 9)"'s)pfz+:BT`j2?eבk24㣶T@A:Y"oP7 Y: =iycU04 d&K9xqCN4 Yh(kә*!K egj i'!!֪"Aq "!PRT&it CըP(T3@MY3L@x;)#kti  q&pFTʊK-\1i2&YP;bt#{ 0[0kQ JNTI 4`g&7U&@$K9@ aQ뢛p0e(vh=U{zș!,xR#5PY5Q5F!p1`,"- FC(l<C0d !5B%LQHIFx.wm`}HHDNOPTVU\]\!(""g%aSotqV4z;=>KFGGECKNR,Y $eSlS]Xp29 >AGHIJU63o ([{\=֭r)GFwޑiaII?w0*uㆵ?xCmےDPJ8jof*0T?8ˢYyb k}E1U,LeQ@!M KiJGQ');0^@V!  D7DfXǮۥ 4.[uQhT:U |kXkv[cA2@Z,(v\ *45SW ]=dkNA3[D48\zN~V$hy}Ke ف"M}t `Q:(P?iDVgmΒ$P؏bC,CE0a-YKEV4&l*&gqCJW؟ Ѡ34 p fni))n XitQ ֋:TȖ肃IיR8룒g%s%'S!vkx /z9L:+4jqΊoGdST'q$u`X!dxrzEjE5j\>l[ tT6-) k nm5>'3m*!tmZz>b2.,@@@STʬ*?:V`4|Fg%3 Ő>Rl\q>GAv41\*}jmBEE-1oVmK-#a]#VߙL1b25-HSK^*CsKY=9{"Ԋ` <֥ =-W&ґZ{<ʻ ,@Z23u;M:j! 0N"X2)L^?hn@:unjAj#ԁ:C2/ VKQ(p#p.ZYgDIy;:"h'Sa%$d#lp+Q6P@wf21u!+ _5.$PHT 􉃀0B6q ]Fu).ЅĄ69/ p@d@5 g2 "C(m!'S;2YΫXj0tO2! 3@GlUΡHb?1KL^"`]4Q[89)螦 /_"D3E S SK4pݠ,PAT"^? "==fŜ[!{Isb{A figx"HIqU h#q1j0XRWCQeX%G[ .n @tvX?)JPE,#86Y`![ ȳ4dB0tSu^HUCZuog0#]&U%ƫ,+֏Le\$n 0[VzWU|lW+ŕ!w@.ɔ2Hiz* XO03`-VMu?#/8e5T8iW@Xضeebns{B1Cs(xN pGp?9AZk:>fp$E%]GHg?nf7/B/3Vlpj_pBFbdV^+wn40DA`N'ye35~P &%]f3C'D=PP}?RgÆ_9B;@T{ $`5""mo @,KU=UHXeZdcX3AAO 0"` C.Bz2hF,D2@-c465|1@:E *sOb5`~Ztz02bF 0(DC[Yr f$;P;Ãq`1!PI)vW- ;00h%Z7z z%[;;ȉfrt** 703HSN()> JIE4$}/#zL ǎZ7LYZTs5UiXM sbZ@lNv @B? T\PFv oz#F×<$ix0A'Y$YZ`RZw%CD!J00Ð9$  Y@"y2B=`ƉLp$Oo6ob0Si!QPIBRd`dIB1Z`&a0;N=X'mŜj1 AS ]GH'  ƕP-H<\eeqWy h=ԩ$Nj yr _ BZHqL#pw1OY0O[%!R`IH(kMa5/IB cjq#  s-['35'=6HGn_{S 2N Õ>4|}`)+^>s2ie8K|5$yH?dI: KE}`;eVp#q'AM4'u531#^;e' Sid ~:[S+PoAE K;$%̠@Ď00Qs/Fy5;ڱ5GҦXx0@ Q|(gȱ'%!b1z#4'P Y[!,xR td< eUcUB* jB ,4 cHB91 + 0-bp6! 0l5hdXdE KIKeOl+SO'Ye!`!\c$NNVVW)k,34ux: {~AA}@AHELlq \" ^̞Xi).wx ED@>OT0͏_abӤ=zhx8Y^% tdA5e zQ3hWemK=`CX ! ?;x$:Ug'_ $7ÒF5PхCZhE*wVaAn6P)I"e 90)Μ|#hn2wdl 2._v6.ʼnX>٩ 5d-\?wh Ms+P,ּT}n/aЗ56&hi:w^3T@`] P[-8:q\+dFG psD5 ~(%'J]9 BM}(tގHT`a WhݐIS9̔~uO\dEp#fԇz>Z\Օ)Y⛕ b~A3+L: +_ꨛY3 Nfas7JExyR .e- Ydi2)r`bҤTt" LI|m>dV:92˅hSTW&i)0W^a1&B'S槱]>aO >QifvS+&j}'ZDBL~RWm:(-'\m؂)ߗ}ˡ8'k"؁e Lq,hqM wE>ɖZ{b)Qp"׵Q.;ւVMNfw( bM[*"VAM=<&9M, !7m#6&"!)ݹaAYvV:BfKphtu })1=ak]lF+xN(۝'m:ppuI-S^d>3c6W*Xͣ}˛A-Ӓ(ZӢ`3OFղR  z}y' ^AX\; Um 4 @5bňX_wC̍TZ%B9) 0205S>a {s 7H{PjN8(`xJ0>A(ɚf#|z$ Wޓ :#ذ+.(BAk12SD'RVnEGP8`I+(Y7,CAJZ!az S&%8b΀8ظDJ . E(-?$R-` P@h2‚;N@W:2vP̤9=prJsQB,9+ |`6ϩЌ-ة譴50%>5Pu:WogYLUf*W06">Z8*R kRԖl^,/лKPbeJ *e=`RFCgcHs[3vOk"Η0[=HRIzMTzBIh]Y)~g574bn`"Բ=V $_-nl@GsބBJDɚ6͈S<. \ D u1a㇪d$SDco栺%Wmj2ĔR w֚CavE7F8-~[!UNF:HAM,ν+YM狃E̖,\&&- EK)!Z&M)1oU7t0X[&OXv Hm[ H2 w\%Q gURTrhX$}6 [%G1,KX(qlh3!$ʁ"\dFɴnexO{NT1!I rAZ9Ғ0zSJPJXDeˡ쩉iF\pk7gMN@0u-s՚qHDŶr=MiVU]kU)1PGs"v~^j-ArACWb&[L4c5I{69HX$ r6mSPo@,H HM;}*JFq۳s;L$-YѨh,2'l1wLHSJRoyBrը|=RN?W 6/执(#(1mN]q@䟭{B4v޵z z<~A  8;C䛇D,IYLFTNA^U*.yAg/Pq3qwaCWKw T&Ɓ<?aM7wCR\sKQ@ ϰWi'7'B{U";/s~l4 |p[Ҳ 3Zd=a8kYU^(h .% ,z:!"nC(ltYcw|x󖆺9zRNgxpKFDv P:@`AS80pQA Ѓ|^8_ 5̀!! Ee/ K 0K牼P6h`%`x8X(M  p @5e$SZc &B@ ] @ X#?-nV:3wqB# 0u VA=k! H" a<%hF` '{H)? ;B"a`h\ `)*X#]m@ՀKP ) 0u #3) $ A("H` Sɋ@3a 3qp({Z#C^ s5PO PA 5$al%@cZG"e 0]r \NHBЍ~ ) H#긎2u{|̐( (!0%lRZYِ p"g!@ (F KX‘Eq 9`QZ  &Ph0@<N!"U8/9y/ 7Sg̐3)al)E E} Q12`i-; %y'˰1lYKI&5' 'e@KxoS7@Kz݀Nfn' E E0PhMВ9rѝriPԛSK5ߠِI "ˠי5]%.KY|qИF3A~g*.hwXPPSKđ%fLQKS 8Tgp]A%.".(4RlA JIFH! i'!R  p |YP$5xO( &b0 2^C ÀPê.PW7KgL Y). @@I(F#1J- v^q 0ձ 7~BLQ۳#st P$1[ v- /p$5'TW0 0qt TWT |22w r,A5 Wiw+:5,0W SjH(82cPG-DhGҹaB!sX 'BmJa;T uk%ʞ<P{`0eT[)  Tq А57IΑ *I)-L;WBq&*