DIRECTORY NMosContacts, CD, CDCallSpecific, CDIO, CDInline, CDLRUCache, CDOrient, NMos, Rope, TokenIO; NMosContactsImpl: CEDAR PROGRAM IMPORTS CDCallSpecific, CDInline, CDIO, CDLRUCache, CDOrient, NMos, TokenIO EXPORTS NMosContacts = BEGIN OPEN NMos; lambda: CD.DesignNumber = CD.lambda; ContactType: TYPE = NMosContacts.ContactType; ContactPtr: TYPE = NMosContacts.ContactPtr; ContactRec: TYPE = NMosContacts.ContactRec; wellSurround: CD.DesignNumber = 4*lambda; wXExtension: CD.DesignNumber = 2*lambda; lXExtension: CD.DesignNumber = 2*lambda; butConSX: CD.DesignNumber = 4*lambda; butConSY: CD.DesignNumber = 6*lambda; difCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; polyCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; dsCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; butCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; burCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; mmCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 5, aequivalenceProc: Aequivalent, newProc: NewCont]; ToPosition: PROC [x: REF] RETURNS [p: CD.DesignPosition] = BEGIN IF x=NIL THEN p _ [0, lambda] ELSE WITH x SELECT FROM rp: REF CD.DesignPosition => p _ rp^; rn: REF CD.DesignNumber => p _ [0, rn^]; ENDCASE => p _ [0, 0]; END; Aequivalent: PROC[mySpecific, other: REF ANY] RETURNS [BOOL] = { WITH other SELECT FROM p2: ContactPtr => RETURN [NARROW[mySpecific, ContactPtr]^=p2^]; ENDCASE => RETURN [FALSE] }; NewCont: PROC [] RETURNS [CD.ObPtr] = { ob: CD.ObPtr _ NEW[CD.ObjectDefinition]; ob.specificRef _ NEW[ContactRec]; RETURN [ob] }; MatchContact: PROC [me: CD.ObPtr, r: CD.DesignRect, level: CD.Level, prim: BOOL, horz: BOOL] RETURNS [BOOL] = BEGIN IF level=me.level THEN RETURN [TRUE] ELSE { cp: ContactPtr = NARROW[me.specificRef]; RETURN [ SELECT cp.typ FROM burr => (level=NMos.pol), mDif => (level=NMos.met), difShort => FALSE, butt => (level=NMos.met OR level=NMos.pol), mPol => (level=NMos.met), mm2 => (level=NMos.met2), ENDCASE => FALSE ] } END; Describe: PROC[me: CD.ObPtr] RETURNS [Rope.ROPE] = BEGIN RETURN [ SELECT NARROW[me.specificRef, ContactPtr].typ FROM burr => "buried contact", mDif => "dif contact", difShort => "dif-short contact", butt => "button contact", mPol => "poly contact", mm2 => "via", ENDCASE => "unknown contact" ] END; pForDifPolCon: REF CD.ObjectProcs ~ RegisterObjectType[$NMosContactDifAndPol]; difpolRimWidth: CD.DesignNumber = lambda; CreateDifCon: PUBLIC PROC [l: CD.DesignNumber] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ difCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; l _ MAX[l, butConSX]; cp.typ _ mDif; cob.p _ pForDifPolCon; -- does not use specicRef ! cob.level _ dif; cob.size _ [butConSX, l]; RETURN [difCache.ReplaceByAequivalent[cob]] END; CreatePolyCon: PUBLIC PROC [l: CD.DesignNumber] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ polyCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; l _ MAX[l, butConSX]; cp.typ _ mPol; cob.p _ pForDifPolCon; -- does not use specicRef ! cob.size _ [butConSX, l]; cob.level _ pol; RETURN [polyCache.ReplaceByAequivalent[cob]] END; LengthenDifPol: CDCallSpecific.CallProc = BEGIN amount: CD.DesignPosition = ToPosition[x]; IF amount.y=0 OR amount.x#0 THEN done _ FALSE ELSE { cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application _ aptr^]; sz: CD.DesignPosition _ CDInline.AddPoints[aptr.ob.size, amount]; IF sz.x<=0 OR sz.y<=0 THEN {done _ FALSE; RETURN}; IF aptr.ob.level=pol THEN ap.ob _ CreatePolyCon[sz.y] ELSE ap.ob _ CreateDifCon[sz.y]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ amount.y<0; repaintInclude _ amount.y>0; } END; DefaultenDifPol: CDCallSpecific.CallProc = BEGIN cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; IF aptr.ob.level=pol THEN ap.ob _ CreatePolyCon[4*lambda] ELSE ap.ob _ CreateDifCon[4*lambda]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ TRUE; repaintInclude _ TRUE; END; ReadDifPolCon: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN lev: CD.Level = CDIO.ReadLevel[]; IF lev=pol THEN RETURN [ CreatePolyCon[TokenIO.ReadInt[]] ] ELSE RETURN [ CreateDifCon[TokenIO.ReadInt[]] ] END; WriteDifPolCon: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN CDIO.WriteLevel[me.level]; TokenIO.WriteInt[me.size.y]; END; SetLengthDifPol: CDCallSpecific.CallProc = BEGIN newLength: CD.DesignNumber _ NARROW[x, REF CD.DesignNumber]^; oldLength: CD.DesignNumber _ aptr.ob.size.y; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; IF aptr.ob.level=dif THEN ap.ob _ CreateDifCon[newLength] ELSE ap.ob _ CreatePolyCon[newLength]; include_LIST[ap]; removeMe_TRUE; IF newLength>oldLength THEN repaintInclude_TRUE ELSE repaintMe_TRUE; END; DrawDifAndPolContact: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN IF CDInline.Intersect[CDOrient.RectAt[pos, aptr.ob.size, orient], pr.worldClip] THEN BEGIN r: CD.DesignRect = CDOrient.RectAt[pos, aptr.ob.size, orient]; pr.drawRect[r, met, pr]; pr.drawRect[r, aptr.ob.level, pr]; pr.saveRect[CDInline.Extend[r, -difpolRimWidth], cut, pr]; END END; pForDifShorts: REF CD.ObjectProcs ~ RegisterObjectType[$NMosContactDifShort]; difShortRimWidth: CD.DesignNumber = lambda; CreateDifShortCon: PUBLIC PROC [] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ dsCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; cp.typ _ difShort; cob.p _ pForDifShorts; cob.level _ dif; cob.size _ [butConSX, 8*lambda]; RETURN [dsCache.ReplaceByAequivalent[cob]] END; ReadDifShortCon: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN RETURN [ CreateDifShortCon[] ] END; WriteDifShortCon: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN END; DrawDifShortContact: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN Draw: PROC[r: CD.DesignRect, l: CD.Level] = INLINE BEGIN pr.drawRect[ CDOrient.MapRect[ itemInCell: r, cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; Save: PROC[r: CD.DesignRect, l: CD.Level] = INLINE BEGIN pr.saveRect[ CDOrient.MapRect[ itemInCell: r, cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; IF CDInline.Intersect[CDOrient.RectAt[pos, aptr.ob.size, orient], pr.worldClip] THEN BEGIN r: CD.DesignRect = CDOrient.RectAt[[0, 0], aptr.ob.size]; mr: CD.DesignRect = CDInline.Extend[r, -difShortRimWidth]; h: CD.DesignNumber = (r.y2-r.y1)/2; Draw[r, met]; Draw[[x1: r.x1, y1: r.y1, x2: r.x2, y2: r.y1+h], aptr.ob.level]; Draw[[x1: r.x1, y1: r.y1+h, x2: r.x2, y2: r.y2], nwelCont]; Save[[x1: mr.x1, x2: mr.x2, y1: mr.y1, y2: mr.y1+2*lambda], cut]; Save[[x1: mr.x1, x2: mr.x2, y1: mr.y2-2*lambda, y2: mr.y2], cut]; END END; -- But -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- pForButContact: REF CD.ObjectProcs ~ RegisterObjectType[$NMosContactBut]; CreateButCon: PUBLIC PROC [] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ butCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; cp.typ _ butt; cob.p _ pForButContact; cob.level _ dif; cob.size _ [butConSX, butConSY]; RETURN [butCache.ReplaceByAequivalent[cob]] END; ReadButCon: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN RETURN [ CreateButCon[] ] END; WriteButCon: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN END; DrawButContact: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN Draw: PROC[r: CD.DesignRect, l: CD.Level] = INLINE BEGIN pr.drawRect[ CDOrient.MapRect[ itemInCell: r, cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; Save: PROC[r: CD.DesignRect, l: CD.Level] = INLINE BEGIN pr.drawRect[ CDOrient.MapRect[ itemInCell: r, cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; IF CDInline.Intersect[CDOrient.RectAt[pos, aptr.ob.size, orient], pr.worldClip] THEN BEGIN rimWidth: CD.DesignNumber = lambda; polySize: CD.DesignNumber = aptr.ob.size.y/2; Draw[[0, 0, aptr.ob.size.x, aptr.ob.size.y], met]; Draw[[0, 0, aptr.ob.size.x, polySize], pol]; Draw[[0, polySize-lambda, aptr.ob.size.x, aptr.ob.size.y], aptr.ob.level]; Save[[rimWidth, rimWidth, aptr.ob.size.x-rimWidth, aptr.ob.size.y-rimWidth], cut]; END END; pForBurCon: REF CD.ObjectProcs ~ RegisterObjectType[$NMosBurContact]; CreateBurCon: PUBLIC PROC [w, l: CD.DesignNumber, wex: CD.DesignNumber_wXExtension, lex: CD.DesignNumber_lXExtension] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ burCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; burAct: CD.DesignNumber = 2*lambda; actWidth, xMargins: CD.DesignNumber; wex _ MAX[0, wex]; lex _ MAX[0, lex]; xMargins _ burAct + (IF wex< burAct THEN MAX[wex+lambda, burAct] ELSE wex); actWidth _ MAX[2*lambda, w-xMargins]; w _ actWidth+xMargins; l _ MAX[l, (IF lex0 OR amount.y>0; }; END; ChangeExtensionBur: CDCallSpecific.CallProc = BEGIN amount: CD.DesignPosition = ToPosition[x]; IF amount.y=0 AND amount.x=0 THEN done _ FALSE ELSE { cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateBurCon[ w: aptr.ob.size.x+amount.x, l: aptr.ob.size.y+amount.y, wex: cp.wExt+amount.x, lex: cp.lExt+amount.y ]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ amount.x<0 OR amount.y<0; repaintInclude _ amount.x>0 OR amount.y>0; } END; SetLengthBur: CDCallSpecific.CallProc = BEGIN newLength: CD.DesignNumber _ NARROW[x, REF CD.DesignNumber]^; oldLength: CD.DesignNumber _ aptr.ob.size.y; cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateBurCon[w: aptr.ob.size.x, l: newLength, wex: cp.wExt, lex: cp.lExt]; include _ LIST[ap]; removeMe _ TRUE; IF newLength>oldLength THEN repaintInclude _ TRUE ELSE repaintMe _ TRUE; END; DefaultenBur: CDCallSpecific.CallProc = BEGIN cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateBurCon[w: aptr.ob.size.x, l: 4*lambda, wex: cp.wExt, lex: cp.lExt]; include_LIST[ap]; removeMe_TRUE; repaintMe_TRUE; repaintInclude_TRUE; END; pForVia: REF CD.ObjectProcs ~ RegisterObjectType[$NMosMmContact]; mmRimWidth: CD.DesignNumber = 2*lambda; cut2min: CD.DesignNumber = 3*lambda; CreateMmCon: PUBLIC PROC [l: CD.DesignNumber, wex: CD.DesignNumber_wXExtension, lex: CD.DesignNumber_lXExtension] RETURNS [CD.ObPtr] = BEGIN cob: CD.ObPtr ~ mmCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; mins: CD.DesignNumber = cut2min+2*mmRimWidth; l _ MAX[l, mins]; cp.typ _ mm2; cob.p _ pForVia; cob.size _ [mins, l]; RETURN [mmCache.ReplaceByAequivalent[cob]] END; ReadVia: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN RETURN [ CreateMmCon[TokenIO.ReadInt[]] ] END; WriteVia: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN TokenIO.WriteInt[me.size.y]; END; ShortenMm: CDCallSpecific.CallProc = BEGIN cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateMmCon[l: aptr.ob.size.y-lambda, wex: cp.wExt, lex: cp.lExt]; include_LIST[ap]; removeMe_TRUE; repaintMe_TRUE; END; LengthenVia: CDCallSpecific.CallProc = BEGIN amount: CD.DesignPosition = ToPosition[x]; IF amount.y=0 OR amount.x#0 THEN done _ FALSE ELSE { cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; sz: CD.DesignPosition _ CDInline.AddPoints[aptr.ob.size, amount]; IF sz.x<=0 OR sz.y<=0 THEN {done_FALSE; RETURN}; ap.ob _ CreateMmCon[l: sz.y, wex: cp.wExt, lex: cp.lExt]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ amount.y<0; repaintInclude _ amount.y>0; } END; SetLengthVia: CDCallSpecific.CallProc = BEGIN newLength: CD.DesignNumber _ NARROW[x, REF CD.DesignNumber]^; oldLength: CD.DesignNumber _ aptr.ob.size.y; cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateMmCon[l: newLength, wex: cp.wExt, lex: cp.lExt]; include _ LIST[ap]; removeMe _ TRUE; IF newLength>oldLength THEN repaintInclude _ TRUE ELSE repaintMe _ TRUE; END; DefaultenVia: CDCallSpecific.CallProc = BEGIN cp: ContactPtr _ NARROW[aptr.ob.specificRef]; ap: CD.ApplicationPtr _ NEW[CD.Application_aptr^]; ap.ob _ CreateMmCon[l: 4*lambda, wex: cp.wExt, lex: cp.lExt]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ TRUE; repaintInclude _ TRUE; END; DrawMeForMmNMosContacts: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN IF CDInline.Intersect[CDOrient.RectAt[pos, aptr.ob.size, orient], pr.worldClip] THEN BEGIN r: CD.DesignRect = CDOrient.RectAt[pos, aptr.ob.size, orient]; pr.drawRect[r, met, pr]; pr.drawRect[r, met2, pr]; pr.saveRect[CDInline.Extend[r, -mmRimWidth], cut2, pr]; END END; Init: PROC [] = BEGIN pForDifPolCon.drawMe _ pForDifPolCon.quickDrawMe _ DrawDifAndPolContact; CDCallSpecific.Register[$Lengthen, pForDifPolCon, LengthenDifPol]; CDCallSpecific.Register[$Default, pForDifPolCon, DefaultenDifPol]; CDCallSpecific.Register[$SetLength, pForDifPolCon, SetLengthDifPol]; pForDifPolCon.internalRead _ ReadDifPolCon; pForDifPolCon.internalWrite _ WriteDifPolCon; pForDifPolCon.describe _ Describe; pForDifPolCon.match _ MatchContact; pForButContact.drawMe _ pForButContact.quickDrawMe _ DrawButContact; pForButContact.internalRead _ ReadButCon; pForButContact.internalWrite _ WriteButCon; pForButContact.describe _ Describe; pForButContact.match _ MatchContact; pForBurCon.drawMe _ pForBurCon.quickDrawMe _ DrawMeForBurrNMosContacts; CDCallSpecific.Register[$Lengthen, pForBurCon, LengthenBur]; CDCallSpecific.Register[$Default, pForBurCon, DefaultenBur]; CDCallSpecific.Register[$SetLength, pForBurCon, SetLengthBur]; CDCallSpecific.Register[$ChangeExt, pForBurCon, ChangeExtensionBur]; pForBurCon.internalRead _ ReadBurCon; pForBurCon.internalWrite _ WriteBurCon; pForBurCon.describe _ Describe; pForBurCon.match _ MatchContact; pForVia.drawMe _ pForVia.quickDrawMe _ DrawMeForMmNMosContacts; CDCallSpecific.Register[$Lengthen, pForVia, LengthenVia]; CDCallSpecific.Register[$Default, pForVia, DefaultenVia]; CDCallSpecific.Register[$SetLength, pForVia, SetLengthVia]; pForVia.internalRead _ ReadVia; pForVia.internalWrite _ WriteVia; pForVia.describe _ Describe; pForVia.match _ MatchContact; pForDifShorts.drawMe _ pForDifShorts.quickDrawMe _ DrawDifShortContact; pForDifShorts.internalRead _ ReadDifShortCon; pForDifShorts.internalWrite _ WriteDifShortCon; pForDifShorts.describe _ Describe; pForDifShorts.match _ MatchContact; END; Init[]; END. ºNMosContactsImpl.mesa (part of Chipndale) by Christian Jacobi June 24, 1983 5:03 pm last edited Christian Jacobi December 14, 1983 11:00 am --y field defaults to lambda, x field defaults to 0 --[0, 0] if not done -- Dif and Pol -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --connect diffusion with metal --connect poly with metal --does not read specificRef !!!!!! -- DifShort -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- uses outer stuff!! uses outer stuff!! --connects metal with poly and diffusion --uses outer stuff!! --uses outer stuff!! --DrawButContact -- Bur -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- connects diffusion with poly without accessing metal uses outer stuff!! uses outer stuff!! --DrawMeForBurrNMosContacts -- Mm -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ignores wex and lex in chipmonk, why??? -- connects two layers of metal --cp.wExt _ ; --cp.wExt _ ; --cob.level _ ; --does not read specificRef !!!!!! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ʘJšœ*™*Jšœ,™,Jšœ9™9J˜šÏk ˜ J˜ Jšœ˜J˜J˜J˜ Jšœ ˜ J˜ Jšœ˜J˜J˜J˜—šÏnœœœ˜ JšœD˜KJšœ˜—Jšœœ˜J˜Jšœœœ˜$Jšœ œ˜-Jšœ œ˜+Jšœ œ˜+J˜Jšœœ˜)Jšœ œ˜(Jšœ œ˜(Jšœ œ˜%Jšœ œ˜%J˜Jšœl˜lJšœm˜mJšœk˜kJšœl˜lJšœl˜lJšœk˜kJ˜š ž œœœœœ˜:Jšœ3™3Jšœ™Jš˜Jšœœœ˜šœœœ˜Jšœœœ˜%Jšœœœ˜(Jšœ˜—Jšœ˜—J˜š ž œœœœœœ˜@šœœ˜Jšœœœ˜?Jšœœœ˜—J˜—J˜šžœœœœ ˜'Jšœœ œœ˜(Jšœœ ˜!Jšœ˜ J˜—J˜š Ðbn Ïbœ9œœœœ˜mJš˜Jšœœœœ˜$šœ˜Jšœœ˜(šœ˜šœ˜Jšœ˜Jšœ˜Jšœ œ˜Jšœœ˜+Jšœ˜Jšœ˜Jšœ˜—J˜—J˜—Jšœ˜—J˜š žœœœœœ˜2Jš˜šœ˜šœœ!˜2Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜—J˜—Jšœ˜—J˜J˜Jšœc™cJ˜Jšœœœ9˜NJšœœ˜)J˜š ž œœœœœœ ˜CJšœ™Jš˜Jšœœ ˜'Jšœœ˜)Jšœœ˜J˜JšœÏc˜2J˜J˜Jšœ%˜+Jšœ˜J˜—š ž œœœœœœ ˜DJšœ™Jš˜Jšœœ!˜(Jšœœ˜)Jšœœ˜J˜Jšœ¡˜2J˜J˜Jšœ&˜,Jšœ˜J˜—š œ˜)Jš˜Jšœœ ˜*Jšœ œ œ˜-šœ˜Jšœœ˜-Jšœœœœ˜4Jšœœ;˜AJš œ œ œœœ˜2Jšœœœ˜VJšœ œ˜Jšœ œ˜Jšœ˜Jšœ˜J˜—Jšœ˜J˜—š œ˜*Jš˜Jšœœ˜-Jšœœœœ˜2Jšœœ œ ˜^Jšœ œ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœ˜J˜—šž œœ¡œ˜@Jš˜Jšœœ œ ˜!Jšœ œœ%˜;Jšœœ$˜/Jšœ˜—J˜šžœœ¡œ˜=Jš˜Jšœ˜Jšœ˜Jšœ˜—J˜š œ˜*Jš˜Jš œ œœœœ˜=Jšœ œ˜,Jšœœœœ˜2šœœ˜Jšœ œ"˜F—Jšœœ˜Jšœ œ˜Jš œœœœ œ˜DJšœ˜J˜—šžœœ œœ ˜dJšœœ ˜Jšœ"™"Jš˜šœNœ˜UJš˜Jšœœ?˜DJ˜Jšœ"˜"J˜:Jš˜—Jšœ˜J˜—JšœZ™ZJ˜Jšœœœ8˜MJšœœ˜+J˜š žœœœœœ ˜6Jš˜Jšœœ˜&Jšœœ˜)J˜Jšœ˜J˜J˜ Jšœ$˜*Jšœ˜J˜—šžœœ¡œ˜BJš˜Jšœ˜Jšœ˜—J˜šžœœ¡œ˜?Jš˜Jšœ˜—J˜šžœœ œœ ˜cJšœœ ˜Jš˜J˜š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—šœNœ˜UJš˜Jšœœ4˜9Jšœœ4˜:Jšœœ˜#J˜ Jšœ@˜@J˜;J˜AJ˜AJš˜—Jšœ˜J˜J˜—Jš¡ œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ¡œ˜^J˜Jšœœœ3˜IJ˜š ž œœœœœ ˜1Jšœ(™(Jš˜Jšœœ ˜'Jšœœ˜)J˜J˜J˜J˜!Jšœ%˜+Jšœ˜J˜—šž œœ¡œ˜=Jš˜Jšœ˜Jšœ˜—J˜šž œœ¡œ˜:Jš˜Jšœ˜—J˜šžœœ œœ ˜^Jšœœ ˜Jš˜J˜š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—Jšœ™šœNœ˜UJš˜Jšœ œ˜#Jšœ œ!˜-Jšœ2˜2Jšœ,˜,JšœJ˜JJšœR˜RJš˜—Jšœ˜J˜J˜—Jšœa™aJ˜šœ œœ3˜EJ™—šž œœœœ˜1Jšœœ˜!Jšœœœœ ˜6Jšœ7™7Jšœ˜Jšœœ ˜'Jšœœ˜)Jšœœ˜#Jšœœ˜$Jšœœ ˜Jšœœ ˜šœ˜Jš œœ œœœ˜7—Jšœ œ˜%Jšœ˜šœœ˜ Jš œœ œœœœ˜XJšœ˜—J˜J˜J˜Jšœ˜J˜J˜Jšœ%˜+Jšœ˜J˜—š  œœ¡œ˜=Jš˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœ!˜'Jšœ˜—J˜šž œœ¡œ˜:Jš˜Jšœœ˜(Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—J˜šžœœ œœ ˜iJšœœ ˜Jš˜J˜š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—š žœœœœ ˜2Jšœ™Jš˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšœ˜J˜—Jšœ™Jšœœ˜,Jšœœ˜!Jšœœ˜#šœ œ˜Jš œœœœœ˜GJš œœœœœ˜FJ˜—JšœB˜BJšœJ˜JJšœ]˜]Jšœ˜J˜—š  œ˜&Jš˜Jšœœ ˜*Jšœ œ œ˜.šœ˜Jšœœ˜-Jšœœœœ˜4šœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜—Jšœ œ˜Jšœ œ˜Jšœœ ˜%Jšœœ ˜*J˜—Jšœ˜J˜—š œ˜-Jš˜Jšœœ ˜*Jšœ œ œ˜.šœ˜Jšœœ˜-Jšœœœœ˜2šœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ œ˜Jšœ œ˜Jšœœ ˜%Jšœœ ˜*J˜—Jšœ˜J˜—š  œ˜'Jš˜Jš œ œœœœ˜=Jšœ œ˜,Jšœœ˜-Jšœœœœ˜2J˜RJšœ œ˜Jšœ œ˜Jš œœœœ œ˜HJšœ˜J˜—š  œ˜'Jš˜Jšœœ˜-Jšœœœœ˜2J˜QJšœœ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœ˜J˜—Jšœ`™`J˜Jšœ œœ2˜AJšœ œ˜'Jšœ œ˜$J˜šž œœœœ˜-Jšœœ˜!Jšœœœœ ˜6Jšœ*™*Jšœ™Jšœ˜Jšœœ˜&Jšœœ˜)Jšœœ%˜-Jšœœ ˜J˜ Jšœ ™ Jšœ ™ Jšœ˜J˜Jšœ™Jšœ$˜*Jšœ˜J˜—šžœœ¡œ˜:Jš˜Jšœ#˜)Jšœ˜—J˜šžœœ¡œ˜7Jš˜Jšœ˜Jšœ˜—J˜š  œ˜$Jš˜Jšœœ˜-Jšœœœœ˜2J˜JJšœœ˜Jšœ œ˜Jšœ œ˜Jšœ˜J˜—š  œ˜&Jš˜Jšœœ ˜*Jšœ œ œ˜-šœ˜Jšœœ˜-Jšœœœœ˜2Jšœœ;˜AJš œ œ œœœ˜0Jšœ9˜9Jšœ œ˜Jšœ œ˜Jšœ˜Jšœœ ˜J˜—Jšœ˜J˜—š  œ˜'Jš˜Jš œ œœœœ˜=Jšœ œ˜,Jšœœ˜-Jšœœœœ˜2J˜>Jšœ œ˜Jšœ œ˜Jš œœœœ œ˜HJšœ˜J˜—š  œ˜'Jš˜Jšœœ˜-Jšœœœœ˜2J˜=Jšœ œ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœ˜J˜—šžœœ œœ ˜gJšœœ ˜Jšœ"™"Jš˜šœNœ˜UJš˜Jšœœ9˜>J˜J˜J˜7Jš˜—Jšœ˜J˜—JšœZ™ZJ˜šžœœ˜Jš˜šœH˜HJšœB˜BJšœB˜BJšœD˜DJšœ+˜+Jšœ-˜-Jšœ"˜"Jšœ#˜#—šœD˜DJšœ)˜)Jšœ+˜+Jšœ#˜#Jšœ$˜$—šœG˜GJšœ<˜˜>JšœD˜DJšœ%˜%Jšœ'˜'Jšœ˜Jšœ ˜ —šœ?˜?Jšœ9˜9Jšœ9˜9Jšœ;˜;Jšœ˜Jšœ!˜!Jšœ˜Jšœ˜—šœG˜GJšœ-˜-Jšœ/˜/Jšœ"˜"Jšœ#˜#—Jšœ˜J˜—J˜Jšœ˜J˜—…—B’]h