DIRECTORY Convert, Core, CoreClasses, CoreCreate, CoreFlat, CoreOps, IO, Ports, Rosemary, RosemaryUser, Rope, PWCoreHack, SmallCacheLogic, SCParms, Sisyph, TerminalIO; SmallCacheArrayImpl: CEDAR PROGRAM IMPORTS Convert, CoreClasses, CoreCreate, CoreFlat, CoreOps, Ports, PWCoreHack, Rosemary, Rope, SCParms, Sisyph, TerminalIO EXPORTS SmallCacheLogic ~ BEGIN OPEN SmallCacheLogic; ClockEvalEnabled: BOOL = TRUE; MySmallCacheName: ROPE = Rosemary.Register[roseClassName: "SmallCacheArray", init: Init, evalSimple: Simple, scheduleIfClockEval: ClockEvalEnabled]; NumFlagsBits: NAT = 4; NumIOLines: NAT = 2*3; numMemLines: NAT _ 2*SCParms.numMemLines; numAddressBits: NAT _ SCParms.numBitsPerWord+1; --Includes IO/Mem Bit-- numPageBits: NAT _ SCParms.numPageBits+1; --Includes IO/Mem Bit-- numPageAndBlockBits: NAT _ numPageBits+SCParms.numBlockBits; IOVCamLine: ARRAY [0..NumIOLines) OF Rope.ROPE _ [ Rope.Cat[SCParms.vPagePattern, SCParms.vBlock0Pattern], Rope.Cat[SCParms.vPagePattern, SCParms.vBlock1Pattern], Rope.Cat[SCParms.vPagePattern, SCParms.vBlock2Pattern], Rope.Cat[SCParms.vPagePattern, SCParms.vBlock3Pattern], Rope.Cat[SCParms.vPagePattern, SCParms.vBlock4Pattern], Rope.Cat[SCParms.vPagePattern, SCParms.vBlock5Pattern] ]; IORCamLine: ARRAY[0..NumIOLines) OF Rope.ROPE _ [ Rope.Cat[SCParms.rPagePattern, SCParms.rBlock0Pattern], Rope.Cat[SCParms.rPagePattern, SCParms.rBlock1Pattern], Rope.Cat[SCParms.rPagePattern, SCParms.rBlock2Pattern], Rope.Cat[SCParms.rPagePattern, SCParms.rBlock3Pattern], Rope.Cat[SCParms.rPagePattern, SCParms.rBlock4Pattern], Rope.Cat[SCParms.rPagePattern, SCParms.rBlock5Pattern] ]; IOFlagsLine: ARRAY[0..NumIOLines) OF Rope.ROPE = ["1111", "0011", "0011", "0011", "0011", "0011"]; Match: TYPE = REF MatchRec; MatchRec: TYPE = RECORD [ ARRAY Index OF LevelSequence ]; IOMatch: TYPE = REF IOMatchRec; IOMatchRec: TYPE = RECORD [ ARRAY Index[RML1..GND] OF LevelSequence ]; TwoDArray: TYPE = REF TwoDArrayRec; TwoDArrayRec: TYPE = RECORD [ SEQUENCE size: NAT OF LevelSequence ]; KindOfMatch: TYPE = {Virtual, Real}; Index: TYPE = {Victim, RamSel, RML1, LVM, RML2, RML3, RML4, GND}; CacheState: TYPE = REF CacheStateRec; CacheStateRec: TYPE = RECORD [ prevClk: Level, match: Match _ NIL, -- contains mem array ctl bits (see def) iomatch: ARRAY Index[RML1..GND] OF ARRAY [0..NumIOLines) OF Level, csMuxSR: Level, -- flop in CSMuxInterface rsCmdLatch : ARRAY[0..1] OF Level, -- latch in RSMuxInterface csOut, rsOut, iorsOut: Index, -- to implement csmux, rsmux, iorsmux rBCycle: ARRAY [3..5] OF Level, -- delay stages in RML234 enCamSelExtFF: Level, -- delay stage for EnCamSelExt victimIndex: INT, -- line pointed to by victim tmpVictimIndex: INT, -- to implement victim Flops use: LevelSequence _ NIL, -- use bits in array tmpUse: LevelSequence _ NIL, -- to implement use Flops soSR: ARRAY [0..1] OF Level, -- delay stages in SOInterface sh, ow: LevelSequence _ NIL, -- sh ow bits in array shBit, owBit: Level, -- sh and ow bits in SORdLatch pWtInProgB: Level, -- output of SOInterface ramWtSR, ramRdSR: ARRAY [0..1] OF Level, -- 2 flops each in RamInterfaceCtl ramRdorWt: Level, -- flop to generate Prech ramRdLatch: LevelSequence _ NIL, -- ramRdLatch in RamInterface bar: LevelSequence _ NIL, -- block assembly register ram: TwoDArray _ NIL, -- ram bits ioRam: RECORD [cWSOld, cWSNew, aID, faultCode, intStatus, intMask, modes, lFCode1, lFCode3, lFCode5, lFCode7: LevelSequence _ NIL], -- ioram bits vCamCSCmd1, rCamCSCmd1: Level, -- latches in RCam and VCam Interfaces rCam, vCam: TwoDArray _ NIL, -- rcam and vcam bits arm, avm: Level, -- values of arm and avm ioRCam, ioVCam: ARRAY [0..NumIOLines) OF LevelSequence, -- iorcam and iovcam bits flags: TwoDArray _ NIL, -- flags array ioFlags: ARRAY [0..NumIOLines) OF ARRAY [0..NumFlagsBits) OF Level, -- ioflags array rCamRdLatch, rCamWtReg, vCamRdLatch, vCamWtReg: LevelSequence, flagsRdLatch, flagsWtReg: ARRAY [0..NumFlagsBits) OF Level, vCamDrBLFF, rCamDrBLFF: Level, -- flops for CamDrBL vCamLdFF, rCamLdFF: Level, -- flop for LdCamRL; note there is no flop for CCamPr because precharge is not modeled explicitly vCamSel: Index, -- source of input for vcam select line aVct: Level, -- arrayVictim resetDone: BOOLEAN, -- used to suppress error due to X's before Reset has been done tmpRAdrsIn, tmpVAdrsInOut: LevelSequence _ NIL, tmpCycleIn: LevelSequence _ NIL, tmpBAREn: LevelSequence _ NIL, tmpFlagsIn: ARRAY [0..NumFlagsBits) OF Level, tmpxEnCamSel, tmpxEnCamSelExt, tmpRBCycle2, tmpxWtRam, tmpxRdRam, tmpramRdorWt, tmpxLdVCamWR, tmpxDrVCamBL, tmpxLdVCamRL, tmpxLdRCamRL, tmpVPValidIn, tmpRPValidIn, tmpPWtInProg, tmpxDrRCamBL, tmpxLdRCamWR, tmpReset: Level, numCyclesAfterReset: NAT ]; enableDumpState: BOOL _ FALSE; cacheStateRef: CacheState _ NIL; cacheStateValueIn, cacheStateValueOut: ROPE _ NIL; Vdd, Gnd, Reset, xCVCamPr, xCRCamPr, LdVML, ClrVPV, PCtlClrAllVPV, PCtlResetVictim, Spare, RamClock, xLdUse, PCtlDrABusVB, PCtlDrABusVP, nPartVMch, xLdVCamRL, xLdVCamWR, xDrVCamBL, VAdrsInOut, VPValidIn, PCtlDrABusRB, PCtlDrABusRP, xLdRCamRL, nxPartRMch, xDrRCamBL, xLdRCamWR, xEnCamSelExt, RBCycle2, RAdrsIn, RPValidIn, FlagsIn, nPMFlags, xEnCamSel, PCtlShftVictim4, PCtlFrzVictim, xCSCmd, nEnRS, xRSCmd, PWtInProg, BCtlSetOw, BCtlClrOw, SetSh, ClrSh, xRdRam, xWtRam, nxSelWdData, nxByteSel, nxWdSel, WdWtData, CycleIn, BAREn, Modes, RAdrsOut, FlagsOut, BlkRdData, WdRdData, SetReschedule, ASh, AOw, ARM3, AVM, Clock: NAT; Array: PUBLIC PROC [cts: CellTypeSpec, cx: Context] RETURNS [ct: CellType] = BEGIN public: Wire _ CoreCreate.WireList[LIST["Vdd", "Gnd", "Reset", "xCVCamPr", "xCRCamPr", "LdVML", "ClrVPV", "PCtlClrAllVPV", "PCtlResetVictim", CoreCreate.Seq["Spare", SCParms.numBitsPerCycle], "RamClock", "xLdUse", "PCtlDrABusVB", "PCtlDrABusVP", "nPartVMch", "xLdVCamRL", "xLdVCamWR", "xDrVCamBL", CoreCreate.Seq["VAdrsInOut", numAddressBits], "VPValidIn", "PCtlDrABusRB", "PCtlDrABusRP", "xLdRCamRL", "nxPartRMch", "xDrRCamBL", "xLdRCamWR", "xEnCamSelExt", "RBCycle2", CoreCreate.Seq["RAdrsIn", numAddressBits], "RPValidIn", CoreCreate.Seq["FlagsIn", NumFlagsBits], CoreCreate.Seq["nPMFlags", NumFlagsBits], "xEnCamSel", "PCtlShftVictim4", "PCtlFrzVictim", CoreCreate.Seq["xCSCmd", 2], "nEnRS", CoreCreate.Seq["xRSCmd",2], "PWtInProg", "BCtlSetOw", "BCtlClrOw", "SetSh", "ClrSh", "xRdRam", "xWtRam", "nxSelWdData", CoreCreate.Seq["nxByteSel", SCParms.numBytesPerWord], CoreCreate.Seq["nxWdSel", SCParms.numWordsPerLine], CoreCreate.Seq["WdWtData", SCParms.numBitsPerWord], CoreCreate.Seq["CycleIn", SCParms.numBitsPerCycle], CoreCreate.Seq["BAREn", SCParms.numCyclesPerLine], CoreCreate.Seq["Modes", SCParms.numBitsPerWord], CoreCreate.Seq["RAdrsOut", numAddressBits], CoreCreate.Seq["FlagsOut", NumFlagsBits], CoreCreate.Seq["BlkRdData", SCParms.numBitsPerLine], CoreCreate.Seq["WdRdData", SCParms.numBitsPerWord], "SetReschedule", "ASh", "AOw", "ARM3", "AVM", "Clock"]]; SELECT cts FROM Schematic => ct _ Sisyph.ES["SCacheArray.sch", cx]; Procedure => { ct _ CoreClasses.CreateUnspecified[public: public]; [] _ Rosemary.BindCellType[cellType: ct, roseClassName: MySmallCacheName]; [] _ CoreFlat.CellTypeCutLabels[ct, "Logic"]; [] _ Ports.InitPort[public[CoreOps.GetWireIndex[public, "VAdrsInOut"]], ls, separate, none, NEW [Ports.DriveSequenceRec[numAddressBits]]]; Ports.InitPorts[ct, ls, none, "RAdrsIn"]; [] _ Ports.InitPort[public[CoreOps.GetWireIndex[public, "RAdrsOut"]], ls, separate, none, NEW [Ports.DriveSequenceRec[numAddressBits]]]; Ports.InitPorts[ct, ls, none, "Spare"]; Ports.InitPorts[ct, ls, none, "FlagsIn"]; Ports.InitPorts[ct, ls, none, "nPMFlags"]; Ports.InitPorts[ct, ls, none, "xCSCmd"]; Ports.InitPorts[ct, ls, none, "xRSCmd"]; Ports.InitPorts[ct, ls, none, "nxByteSel"]; Ports.InitPorts[ct, ls, none, "nxWdSel"]; Ports.InitPorts[ct, ls, none, "WdWtData"]; Ports.InitPorts[ct, ls, none, "CycleIn"]; Ports.InitPorts[ct, ls, none, "BAREn"]; [] _ Ports.InitPort[public[CoreOps.GetWireIndex[public, "FlagsOut"]], ls, separate, none, NEW [Ports.DriveSequenceRec[NumFlagsBits]]]; Ports.InitPorts[ct, ls, drive, "Modes"]; Ports.InitPorts[ct, ls, drive, "BlkRdData"]; Ports.InitPorts[ct, ls, drive, "WdRdData"]; Ports.InitPorts[ct, l, none, "Vdd", "Gnd", "Reset", "xCVCamPr", "xCRCamPr", "LdVML", "ClrVPV", "PCtlClrAllVPV"]; Ports.InitPorts[ct, l, none, "PCtlResetVictim", "Spare", "xLdUse", "PCtlDrABusVB", "PCtlDrABusVP", "nPartVMch", "xLdVCamRL", "xLdVCamWR", "xDrVCamBL"]; Ports.InitPorts[ct, l, none, "Clock", "VPValidIn", "PCtlDrABusRB", "PCtlDrABusRP", "xLdRCamRL", "nxPartRMch", "xDrRCamBL", "xLdRCamWR", "xEnCamSelExt", "RBCycle2"]; Ports.InitPorts[ct, l, none, "xEnCamSel", "PCtlShftVictim4", "PCtlFrzVictim", "nEnRS"]; Ports.InitPorts[ct, l, none, "PWtInProg", "BCtlSetOw", "BCtlClrOw", "SetSh", "ClrSh", "xRdRam", "xWtRam", "nxSelWdData", "RPValidIn"]; Ports.InitPorts[ct, l, drive, "RamClock"]; Ports.InitPorts[ct, l, drive, "SetReschedule", "ASh", "AOw", "ARM3", "AVM"] }; CoreFile => ct _ PWCoreHack.Retrieve["SCacheArray"]; ENDCASE => ERROR; END; ArrayGetState: PUBLIC PROC[] RETURNS[csv: ROPE] = BEGIN DumpState[]; csv _ cacheStateValueOut END; ArrayPutState: PUBLIC PROC[csv: ROPE] = BEGIN cacheStateValueIn _ csv; END; LoadState: PROC [] = BEGIN cs: CacheState _ cacheStateRef; fieldStart: NAT _ 0; fieldStop: NAT _ 0; RopeToL: PROC[value: ROPE] RETURNS[l: Level] = BEGIN IF Rope.Length[value] # 1 THEN ERROR; SELECT Rope.Fetch[value, 0] FROM '1 => RETURN[H]; '0 => RETURN[L]; 'X => RETURN[X]; ENDCASE => ERROR; END; LoadLS: PROC[ls: LevelSequence, value: ROPE] = BEGIN ropeIx: NAT _ 0; FOR i: NAT IN [0..ls.size) DO ropeIx _ Rope.SkipTo[s: value, pos: ropeIx, skip: "01X"]; SELECT Rope.Fetch[value, ropeIx] FROM '1 => ls[i] _ H; '0 => ls[i] _ L; 'X => ls[i] _ X; ENDCASE; ropeIx _ ropeIx+1 ENDLOOP; END; LoadBlock: PROC[block: LevelSequence, value: ROPE] = BEGIN ropeIx: NAT _ 0; FOR wdIx: NAT IN [0..SCParms.numWordsPerLine) DO FOR bitIx: NAT IN [0..SCParms.numBitsPerWord) DO ropeIx _ Rope.SkipTo[s: value, pos: ropeIx, skip: "01X"]; SELECT Rope.Fetch[value, ropeIx] FROM '1 => block[bitIx*SCParms.numWordsPerLine+wdIx] _ H; '0 => block[bitIx*SCParms.numWordsPerLine+wdIx] _ L; 'X => block[bitIx*SCParms.numWordsPerLine+wdIx] _ X; ENDCASE; ropeIx _ ropeIx+1; ENDLOOP; ENDLOOP; END; GetInt: PROC[] RETURNS[i: INT] = BEGIN fieldStart _ Rope.SkipTo[s: cacheStateValueIn, pos: fieldStart, skip: "0123456789"]; fieldStop _ Rope.SkipTo[s: cacheStateValueIn, pos: fieldStart, skip: ","]; i _ Convert.IntFromRope[Rope.Substr[cacheStateValueIn, fieldStart, fieldStop-fieldStart]]; fieldStart _ fieldStop+1; END; GetRope: PROC[] RETURNS[r: ROPE] = BEGIN fieldStart _ Rope.SkipTo[s: cacheStateValueIn, pos: fieldStart, skip: "01X"]; fieldStop _ Rope.SkipTo[s: cacheStateValueIn, pos: fieldStart, skip: ","]; r _ Rope.Substr[cacheStateValueIn, fieldStart, fieldStop-fieldStart]; fieldStart _ fieldStop+1; END; IF cacheStateValueIn=NIL THEN RETURN; cs.victimIndex _ cs.tmpVictimIndex _ GetInt[]; FOR i: NAT IN [0..numMemLines) DO cs.match[Victim][i] _ L ENDLOOP; cs.match[Victim][cs.victimIndex] _ H; THROUGH [0..numMemLines) DO lineNum: NAT _ GetInt[]; LoadLS[cs.vCam[lineNum], GetRope[]]; LoadLS[cs.rCam[lineNum], GetRope[]]; LoadLS[cs.flags[lineNum], GetRope[]]; cs.sh[lineNum] _ RopeToL[GetRope[]]; cs.ow[lineNum] _ RopeToL[GetRope[]]; cs.use[lineNum] _ RopeToL[GetRope[]]; LoadBlock[cs.ram[lineNum], GetRope[]]; ENDLOOP; END; DumpState: PROC[] = BEGIN cs: CacheState _ cacheStateRef; LToRope: PROC[l: Level] RETURNS [ROPE] = BEGIN SELECT l FROM L => RETURN["0"]; H => RETURN["1"]; X => RETURN["x"]; ENDCASE => ERROR; END; LSToRope: PROC[ls: LevelSequence] RETURNS [lsr: ROPE _ NIL] = BEGIN FOR i: NAT IN [0..ls.size) DO lsr _ Rope.Cat[lsr, LToRope[ls[i]]] ENDLOOP; END; AdrsToRope: PROC[adrs: LevelSequence] RETURNS [ar: ROPE] = BEGIN ar _ Rope.Cat[LToRope[adrs[0]], " "]; FOR i: NAT IN [1..numPageBits) DO ar _ Rope.Cat[ar, LToRope[adrs[i]]] ENDLOOP; ar _ Rope.Cat[ar, " "]; FOR i: NAT IN [numPageBits..numPageAndBlockBits) DO ar _ Rope.Cat[ar, LToRope[adrs[i]]] ENDLOOP; ar _ Rope.Cat[ar, " "]; FOR i: NAT IN [numPageAndBlockBits..numAddressBits) DO ar _ Rope.Cat[ar, LToRope[adrs[i]]] ENDLOOP; END; BlockToRope: PROC[block: LevelSequence] RETURNS[br: ROPE _ NIL] = BEGIN FOR wdIx: NAT IN [0..SCParms.numWordsPerLine) DO FOR bitIx: NAT IN [0..SCParms.numBitsPerWord) DO br _ Rope.Cat[br, LToRope[block[bitIx*SCParms.numWordsPerLine+wdIx]]]; ENDLOOP; IF wdIxKš œ žœžœžœžœžœžœ˜BKšœ‘˜+Kšœ žœžœ ‘˜>Kšœ‘%˜DKšœ žœžœ ‘˜;Kšœ‘˜6Kšœ žœ‘˜0Kšœžœ‘˜3Kšœžœ‘˜/Kšœžœ‘˜7Kšœžœžœ ‘˜˜>Kšœžœžœ ˜=Kšœ!‘˜5Kšœžœ ‘a˜}Kšœ‘'˜9Kšœ‘˜Kšœ žœ‘?˜UK˜Kšœ@™@Kšœ+žœ˜/Kšœžœ˜ Kšœžœ˜Kšœ žœžœ˜-Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšœž˜Kšœ˜—K˜—š  ™ Kšœžœžœ˜Kšœžœ˜ Kšœ'žœžœ˜2Kšœκžœ˜ο—š  ™ š Ÿœžœžœ"žœž˜RKšœ#žœΆ ˜έ K˜šžœž˜Kšœžœ˜3˜Kšœ4˜4KšœJ˜JKšœ-˜-K˜Kšœ\žœ,˜‹Kšœ)˜)KšœZžœ,˜‰Kšœ'˜'Kšœ)˜)Kšœ*˜*Kšœ(˜(Kšœ(˜(Kšœ+˜+Kšœ)˜)Kšœ*˜*Kšœ)˜)Kšœ'˜'KšœZžœ*˜‡Kšœ(˜(Kšœ,˜,Kšœ+˜+K˜Kšœq˜qKšœ—˜—Kšœ€˜€KšœW˜WKšœ†˜†Kšœ*˜*KšœK˜KK˜—Kšœ4˜4Kšžœžœ˜—Kšžœ˜—K™K™š Ÿ œžœžœžœžœž˜7K˜ K˜Kšžœ˜—K™K™š Ÿ œžœžœžœž˜-K˜Kšžœ˜——š ™K™7šŸ œžœž˜Kšœ˜Kšœ žœ˜Kšœ žœ˜š œžœžœžœ ž˜4Kšžœžœžœ˜%šžœž˜ Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšžœžœ˜—Kšžœ˜—K˜šœžœžœž˜4Kšœžœ˜šžœžœžœž˜Kšœ9˜9šžœž˜%Kšœ˜Kšœ˜Kšœ˜Kšžœ˜—K˜Kšžœ˜—Kšžœ˜—K˜š œžœžœž˜:Jšœžœ˜šžœžœžœž˜0šžœžœžœž˜0Jšœ9˜9šžœž˜%Kšœ4˜4Kšœ4˜4Kšœ4˜4Kšžœ˜—K˜Jšžœ˜—Jšžœ˜—Kšžœ˜—K˜š œžœžœžœž˜&JšœT˜TJšœJ˜JJšœZ˜ZJšœ˜Jšžœ˜J˜—š œžœžœžœž˜(JšœM˜MJšœJ˜JJšžœA˜EJšœ˜Jšžœ˜—J˜Jšžœžœžœžœ˜%Jšœ.˜.šžœžœžœž˜!J˜Jšžœ˜—Jšœ%˜%J˜šžœž˜Jšœ žœ ˜Kšœ$˜$Kšœ$˜$Kšœ%˜%Kšœ$˜$Kšœ$˜$Kšœ%˜%Kšœ&˜&Kšžœ˜—Kšžœ˜—K˜K™8šŸ œžœž˜Kšœ˜K˜š œžœ žœžœž˜.šžœž˜ Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšžœžœ˜—Kšžœ˜—K˜š œžœžœžœžœž˜CKš žœžœžœžœ%žœ˜JKšžœ˜—K˜š  œžœžœžœž˜@Jšœ%˜%Jš žœžœžœžœ%žœ˜NJšœ˜Jš žœžœžœ$žœ%žœ˜`Jšœ˜Jš žœžœžœ'žœ%žœ˜cKšžœ˜—K˜š  œžœžœžœžœž˜Gšžœžœžœž˜0šžœžœžœž˜0JšœF˜FJšžœ˜—Jšžœ žœ˜>Jšžœ˜—Kšžœ˜—K˜Kšžœžœžœžœ˜KšœW˜Wšžœžœžœž˜!KšœV˜VKšœV˜VKšœV˜VKšœV˜VKšœO˜OKšœO˜OKšœQ˜QKšœU˜UK˜8Kšžœ˜—K˜8Kšžœ˜—K˜šŸœž˜Kšœžœ˜ Kšœ˜K˜K™,šžœ ž˜šžœ˜Kšœžœ˜Kšœ žœ ˜šžœ žœž˜Kšœžœ ˜1Kšžœ˜—Kšœ žœ!˜-Kšœ žœ!˜0Kšœžœ!˜,Kšœžœ!˜,Kšœžœ,˜?Kšœ žœ,˜8Kšœ žœ˜)šžœžœžœž˜!Kšœ žœ,˜;Kšžœ˜—Kšœžœ,˜AKšœžœ,˜AKšœžœ,˜>Kšœžœ,˜DKšœžœ,˜DKšœžœ,˜BKšœžœ,˜@Kšœžœ,˜BKšœžœ,˜BKšœžœ,˜BKšœžœ,˜BKšœ žœ˜*šžœžœžœž˜!Kšœ žœ$˜4Kšžœ˜—Kšœ žœ˜*šžœžœžœž˜!Kšœ žœ$˜4Kšžœ˜—K˜šžœžœžœž˜ Kšœžœ$˜6Kšžœ˜—šžœžœžœž˜ Kšœžœ$˜6Kšžœ˜—Kšœ žœ˜+šžœžœžœž˜!Kšœžœ"˜3Kšžœ˜—Kšœžœ$˜8Kšœžœ$˜6Kšœžœ$˜8Kšœžœ$˜6K˜Kšœžœ$˜7Kšœžœ-˜@Kšœžœ.˜?Kšœžœ$˜:K˜—Kšžœžœ˜*—K˜Kšœg˜gK˜šžœžœžœ˜ K˜WKšžœ˜—šžœžœžœ˜Kšœ-˜-Kšžœ˜—šžœžœžœ˜(Kšœ˜Kšœ˜Kšžœ˜—šžœžœž˜Kšœ4˜4Kšœ4˜4šžœžœIž˜SKšœ%˜%Kšžœ˜—šžœžœžœ˜%K˜%Kšžœ˜—šžœžœž˜K˜Kšžœ˜—šžœžœžœ˜(Kšœ˜Kšžœ˜—K˜<šžœ žœ žœžœ˜"K˜Kšžœ˜—Kšœ žœ ˜Kšžœ˜—K˜Kšœ˜šžœžœžœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšžœ˜—šžœžœžœ˜K˜Kšžœ˜—Kšœ%˜%Kšœ"˜"Kšœ,˜,šžœžœžœ˜ Kšœ/˜/Kšžœ˜ —šžœžœžœ˜)Kšœ˜Kšžœ˜ —šžœžœžœ˜*Kšœ˜Kšžœ˜ —šžœžœžœ˜Kšœ˜Kšžœ˜ —KšœΕžœžœ˜Οšžœžœžœ˜šžœžœIž˜SK˜+Kšžœ˜—Kšœ$˜$Kšœ#˜#Kšžœ˜—šžœžœž˜šžœžœžœ˜Kšœžœ$žœžœ˜HKšžœ˜—šžœžœž˜$Kšœžœ#žœžœ˜FKšœžœ#žœžœ˜FKšžœ˜—Kšžœ˜—šžœžœžœ˜)Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšžœ˜—šžœžœž˜š žœ žœžœžœž˜K˜Kšžœ˜—Kšœ žœ ˜Kšžœ˜—Kšœžœ˜K˜KšœΌ˜ΌKšœΠ˜ΠKšœΈ˜ΈK˜Kšœ”˜”K˜Kšœ’˜’K˜Kšœ’˜’K˜KšœP˜PK˜K˜Kšžœ˜K˜—K˜šŸœž˜!Kšœžœ ˜"K˜Kšžœžœžœ˜+Kšžœžœ˜1Kšžœžœ˜1Kšœ˜Kšœ ˜ Kšžœ˜Kšœ˜Kšœ#˜#Kšœ˜Kšœ˜Kš žœžœžœžœ žœ˜JKšžœ˜—K˜š  œžœ+žœžœžœ˜Qšžœ˜Kš žœžœžœ žœžœ˜—Kšžœ˜——K˜K™Kš žœ žœ žœžœžœ˜6K˜K˜K™?šžœžœ˜%Kšœ˜Kšœ˜Kšœ˜—K˜K™Xšžœžœ˜%K™ šžœžœ˜šžœ˜šžœžœžœžœ˜-Kšœ(˜(Kšžœ˜—Kšžœ˜—Kšœ˜—K™ šžœžœ˜šžœ˜šžœ˜šžœ˜šžœžœžœžœ˜-Kšœ!˜!Kšžœ˜—šžœ˜Kšœ˜šžœžœž˜'Kšœ˜Kšžœžœ)˜GKšœ˜Kšžœ˜—Kšœ˜——Kšœ˜—Kšžœ˜—Kšœ˜—Kšœ˜Kšœ˜Kšœ˜Kšœ˜K˜—K™CKšœ-˜-šžœžœ˜Kšœžœ˜$šžœžœžœž˜,Kšœ)˜)Kšœ%˜%Kšž˜—K˜—K˜K™K˜K˜ šžœžœž˜'šžœžœ˜4Kšžœ˜šžœžœžœž˜>K˜——Kšžœ˜—šžœžœ žœ˜CK˜—K™Wšžœžœž‘˜K™UKšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜šžœžœžœ˜šžœ˜šžœ˜šžœ ˜ Kšžœ˜šžœžœ ˜Kšžœ˜Kšžœ˜——šžœ ˜ Kšžœ˜šžœžœ ˜Kšžœ˜Kšžœ˜——K˜—šžœ˜šžœ˜šžœ˜šžœ ˜Kšžœ˜šžœžœ ˜Kšžœ˜Kšžœ˜——šžœ ˜Kšžœ˜šžœžœ ˜Kšžœ˜Kšžœ˜——K˜——K˜——Kšžœ˜ —K˜šžœžœž˜šžœ˜ Kšžœ˜Kšžœžœžœ˜A—Kšžœ˜—K˜šžœ4˜6Kšžœ ˜šžœžœ žœ$˜9Kšžœ ˜šžœ žœ$˜9Kšžœ ˜Kšžœ˜—K˜——šžœ4˜6Kšžœ ˜šžœžœ žœ$˜9Kšžœ ˜šžœ žœ$˜9Kšžœ ˜Kšžœ˜———Kšžœ˜—K˜K™Jš žœžœžœžœ$žœ˜XK™K™(K˜)K˜K™KšœF˜FKšœ.˜.K˜K™+Kšžœžœ˜4K˜Kšžœ˜—˜K˜—šœžœ+žœž˜Cšœ žœ˜ Kšœ"˜"K™K™ šžœžœ˜šžœžœžœ˜(Kšœ‘œ‘˜*Kšžœ˜ —šžœžœ˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšžœ˜——šž˜šžœžœžœ˜"šžœžœžœ˜(KšœC˜CKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœI˜IKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœI˜IKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšž˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœD˜DKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšžœ˜——šž˜šžœžœžœ˜!šžœžœžœ˜(KšœF˜FKšžœ˜——šž˜š žœžœžœžœžœž˜HKšœF˜FKšžœ˜———————————Kšœ˜—Kšœ˜—K™K™ šžœžœ˜šžœžœ˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ)˜)——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ(˜(——Kšžœ˜—Kšž˜šžœžœžœ˜"šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ%˜%——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ+˜+——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ+˜+——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ)˜)——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(Kšœ˜šžœžœ˜Kšœ'˜'——Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜'šžœžœ˜Kšœ˜—šž˜šžœžœž˜;Kšœ˜K˜———Kšžœ˜—šž˜šžœžœžœ˜!šžœžœžœ˜(šžœžœ˜Kšœ˜—šžœ˜šžœžœž˜