DIRECTORY NMosContacts, CD, CDCallSpecific, CDIO, CDBasics, CDLRUCache, CDOrient, CDStretchyExtras, NMos, Rope, TokenIO; NMosContactsImpl: CEDAR PROGRAM IMPORTS CDCallSpecific, CDBasics, CDIO, CDLRUCache, CDOrient, CDStretchyExtras, NMos, TokenIO EXPORTS NMosContacts = BEGIN OPEN NMos; lambda: CD.Number = NMos.lambda; ContactType: TYPE = NMosContacts.ContactType; ContactPtr: TYPE = NMosContacts.ContactPtr; ContactRec: TYPE = NMosContacts.ContactRec; wXExtension: CD.Number = 2*lambda; lXExtension: CD.Number = 2*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 [class: CD.Position] = BEGIN IF x=NIL THEN class _ [0, lambda] ELSE WITH x SELECT FROM rp: REF CD.Position => class _ rp^; rn: REF CD.Number => class _ [0, rn^]; ENDCASE => class _ [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.Object] = { ob: CD.Object _ NEW[CD.ObjectRep]; ob.specificRef _ NEW[ContactRec]; RETURN [ob] }; MatchContact: PROC [me: CD.Object, r: CD.Rect, layer: CD.Layer, prim: BOOL, horz: BOOL] RETURNS [BOOL] = BEGIN IF layer=me.layer THEN RETURN [TRUE] ELSE { cp: ContactPtr = NARROW[me.specificRef]; RETURN [ SELECT cp.typ FROM burr => (layer=NMos.pol), mDif => (layer=NMos.met), butt => (layer=NMos.met OR layer=NMos.pol), mPol => (layer=NMos.met), mm2 => (layer=NMos.met2), ENDCASE => FALSE ] } END; Describe: PROC[me: CD.Object] RETURNS [Rope.ROPE] = BEGIN RETURN [ SELECT NARROW[me.specificRef, ContactPtr].typ FROM burr => "buried contact", mDif => "dif contact", butt => "button contact", mPol => "poly contact", mm2 => "via", ENDCASE => "unknown contact" ] END; pForDifPolCon: CD.ObjectClass ~ RegisterObjectClass[$NMosContactDifAndPol]; difpolRimWidth: CD.Number = lambda; CreateDifCon: PUBLIC PROC [l: CD.Number] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ difCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; l _ MAX[l, butConSX]; cp.typ _ mDif; cob.class _ pForDifPolCon; -- does not use specicRef ! cob.layer _ dif; cob.size _ [butConSX, l]; RETURN [difCache.ReplaceByAequivalent[cob]] END; CreatePolyCon: PUBLIC PROC [l: CD.Number] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ polyCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; l _ MAX[l, butConSX]; cp.typ _ mPol; cob.class _ pForDifPolCon; -- does not use specicRef ! cob.size _ [butConSX, l]; cob.layer _ pol; RETURN [polyCache.ReplaceByAequivalent[cob]] END; LengthenDifPol: CDCallSpecific.CallProc = BEGIN amount: CD.Position = ToPosition[x]; IF amount.y=0 OR amount.x#0 THEN done _ FALSE ELSE { cp: ContactPtr _ NARROW[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep _ inst^]; sz: CD.Position _ CDBasics.AddPoints[inst.ob.size, amount]; IF sz.x<=0 OR sz.y<=0 THEN {done _ FALSE; RETURN}; IF inst.ob.layer=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[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; IF inst.ob.layer=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 [Object]-- = BEGIN lev: CD.Layer = CDIO.ReadLayer[]; IF lev=pol THEN RETURN [ CreatePolyCon[TokenIO.ReadInt[]] ] ELSE RETURN [ CreateDifCon[TokenIO.ReadInt[]] ] END; WriteDifPolCon: CD.InternalWriteProc -- PROC [me: Object] -- = BEGIN CDIO.WriteLayer[me.layer]; TokenIO.WriteInt[me.size.y]; END; SetLengthDifPol: CDCallSpecific.CallProc = BEGIN newLength: CD.Number _ NARROW[x, REF CD.Number]^; oldLength: CD.Number _ inst.ob.size.y; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; IF inst.ob.layer=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 [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN IF CDBasics.Intersect[CDOrient.RectAt[pos, inst.ob.size, orient], pr.interestClip] THEN BEGIN r: CD.Rect = CDOrient.RectAt[pos, inst.ob.size, orient]; pr.drawRect[r, met, pr]; pr.drawRect[r, inst.ob.layer, pr]; pr.drawRect[CDBasics.Extend[r, -difpolRimWidth], cut, pr]; END END; -- But -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- pForButContact: CD.ObjectClass ~ RegisterObjectClass[$NMosContactBut]; butConSX: CD.Number = 4*lambda; butConSY: CD.Number = 6*lambda; butContactPolyYS: CD.Number = 3*lambda; butContactDiffY: CD.Number = butContactPolyYS-lambda; butContactRimWidth: CD.Number = lambda; CreateButCon: PUBLIC PROC [] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ butCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; cp.typ _ butt; cob.class _ pForButContact; cob.layer _ dif; cob.size _ [butConSX, butConSY]; RETURN [butCache.ReplaceByAequivalent[cob]] END; ReadButCon: CD.InternalReadProc --PROC [] RETURNS [Object]-- = BEGIN RETURN [ CreateButCon[] ] END; WriteButCon: CD.InternalWriteProc -- PROC [me: Object] -- = BEGIN END; DrawButContact: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN Draw: PROC[r: CD.Rect, l: CD.Layer] = INLINE BEGIN pr.drawRect[ CDOrient.MapRect[ itemInCell: r, cellSize: inst.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; Draw[[0, 0, butConSX, butConSY], met]; Draw[[0, 0, butConSX, butContactPolyYS], pol]; Draw[[0, butContactDiffY, butConSX, butConSY], inst.ob.layer]; Draw[[butContactRimWidth, butContactRimWidth, butConSX-butContactRimWidth, butConSY-butContactRimWidth], cut]; END; pForBurCon: CD.ObjectClass ~ RegisterObjectClass[$NMosBurContact]; CreateBurCon: PUBLIC PROC [w, l: CD.Number, wex: CD.Number_wXExtension, lex: CD.Number_lXExtension] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ burCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; burAct: CD.Number = 2*lambda; actWidth, xMargins: CD.Number; 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.Position = ToPosition[x]; IF amount.y=0 AND amount.x=0 THEN done _ FALSE ELSE { cp: ContactPtr _ NARROW[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; ap.ob _ CreateBurCon[ w: inst.ob.size.x+amount.x, l: inst.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.Number _ NARROW[x, REF CD.Number]^; oldLength: CD.Number _ inst.ob.size.y; cp: ContactPtr _ NARROW[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; ap.ob _ CreateBurCon[w: inst.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[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; ap.ob _ CreateBurCon[w: inst.ob.size.x, l: 4*lambda, wex: cp.wExt, lex: cp.lExt]; include_LIST[ap]; removeMe_TRUE; repaintMe_TRUE; repaintInclude_TRUE; END; pForVia: CD.ObjectClass ~ RegisterObjectClass[$NMosMmContact]; mmRimWidth: CD.Number = lambda; cut2min: CD.Number = 3*lambda; CreateMmCon: PUBLIC PROC [l: CD.Number, wex: CD.Number_wXExtension, lex: CD.Number_lXExtension] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ mmCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; mins: CD.Number = cut2min+2*mmRimWidth; oldMins: CD.Number = cut2min+2*--mmRimWidth--2*lambda; l _ MAX[l, mins]; cp.typ _ mm2; cob.class _ pForVia; IF l0; } END; SetLengthVia: CDCallSpecific.CallProc = BEGIN newLength: CD.Number _ NARROW[x, REF CD.Number]^; oldLength: CD.Number _ inst.ob.size.y; cp: ContactPtr _ NARROW[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; 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[inst.ob.specificRef]; ap: CD.Instance _ NEW[CD.InstanceRep_inst^]; ap.ob _ CreateMmCon[l: 4*lambda, wex: cp.wExt, lex: cp.lExt]; include _ LIST[ap]; removeMe _ TRUE; repaintMe _ TRUE; repaintInclude _ TRUE; END; DrawVia: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN mins: CD.Number = cut2min+2*mmRimWidth; r: CD.Rect = CDOrient.RectAt[pos, inst.ob.size, orient]; pr.drawRect[r, met, pr]; pr.drawRect[r, met2, pr]; IF inst.ob.size.x>mins THEN --old technology-- pr.drawRect[CDBasics.Extend[r, -2*lambda --oldmmRimWidth-- ], cut2, pr] ELSE --new technology-- pr.drawRect[CDBasics.Extend[r, -mmRimWidth], cut2, pr]; END; Init: PROC [] = BEGIN pForDifPolCon.drawMe _ pForDifPolCon.quickDrawMe _ DrawDifAndPolContact; pForDifPolCon.internalRead _ ReadDifPolCon; pForDifPolCon.internalWrite _ WriteDifPolCon; pForDifPolCon.describe _ Describe; CDStretchyExtras.InstallMatch[pForDifPolCon, MatchContact]; pForButContact.drawMe _ pForButContact.quickDrawMe _ DrawButContact; pForButContact.internalRead _ ReadButCon; pForButContact.internalWrite _ WriteButCon; pForButContact.describe _ Describe; CDStretchyExtras.InstallMatch[pForButContact, 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; CDStretchyExtras.InstallMatch[pForBurCon, MatchContact]; pForVia.drawMe _ pForVia.quickDrawMe _ DrawVia; pForVia.internalRead _ ReadVia; pForVia.internalWrite _ WriteVia; pForVia.describe _ Describe; CDStretchyExtras.InstallMatch[pForVia, MatchContact]; END; Init[]; END. ¼NMosContactsImpl.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, June 24, 1983 5:03 pm last edited Christian Jacobi, March 25, 1986 4:41:25 pm PST --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 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- pForDifShorts: CD.ObjectClass ~ RegisterObjectClass[$NMosContactDifShort]; difShortRimWidth: CD.Number = lambda; CreateDifShortCon: PUBLIC PROC [] RETURNS [CD.Object] = BEGIN cob: CD.Object ~ dsCache.UnusedOrNew[]; cp: ContactPtr ~ NARROW[cob.specificRef]; cp.typ _ difShort; cob.class _ pForDifShorts; cob.layer _ dif; cob.size _ [butConSX, 8*lambda]; RETURN [dsCache.ReplaceByAequivalent[cob]] END; ReadDifShortCon: CD.InternalReadProc --PROC [] RETURNS [Object]-- = BEGIN RETURN [ CreateDifShortCon[] ] END; WriteDifShortCon: CD.InternalWriteProc -- PROC [me: Object] -- = BEGIN END; DrawDifShortContact: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN Draw: PROC[r: CD.Rect, l: CD.Layer] = INLINE uses outer stuff!! BEGIN pr.drawRect[ CDOrient.MapRect[ itemInCell: r, cellSize: inst.ob.size, cellInstOrient: orient, cellInstPos: pos], l, pr]; END; IF CDBasics.Intersect[CDOrient.RectAt[pos, inst.ob.size, orient], pr.interestClip] THEN BEGIN r: CD.Rect = CDOrient.RectAt[[0, 0], inst.ob.size]; mr: CD.Rect = CDBasics.Extend[r, -difShortRimWidth]; h: CD.Number = (r.y2-r.y1)/2; Draw[r, met]; Draw[[x1: r.x1, y1: r.y1, x2: r.x2, y2: r.y1+h], inst.ob.layer]; Draw[[x1: r.x1, y1: r.y1+h, x2: r.x2, y2: r.y2], nwelCont]; Draw[[x1: mr.x1, x2: mr.x2, y1: mr.y1, y2: mr.y1+2*lambda], cut]; Draw[[x1: mr.x1, x2: mr.x2, y1: mr.y2-2*lambda, y2: mr.y2], cut]; END END; --connects metal with poly and diffusion --uses outer stuff!! --DrawButContact -- Bur -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- connects diffusion with poly without accessing metal uses outer stuff!! --DrawMeForBurrNMosContacts -- Mm -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ignores wex and lex in chipmonk, why??? -- connects two layers of metal --cp.wExt _ ; --cp.wExt _ ; --cob.layer _ ; --does not read specificRef !!!!!! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- CDCallSpecific.Register[$Lengthen, pForDifPolCon, LengthenDifPol]; CDCallSpecific.Register[$Default, pForDifPolCon, DefaultenDifPol]; CDCallSpecific.Register[$SetLength, pForDifPolCon, SetLengthDifPol]; CDCallSpecific.Register[$Lengthen, pForVia, LengthenVia]; CDCallSpecific.Register[$Default, pForVia, DefaultenVia]; CDCallSpecific.Register[$SetLength, pForVia, SetLengthVia]; pForDifShorts.drawMe _ pForDifShorts.quickDrawMe _ DrawDifShortContact; pForDifShorts.internalRead _ ReadDifShortCon; pForDifShorts.internalWrite _ WriteDifShortCon; pForDifShorts.describe _ Describe; CDStretchyExtras.InstallMatch[pForDifShorts, MatchContact]; ÊR˜šœ*™*Jšœ Ïmœ7™BJšœ,™,Jšœ<™<—J˜šÏk ˜ J˜ Jšžœ˜J˜J˜J˜ Jšœ ˜ J˜ Jšœ˜Jšœ˜J˜J˜J˜—šÏnœžœžœ˜ JšžœV˜]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˜š Ÿ œžœžœžœ žœ ˜8Jšœ3™3Jšœ™Jšž˜Jšžœžœžœ˜!šžœžœžœž˜Jšœžœžœ˜#Jšœžœžœ˜&Jšžœ˜—Jšžœ˜—J˜š Ÿ œžœžœžœžœžœ˜@šžœžœž˜Jšœžœžœ˜?Jšžœžœžœ˜—J˜—J˜šŸœžœžœžœ ˜(Jšœžœ žœžœ ˜"Jšœžœ ˜!Jšžœ˜ J˜—J˜š Ðbn Ïbžœ4žœžœžœžœ˜hJšž˜Jšžœžœžœžœ˜$šžœ˜Jšœžœ˜(šžœ˜šžœž˜Jšœ˜Jšœ˜Jšœžœ˜+Jšœ˜Jšœ˜Jšžœž˜—J˜—J˜—Jšžœ˜—J˜š Ÿœžœžœ žœžœ˜3Jšž˜šžœ˜šžœžœ!ž˜2Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšžœ˜—J˜—Jšžœ˜—J˜J˜Jšœc™cJ˜Jšœžœ:˜KJšœžœ˜#J˜š Ÿ œžœžœžœ žœžœ ˜>Jšœ™Jšž˜Jšœžœ!˜(Jšœžœ˜)Jšœžœ˜J˜JšœÏc˜6J˜J˜Jšžœ%˜+Jšžœ˜J˜—š Ÿ œžœžœžœ žœžœ ˜?Jšœ™Jšž˜Jšœžœ"˜)Jšœžœ˜)Jšœžœ˜J˜Jšœ¢˜6J˜J˜Jšžœ&˜,Jšžœ˜J˜—š¡œ˜)Jšž˜Jšœžœ˜$Jšžœ žœ žœž˜-šžœ˜Jšœžœ˜-Jšœžœ žœžœ˜.Jšœžœ5˜;Jš žœ žœ žœžœžœ˜2Jšžœžœžœ˜VJšœ žœ˜Jšœ žœ˜Jšœ˜Jšœ˜J˜—Jšžœ˜J˜—š¡œ˜*Jšž˜Jšœžœ˜-Jšœžœ žœžœ˜,Jšžœžœ žœ ˜^Jšœ žœ˜Jšœ žœ˜Jšœ žœ˜Jšœžœ˜Jšžœ˜J˜—šŸ œžœ¢œ˜AJšž˜Jšœžœ žœ ˜!Jšžœ žœžœ%˜;Jšžœžœ$˜/Jšžœ˜—J˜šŸœžœ¢œ˜>Jšž˜Jšžœ˜Jšœ˜Jšžœ˜—J˜š¡œ˜*Jšž˜Jš œ žœ žœžœžœ ˜1Jšœ žœ˜&Jšœžœ žœžœ˜,šžœžœ˜Jšœ žœ"˜F—Jšœžœ˜Jšœ žœ˜Jš žœžœžœžœ žœ˜DJšžœ˜J˜—šŸœžœžœžœ ˜XJšœžœ ˜Jšœ"™"Jšž˜šžœQžœ˜XJšž˜Jšœžœ9˜>J˜Jšœ"˜"J˜:Jšž˜—Jšžœ˜J˜—JšœZ™ZJ™Jšœžœ9™JJšœžœ™%J™š Ÿœžœžœžœžœ ™7Jšž™Jšœžœ ™'Jšœžœ™)J™Jšœ™J™J™ Jšžœ$™*Jšžœ™J™—šŸœžœ¢œ™CJšž™Jšžœ™Jšžœ™—J™šŸœžœ¢œ™@Jšž™Jšžœ™—J™šŸœžœžœžœ ™WJšœžœ ™Jšž™J™š Ÿœžœžœ žœ ž™,Jšœ™Jšž™™ ™J™Jšœ™J™J™—J™J™—Jšžœ™J™—šžœQžœ™XJšž™Jšœžœ.™3Jšœžœ.™4Jšœžœ™J™ Jšœ@™@J™;J™AJ™AJšž™—Jšžœ™J˜J˜—Jš¢ œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ¢œ˜^J˜Jšœžœ4˜FJ˜Jšœ žœ˜Jšœ žœ˜Jšœ'˜'Jšœ5˜5Jšœžœ˜'J˜š Ÿ œžœžœžœžœ ˜2Jšœ(™(Jšž˜Jšœžœ!˜(Jšœžœ˜)J˜J˜J˜J˜!Jšžœ%˜+Jšžœ˜J˜—šŸ œžœ¢œ˜>Jšž˜Jšžœ˜Jšžœ˜—J˜šŸ œžœ¢œ˜;Jšž˜Jšžœ˜—J˜šŸœžœžœžœ ˜RJšœžœ ˜Jšž˜J˜š Ÿœžœžœ žœ ž˜,Jšœ™Jšž˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšžœ˜J˜—Jšœ™Jšœ&˜&Jšœ.˜.Jšœ>˜>šœ.˜.JšœA˜A—Jšžœ˜J˜J˜—Jšœa™aJ˜šœ žœ4˜BJ™—šŸ œžœžœžœ˜+Jšœžœ˜Jšœžœžœžœ ˜1Jšœ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˜šŸœžœžœžœ ˜]Jšœžœ ˜Jšž˜J˜š Ÿœžœžœ žœ ž˜,Jšœ™Jšž˜˜ ˜J˜Jšœ˜J˜J˜—J˜J˜—Jšžœ˜J˜—Jšœ™Jšœžœ˜0Jšœžœ˜Jšœžœ˜šœ žœ ˜Jš œžœžœžœžœ˜SJš œžœžœžœžœ˜RJ˜—JšœB˜BJšœV˜VJšœ]˜]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šœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ žœ˜Jšœ žœ˜Jšœžœ ˜%Jšœžœ ˜*J˜—Jšžœ˜J˜—š¡ œ˜'Jšž˜Jš œ žœ žœžœžœ ˜1Jšœ žœ˜&Jšœžœ˜-Jšœžœ žœžœ˜,J˜RJšœ žœ˜Jšœ žœ˜Jš žœžœžœžœ žœ˜HJšžœ˜J˜—š¡ œ˜'Jšž˜Jšœžœ˜-Jšœžœ žœžœ˜,J˜QJšœžœ˜Jšœ žœ˜Jšœ žœ˜Jšœžœ˜Jšžœ˜J˜—Jšœ`™`J˜Jšœ žœ3˜>Jšœ žœ˜Jšœ žœ˜J˜šŸ œžœžœžœ˜'Jšœžœ˜Jšœžœžœžœ ˜1Jšœ*™*Jšœ™Jšžœ˜Jšœžœ ˜'Jšœžœ˜)Jšœžœ˜'Jšœ žœ+˜6Jšœžœ ˜J˜ Jšœ ™ Jšœ ™ Jšœ˜šžœ žœ¢>œ˜QJšœ˜—šžœ¢œ˜Jšœ˜—Jšœ™Jšžœ$˜*Jšžœ˜J˜—šŸœžœ¢œ˜;Jšž˜Jšžœ#˜)Jšžœ˜—J˜šŸœžœ¢œ˜8Jšž˜Jšœ˜Jšžœ˜—J˜š¡ œ˜$Jšž˜Jšœžœ˜-Jšœžœ žœžœ˜,J˜JJšœžœ˜Jšœ žœ˜Jšœ žœ˜Jšžœ˜J˜—š¡ œ˜&Jšž˜Jšœžœ˜$Jšžœ žœ žœž˜-šžœ˜Jšœžœ˜-Jšœžœ žœžœ˜,Jšœžœ5˜;Jš žœ žœ žœžœžœ˜0Jšœ9˜9Jšœ žœ˜Jšœ žœ˜Jšœ˜Jšœžœ ˜J˜—Jšžœ˜J˜—š¡ œ˜'Jšž˜Jš œ žœ žœžœžœ ˜1Jšœ žœ˜&Jšœžœ˜-Jšœžœ žœžœ˜,J˜>Jšœ žœ˜Jšœ žœ˜Jš žœžœžœžœ žœ˜HJšžœ˜J˜—š¡ œ˜'Jšž˜Jšœžœ˜-Jšœžœ žœžœ˜,J˜=Jšœ žœ˜Jšœ žœ˜Jšœ žœ˜Jšœžœ˜Jšžœ˜J˜—šŸœžœžœžœ ˜KJšœžœ ˜Jšœ"™"Jšž˜Jšœžœ˜'Jšœžœ3˜8J˜J˜šžœžœ¢œ˜/Jšœ)¢œ ˜G—šž¢œ˜Jšœ7˜7—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šœ8˜8—šœ/˜/Jšœ9™9Jšœ9™9Jšœ;™;Jšœ˜Jšœ!˜!Jšœ˜Jšœ5˜5—šœG™GJšœ-™-Jšœ/™/Jšœ"™"Jšœ;™;—Jšžœ˜J˜—J˜Jšžœ˜J˜—…—80Z>