DIRECTORY AbSets, AMBridge, AMTypes, BasicTime, BiRels, IntStuff, IO, LichenDataOps, LichenDataStructure, LichenIntBasics, PrintTV, Rope, SetBasics; LichenDataImpl2: CEDAR PROGRAM IMPORTS AbSets, AMBridge, BiRels, IntStuff, IO, LichenDataOps, LichenDataStructure, LichenIntBasics, PrintTV, SetBasics EXPORTS LichenDataOps = BEGIN OPEN LIB:LichenIntBasics, LIB, LichenDataStructure, LichenDataOps, Sets:AbSets; startInheriting: BOOL _ FALSE; CreateDesign: PUBLIC PROC [names: Set--of ROPE--] RETURNS [d: Design] ~ { IF names.SpaceOf[] # SetBasics.ropes[TRUE] THEN ERROR; IF names.Empty[] THEN ERROR; d _ NEW [DesignPrivate]; d.names _ Sets.CreateHashCopy[names]; d.eSpace _ CreateEntitySpace[d]; d.eSetSpace _ Sets.CreateSetSpace[d.eSpace]; d.cellTypes _ Sets.CreateHashSet[d.eSpace]; d.sub _ BiRels.CreateHashFn[spaces: [d.eSpace, SetBasics.refs], invable: FALSE]; d.parent _ BiRels.CreateHashFn[spaces: ALL[d.eSpace], invable: TRUE]; d.ancest _ d.parent.TransitiveFnClosure[TRUE]; d.cct _ [ p: BiRels.CreateHashFn[spaces: [d.eSpace, d.eSpace], invable: TRUE], w: BiRels.CreateHashFn[spaces: [d.eSpace, d.eSpace], invable: TRUE], i: BiRels.CreateHashFn[spaces: [d.eSpace, d.eSpace], invable: TRUE]]; d.partses _ [d.cct[p].SetOn[left], d.cct[w].SetOn[left], d.cct[i].SetOn[left]]; d.pws _ d.partses[p].Union[d.partses[w]]; d.parts _ d.pws.Union[d.partses[i]]; d.isntTop _ d.parent.SetOn[left]; d.isComposite _ d.sub.SetOn[left]; d.isTop _ d.pws.Difference[d.isntTop]; d.isAtomic _ d.pws.Difference[d.isComposite]; d.ciType _ BiRels.CreateHashFn[spaces: [d.eSpace, d.eSpace], invable: TRUE]; d.ctName _ BiRels.CreateHashReln[spaces: [d.eSpace, SetBasics.ropes[TRUE]]]; d.arrayElt _ BiRels.CreateHashFn[spaces: ALL[d.eSpace], invable: TRUE]; d.ciXfm _ BiRels.CreateHashTable[[d.eSpace, xfmSpace]]; d.scale _ 0.0; d.other _ BiRels.CreateHashTable[]; RETURN}; CreateEntitySpace: PROC [d: Design] RETURNS [Sets.Space] ~ { RETURN [NEW [SetBasics.SpacePrivate _ [ Contains: EntityContains, Equal: SetBasics.refs.Equal, AHash: SetBasics.refs.AHash, ACompare: SetBasics.refs.ACompare, Print: EntityPrint, name: IO.PutFR["entities of %g", [rope[NARROW[d.names.AnElt[].MA] ]] ], data: d ]]]}; EntityContains: PROC [data: REF ANY, v: Sets.Value] RETURNS [BOOL] ~ { d: Design ~ NARROW[data]; IF v.i#0 THEN RETURN [FALSE]; WITH v.ra SELECT FROM ct: CellType => RETURN [TRUE]; v: Vertex => RETURN [TRUE]; p: Port => RETURN [TRUE]; ENDCASE => RETURN [FALSE]}; EntityPrint: PROC [data: REF ANY, v: Sets.Value, to: IO.STREAM, depth, length: INT, verbose: BOOL] ~ { d: Design ~ NARROW[data]; ra: REF ANY ~ v.VA; WITH ra SELECT FROM ct: CellType => { name: ROPE ~ ct.ACtName[]; to.PutRope[name]; }; ENDCASE => { class: PartClass ~ WITH ra SELECT FROM p: Port => p, w: Wire => w, ci: CellInstance => i, ENDCASE => ERROR; cct: CellType ~ NARROW[d.cct[class].Apply[v].MA]; mv: Sets.MaybeValue ~ cct.fullName[class].Lookup[goal: v, side: left]; IF mv.found THEN to.PutRope[UnparseSteppyName[VSn[mv.it]]] ELSE PrintTV.Print[RaTv[ra], to, depth, length, verbose]; RETURN}; }; namingHints: BiRels.HintPair ~ [ leftToRight: [ fn: [$Hash], set: [$List, LIST[[$RelOrder, $fwd]]] ], rightToLeft: [ fn: [$Hash], set: [$Hash] ]]; CreateCellType: PUBLIC PROC [d: Design, flavor: CellFlavor, bbox: Range2, names: Set--of ROPE--] RETURNS [ct: CellType] ~ { ct _ NEW [CellTypePrivate _ [ d: d, fullName: [ p: BiRels.GenCreate[spaces: [d.eSpace, steppyNameSpace], hints: namingHints], w: nilBiRel, i: nilBiRel], inheritNames: startInheriting, isDeduced: [ p: [ FALSE: Sets.CreateHashSet[], TRUE: Sets.CreateHashSet[]], w: [ FALSE: Sets.CreateHashSet[], TRUE: Sets.CreateHashSet[]]], bbox: bbox, other: BiRels.CreateHashTable[] ]]; IF flavor=unorganized THEN { exports: BiRel ~ BiRels.CreateHashFn[[d.eSpace, d.eSpace]]; wires: Set ~ ct.CTParts[w]; w2i: Fn ~ BiRels.FnFromProc[WireToInstances, [d.eSpace, d.eSetSpace], d]; i2w: Fn ~ BiRels.FnFromProc[InstanceToWires, [d.eSpace, d.eSetSpace], d]; ct.fullName[w] _ BiRels.GenCreate[spaces: [d.eSpace, steppyNameSpace], hints: namingHints]; ct.fullName[i] _ BiRels.GenCreate[spaces: [d.eSpace, steppyNameSpace], hints: namingHints]; ct.asu _ NEW [UnorganizedPrivate _ [ exports: exports, iwConns: BiRels.CreateFromHalves[ spaces: ALL[d.eSpace], halves: [[dullHalfClass, i2w], [dullHalfClass, w2i]]], publics: exports.SetOn[right] ]]; ct.asu.exportable _ wires.Intersection[Sets.CreateFilter[[TestExportable, d.eSpace, ct]]]; ct.asu.publicOrExportable _ ct.asu.publics.Union[ct.asu.exportable]; ct.asu.stuck _ wires.Difference[ct.asu.publicOrExportable]; }; IF NOT d.cellTypes.AddA[ct] THEN ERROR; [] _ d.ctName.AddSet[BiRels.CreateProduct[[Sets.CreateSingleA[ct, d.eSpace], names]]]; RETURN}; dullHalfClass: BiRels.HalfClass ~ NEW [BiRels.HalfClassPrivate _ [NIL]]; WireToInstances: PROC [data: REF ANY, v: Sets.Value] RETURNS [mv: Sets.MaybeValue] ~ { w: Wire ~ NARROW[v.VA]; d: Design ~ NARROW[data]; RETURN [[TRUE, w.conns.SetOn[right].SV[]]]}; InstanceToWires: PROC [data: REF ANY, v: Sets.Value] RETURNS [mv: Sets.MaybeValue] ~ { ci: CellInstance ~ NARROW[v.VA]; d: Design ~ NARROW[data]; RETURN [[TRUE, ci.conns.SetOn[right].SV[]]]}; TestExportable: PROC [val: Sets.Value, data: REF ANY _ NIL] RETURNS [BOOL] ~ { ct: CellType ~ NARROW[data]; w: Wire ~ NARROW[val.VA]; IF ct.asu.publics.HasMember[val] THEN RETURN [FALSE]; {kids: Seq ~ BiRels.DeRef[ct.d.sub.ApplyA[w].MDA]; IF kids=nilBiRel THEN RETURN [TRUE]; RETURN ct.ExportableKids[kids]}}; CreatePort: PUBLIC PROC [ct: CellType, fullNames: Set--of SteppyName--, deduced, addum, fixExpConns, fixInstConns, fixWExpConns, fixWInstConns: BOOL, children: Seq--of Port-- _ nilBiRel] RETURNS [p: Port] ~ { d: Design ~ ct.d; atomic: BOOL ~ children = nilBiRel; FixUse: PROC [use: CellUse] ~ {WITH use SELECT FROM ci: CellInstance => { cct: CellType ~ d.CiCct[ci]; kidWires: Seq _ nilBiRel; w: Wire _ NIL; {IF NOT atomic THEN { kidWires _ children.Compose[ci.conns]; IF kidWires.Size#children.Size THEN GOTO DontConnect; {ssi: SubsIndex ~ d.SubseqIndex[kidWires]; IF ssi.multiparents THEN GOTO DontConnect; IF ssi.full THEN {w _ NARROW[ssi.parent]; GOTO Connect}; IF NOT addum THEN GOTO DontConnect; IF ssi.parent#NIL THEN GOTO DontConnect; kidWires _ kidWires.CreateVectorCopy}} ELSE IF NOT addum THEN GOTO DontConnect; w _ CreateWire[cct, IF cct.inheritNames THEN ActualNames[cct.INames[ci], fullNames] ELSE emptySteppySet, FALSE, fixWExpConns, fixWInstConns, kidWires]; EXITS Connect => use _ use}; Connect[d, w, p, ci]; RETURN EXITS DontConnect => ct _ ct}; act: CellType => NoteNewEltPort[act, p]; ENDCASE => ERROR}; p _ NEW [PortPrivate _ []]; d.cct[p].AddNewAA[p, ct]; IF NOT ct.isDeduced[p][deduced].AddA[p] THEN ERROR; KnowPortNames[ct, p, fullNames, FALSE]; IF children # nilBiRel THEN { d.sub.AddNewAA[p, children.Refify]; []_ d.parent.AddSet[BiRels.CreateProduct[[children.SetOn[right], Sets.CreateSingleA[p, d.eSpace]]]]; IF fixExpConns THEN { IF ct.asu#NIL THEN ClosePortsConnectivity[d, p, children, ct.asu.exports, ct]; IF ct.asArray#NIL THEN NoteNewArrayPort[ct, p]}; }; IF addum OR (fixInstConns AND NOT atomic) THEN ct.EnumerateUses[FixUse]; RETURN}; ClosePortsConnectivity: PROC [d: Design, parent: Port, kidPorts: Seq--of Port--, conns: Fn--Port _ Wire--, site: Cell] ~ { kidWires: Seq--of Wire-- ~ kidPorts.Compose[conns]; IF kidWires.Size#kidPorts.Size THEN RETURN; {si: SubsIndex ~ d.SubseqIndex[kidWires]; IF NOT si.full THEN RETURN; IF si.parent=NIL THEN ERROR; Connect[d, NARROW[si.parent], parent, site]; RETURN}}; CreateWire: PUBLIC PROC [ct: CellType, fullNames: Set--of SteppyName--, deduced, fixExpConns, fixInstConns: BOOL, children: Seq--of Wire-- _ nilBiRel] RETURNS [w: Wire] ~ { d: Design ~ ct.d; FixConn: PROC [porta: REF ANY, site: Cell] ~ { p0: Port ~ NARROW[porta]; pp: Port ~ d.PParent[p0]; IF pp=NIL THEN RETURN; IF NOT ((fixExpConns AND fixInstConns) OR (WITH site SELECT FROM ci: CellInstance => fixInstConns, ct: CellType => fixExpConns, ENDCASE => ERROR)) THEN RETURN; {kidPorts: Seq ~ BiRels.DeRef[d.sub.ApplyA[pp].MA]; kidWires: Seq ~ kidPorts.Compose[SiteConns[site]]; IF kidWires.Equal[children] THEN Connect[d, w, pp, site]; RETURN}}; w _ NEW [VertexPrivate[w] _ [variant: w[conns: BiRels.CreateHashReln[spaces: [d.eSpace, d.eSpace]]] ]]; d.cct[w].AddNewAA[w, ct]; IF NOT ct.isDeduced[w][deduced].AddA[w] THEN ERROR; KnowVertexNames[ct, w, fullNames, FALSE]; IF children # nilBiRel THEN { d.sub.AddNewAA[w, children.Refify]; []_ d.parent.AddSet[BiRels.CreateProduct[[children.SetOn[right], Sets.CreateSingleA[w, d.eSpace]]]]; IF fixExpConns OR fixInstConns THEN { c0: Wire ~ NARROW[children.ApplyI[0].MA]; c0.conns.EnumAA[FixConn]; w _ w}; w _ w}; RETURN}; Instantiate: PUBLIC PROC [ict, cct: CellType, addum: BOOL, xfm: Transform, offset: Int2, names: Set--of SteppyName--] RETURNS [ci: CellInstance] ~ { d: Design ~ ict.d; ci _ NEW [VertexPrivate.i _ [variant: i[BiRels.CreateHashFn[[d.eSpace, d.eSpace]], offset]]]; d.cct[i].AddNewAA[ci, cct]; d.ciType.AddNewAA[ci, ict]; d.ciXfm.AddNewPair[[AV[ci], XfmV[xfm]]]; IF NOT Range2Empty[ict.bbox] THEN cct.bbox _ Range2Mbb[cct.bbox, TransOffRange2[xfm, offset, ict.bbox]]; KnowVertexNames[cct, ci, names, FALSE]; IF addum THEN { do: Set--of Port-- _ ict.CTParts[p]; UNTIL do.Empty DO wait: Set--of Port-- ~ Sets.CreateHashSet[d.eSpace]; DumPort: PROC [pval: Sets.Value] RETURNS [BOOL] ~ { p: Port ~ NARROW[pval.VA]; kidPorts: Seq--of Port-- ~ BiRels.DeRef[d.sub.Apply[pval].MDA]; kidWires: Seq--of Wire-- ~ IF kidPorts#nilBiRel THEN kidPorts.Compose[ci.conns] ELSE nilBiRel; IF kidPorts#nilBiRel AND kidPorts.Size # kidWires.Size THEN { IF NOT wait.AddElt[pval] THEN ERROR; RETURN [FALSE]}; {w: Wire ~ CreateWire[cct, IF cct.inheritNames THEN ActualNames[names, ict.PNames[p]] ELSE emptySteppySet, FALSE, FALSE--don't bother, we know it's private--, FALSE--don't bother, it's taken care of by me--, kidWires]; Connect[d, w, p, ci]; RETURN [FALSE]}}; IF do.Scan[DumPort].found THEN ERROR; do _ wait; ENDLOOP; ci _ ci}; RETURN}; KnowPartName: PUBLIC PROC [ct: CellType, class: PartClass, part: Part, fullName: SteppyName, onlyIfGood: BOOL] ~ {KnowPartNames[ct, class, part, Sets.CreateSingleton[SnV[fullName], steppyNameSpace], onlyIfGood]}; KnowPartNames: PUBLIC PROC [ct: CellType, class: PartClass, part: Part, fullNames: Set--of SteppyName--, onlyIfGood: BOOL] ~ { IF onlyIfGood THEN { bestNewM: Sets.MaybeValue ~ fullNames.AnElt[Sets.fwd]; IF NOT bestNewM.found THEN RETURN; {bestNew: SteppyName ~ VSn[bestNewM.it]; bestOldM: Sets.MaybeValue ~ ct.fullName[class].Lookup[goal: AV[part], side: left]; IF bestOldM.found THEN { bestOld: SteppyName ~ VSn[bestOldM.it]; IF GrossSteppyNameGradeCompare[bestOld.grade, bestNew.grade] < equal THEN RETURN}; }}; [] _ ct.fullName[class].AddSet[BiRels.CreateProduct[[Sets.CreateSingleA[part, ct.d.eSpace], fullNames]]]; RETURN}; ForgetPartName: PUBLIC PROC [ct: CellType, class: PartClass, part: Part, fullName: SteppyName] ~ { [] _ ct.fullName[class].RemPair[[AV[part], SnV[fullName]]]; RETURN}; GrossSteppyNameGradeCompare: PROC [g1, g2: SteppyNameGrade] RETURNS [SetBasics.TotalComparison] ~ { RETURN [SELECT TRUE FROM g1.global greater, g1.global>g2.global => less, g1.gend less, g1.gend>g2.gend => greater, ENDCASE => equal]; }; PortForWire: PUBLIC PROC [ct: CellType, internal: Wire, mayAdd: BOOL] RETURNS [port: Port] ~ { mv: Sets.MaybeValue _ ct.asu.exports.Lookup[goal: AV[internal], order: Sets.alleq]; IF NOT mv.found THEN { FullySfwdlyExportWires[ct, NonPublicDescendants[ct, internal]]; mv _ ct.asu.exports.Lookup[goal: AV[internal], order: Sets.alleq]}; IF NOT mv.found THEN ERROR; RETURN [NARROW[mv.MA]]}; FullySfwdlyExportWires: PUBLIC PROC [ct: CellType, wires: Set] ~ { d: Design ~ ct.d; childWires: Set ~ d.parent.Image[wires, rightToLeft]; badKids: Set ~ childWires.Difference[wires.Union[ct.asu.publics]]; newPorts: Seq--of Port-- ~ CreateSeq[dense: TRUE]; DoWire: PROC [w: Wire] RETURNS [p: Port] ~ { p _ AConndPort[ct, w]; IF p#NIL THEN RETURN; {kidWires: Seq--of Wire-- ~ BiRels.DeRef[d.sub.ApplyA[w].MDA]; kidPorts: Seq--of Port-- _ nilBiRel; IF kidWires#nilBiRel THEN { kidPorts _ BiRels.CreateVector[rightSpace: d.eSpace]; FOR i: LNAT IN [0 .. kidWires.Size.EN) DO kidWire: Wire ~ NARROW[kidWires.ApplyI[i].MA]; kidPort: Port ~ DoWire[kidWire]; kidPorts.AddNewIA[i, kidPort]; w _ w; ENDLOOP; w _ w}; p _ CreatePort[ct, IF ct.inheritNames THEN WNames[ct, w] ELSE emptySteppySet, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, kidPorts]; Connect[d, w, p, ct]; newPorts.AppendA[p]; RETURN}}; StartExport: PROC [val: Sets.Value] RETURNS [BOOL] ~ { [] _ DoWire[NARROW[val.VA]]; RETURN [FALSE]}; FixUse: PROC [use: CellUse] ~ {WITH use SELECT FROM ci: CellInstance => { cct: CellType ~ d.CiCct[ci]; FOR i: LNAT IN [0 .. newPorts.Size.EN) DO{ p: Port ~ NARROW[newPorts.ApplyI[i].MA]; kidPorts: Seq--of Port-- ~ BiRels.DeRef[d.sub.ApplyA[p].MDA]; kidWires: Seq--of Wire-- _ nilBiRel; w: Wire; {IF kidPorts#nilBiRel THEN { kidWires _ kidPorts.Compose[ci.conns]; IF kidWires.Size # kidPorts.Size THEN GOTO DontDoit; {ssi: SubsIndex ~ d.SubseqIndex[kidWires]; IF ssi.multiparents THEN GOTO DontDoit; IF ssi.full THEN {w _ NARROW[ssi.parent]; GOTO GotIt}; IF ssi.parent#NIL THEN GOTO DontDoit; IF NOT cct.ExportableKids[kidWires] THEN GOTO DontDoit; }}; w _ CreateWire[cct, IF ct.inheritNames THEN ActualNames[cct.INames[ci], ct.PNames[p]] ELSE emptySteppySet, FALSE, TRUE, TRUE, kidWires]; w _ w; EXITS GotIt => use _ use}; Connect[d, w, p, ci]; w _ w; EXITS DontDoit => ct _ ct }ENDLOOP; RETURN}; act: CellType => { FOR i: LNAT IN [0 .. newPorts.Size.EN) DO p: Port ~ NARROW[newPorts.ApplyI[i].MA]; NoteNewEltPort[act, p]; ct _ ct; ENDLOOP; RETURN}; ENDCASE => ERROR}; IF NOT badKids.Empty THEN ERROR; IF NOT wires.Intersection[ct.asu.publics].Empty THEN ERROR; IF wires.Scan[StartExport].found THEN ERROR; ct.EnumerateUses[FixUse]; RETURN}; Connect: PUBLIC PROC [d: Design, wire: Wire, port: Port, site: Cell] ~ { cct: CellType ~ d.WCct[wire]; conns: Fn--Port _ Wire--; WITH site SELECT FROM ci: CellInstance => conns _ ci.conns; ct: CellType => {conns _ ct.asu.exports; IF ct#cct THEN ERROR}; ENDCASE => ERROR; [] _ conns.AddAA[port, wire]; [] _ wire.conns.AddAA[port, site]; RETURN}; RaTv: PROC [ra: REF ANY] RETURNS [AMTypes.TV] ~ TRUSTED { RETURN AMBridge.TVForReferent[NEW [REF ANY _ ra], const]}; Start: PROC ~ { RETURN}; Start[]; END. ZLichenDataImpl2.Mesa Last tweaked by Mike Spreitzer on June 8, 1988 5:15:46 pm PDT Κ‘– "cedar" style˜code™K™=—K˜KšΟk œ9œP˜”K˜šΟnœœ˜Kšœ%œI˜wKšœ˜K˜—K˜Kš œœœœ&žœ˜UK˜Kšœœœ˜K˜š ž œœœ Οc œœ˜IKšœ#œœœ˜6Kšœœœ˜Kšœœ˜K˜%K˜ Kšœ,˜,Kšœ+˜+KšœIœ˜PKšœ'œœ˜EKšœ(œ˜.˜ Kšœ>œ˜DKšœ>œ˜DKšœ>œ˜E—K˜OK˜)K˜$K˜!Kšœ"˜"Kšœ&˜&Kšœ-˜-KšœFœ˜LKšœDœ˜LKšœ)œœ˜GKšœ7˜7K˜K˜#Kšœ˜—K˜šžœœ œ˜<šœœ˜'Kšžœ˜Kšžœ˜Kšžœ˜Kšžœ˜"Kšžœ˜Kšœœœœ˜GKšœ˜K˜——K˜š žœœœœœœ˜FKšœ œ˜Kšœœœœ˜šœœ˜Kšœœœ˜Kšœ œœ˜Kšœ œœ˜Kšœœœ˜——K˜šž œœœœœœœ œ˜fKšœ œ˜Kšœœœœ˜šœœ˜˜Kšœœ˜K˜K˜—šœ˜ šœœœ˜&Kšœ ˜ K˜ K˜Kšœœ˜—Kšœœœ˜1K˜Fšœ ˜ Kšœ*˜.Kšœ5˜9—Kšœ˜——K˜—K˜šœ ˜ ˜K˜ Kšœ œ˜%K˜—˜K˜ K˜ K˜——K˜š žœœœ9Ÿ œœ˜{šœœ˜K˜˜ KšœM˜MK˜ K˜ —Kšœ˜šœ ˜ ˜Kšœ˜Kšœ˜—˜Kšœ˜Kšœ˜——K˜ K˜K˜—šœœ˜Kšœ;˜;K˜KšœI˜IKšœI˜IKšœ[˜[Kšœ[˜[šœ œ˜$K˜šœ!˜!Kšœœ ˜Kšœ6˜6—K˜K˜—KšœZ˜ZKšœD˜DKšœ;˜;K˜—Kšœœœœ˜'KšœV˜VKšœ˜Kšœ"œœ˜H—K˜š žœœœœœ˜VKšœ œœ˜Kšœ œ˜Kšœœœ˜,—K˜š žœœœœœ˜VKšœœœ˜ Kšœ œ˜Kšœœœ˜-—K˜šžœœœœœœœ˜NKšœœ˜Kšœ œœ˜Kšœœœœ˜5Kšœ-œ˜2Kšœœœœ˜$Kšœ˜!—K˜šž œœœŸœJœŸ œ œ˜ΠK˜Kšœœ˜#š žœœœœ˜3šœ˜K˜K˜Kšœ œ˜šœœœœ˜Kšœ&˜&Kšœœœ ˜5Kšœ*˜*Kšœœœ ˜*Kšœ œœœ ˜8Kšœœœœ ˜#Kšœ œœœ ˜(Kšœ&˜&—Kš œœœœœ ˜(Kš œœœ(œœ)˜—Kšœ˜Kšœ˜Kš˜Kšœ˜—K˜(Kšœœ˜—Kšœœ˜Kšœ˜Kšœœ"œœ˜3Kšœ œ˜'šœœ˜Kšœ#˜#Kšœd˜dšœ œ˜Kšœœœ<˜NKšœ œœ˜0—K˜—Kš œœœœ œ˜HKšœ˜—K˜š žœœ(Ÿ œ ŸΠcmŸœ˜zKšœ Ÿ œ˜3Kšœœœ˜+Kšœ)˜)Kšœœ œœ˜Kšœ œœœ˜Kšœ œ˜,Kšœ˜ —K˜šž œœœŸœ&œŸ œ œ˜¬K˜šžœœ œœ˜.Kšœ œ˜Kšœ˜Kšœœœœ˜Kšœœœœœœœ@œœœœ˜ŸKšœ/œ˜3Kšœ2˜2Kšœœ˜9Kšœ˜ —Kšœœ`˜gKšœ˜Kšœœ"œœ˜3Kšœ"œ˜)šœœ˜Kšœ#˜#Kšœd˜dšœ œœ˜%Kšœ œœ˜)K˜K˜—K˜—Kšœ˜—K˜š ž œœœœ*Ÿœœ˜”K˜KšœœU˜]Kšœ˜Kšœ˜Kšœœ˜(KšœœœG˜hKšœ œ˜'šœœ˜KšœŸ œ˜$šœ ˜Kšœ Ÿ œ ˜4šžœœœœ˜3Kšœ œœ˜Kšœ Ÿ œ"œ˜?Kš œ Ÿ œœœœ ˜^šœœœ˜=Kšœœœœ˜$Kšœœ˜—Kšœœœ#œœŸ&œŸ*œ ˜ΪKšœ˜Kšœœ˜—Kšœœœ˜%K˜ Kšœ˜—Kšœ ˜ —Kšœ˜—K˜šž œœœPœ˜nKšœe˜e—K˜š ž œœœ<Ÿœœ˜~šœ œ˜K˜6Kšœœœœ˜"Kšœ(˜(Kšœ<œ˜Ršœœ˜K˜'KšœCœœ˜R—Kšœ˜—Kšœi˜iKšœ˜—K˜šžœœœG˜bKšœ!œ˜;Kšœ˜—K˜šžœœœ ˜cšœœœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜—K˜—K˜š ž œœœ(œœ˜^Kšœ2œ˜Sšœœ œ˜Kšœ?˜?Kšœ!œ ˜C—Kšœœ œœ˜Kšœœœ˜—K˜šžœœœ˜BK˜K˜5KšœB˜BKšœ Ÿ œœ˜2šžœœ œ˜,Kšœ˜Kšœœœœ˜KšœŸ œ œ˜>Kšœ Ÿ œ ˜$šœœ˜Kšœ5˜5š œœœœ˜)Kšœœœ˜.K˜ K˜Kšœœ˜—K˜—Kšœœœœœœœœœœ ˜‚K˜Kšœ˜Kšœ˜ —šž œœœœ˜6Kšœ œœ˜Kšœœ˜—š žœœœœ˜3˜K˜š œœœœœ˜*Kšœ œœ˜(Kšœ Ÿ œ œ˜=Kšœ Ÿ œ ˜$K˜šœœœ˜Kšœ&˜&Kšœœœ ˜4Kšœ*˜*Kšœœœ ˜'Kšœ œœœ˜6Kšœ œœœ ˜%Kšœœœœ ˜7K˜—Kš œœœ+œœœœ ˜ˆK˜Kšœ˜K˜K˜Kšœ˜Kšœœ˜ —Kšœ˜—šœ˜š œœœœ˜)Kšœ œœ˜(Kšœ˜Kšœ œ˜—Kšœ˜—Kšœœ˜—Kšœœœœ˜ Kšœœ*œœ˜;Kšœœœ˜,Kšœ˜Kšœ˜—K˜šžœœœ4˜HK˜Kšœ Ÿ Ÿœ˜šœœ˜Kšœ%˜%Kšœ)œœœ˜?Kšœœ˜—Kšœ˜Kšœ"˜"Kšœ˜—K˜šžœœœœœ œœ˜9Kšœœœœ˜:—K˜šžœœ˜Kšœ˜—K˜K˜K˜Kšœ˜—…—8HIC