DIRECTORY Atom USING [GetPropFromList, PutPropOnList], Carets USING [ResumeCarets, SuspendCarets], Cursors USING [InvertCursor], InputFocus USING [GetInputFocus, SetInputFocus], Process USING [GetPriority, Priority, priorityForeground, SetPriority], RefTab USING [Create, Fetch, Ref, Store], Rope USING [Compare, ROPE], RTOS USING [GetCurrent, RegisterCedarProcess, UnregisterCedarProcess], TIPUser USING [TIPScreenCoords], ViewerEvents USING [ProcessEvent], ViewerOps, ViewerLocks, MenusPrivate USING [ViewerMenus], ViewerClasses, ViewerSpecs, WindowManager USING [colorDisplayOn], WindowManagerPrivate; ViewerOpsImplB: CEDAR PROGRAM IMPORTS Atom, Carets, Cursors, InputFocus, Process, RefTab, Rope, RTOS, ViewerEvents, ViewerLocks, ViewerOps, WindowManager, WindowManagerPrivate EXPORTS ViewerOps SHARES ViewerEvents = BEGIN OPEN ViewerClasses, ViewerSpecs, ViewerOps; classTable: RefTab.Ref _ RefTab.Create[mod:50]; -- hold viewer classes RegisterViewerClass: PUBLIC PROC [flavor: ViewerFlavor, class: ViewerClass, superClassFlavor: ViewerFlavor _ NIL] = { class.flavor _ flavor; IF superClassFlavor#NIL THEN { superClass: ViewerClass = FetchViewerClass[superClassFlavor]; class.parent _ superClass; IF class.notify=NIL THEN class.notify _ superClass.notify; IF class.paint=NIL THEN class.paint _ superClass.paint; IF class.modify=NIL THEN class.modify _ superClass.modify; IF class.destroy=NIL THEN class.destroy _ superClass.destroy; IF class.copy=NIL THEN class.copy _ superClass.copy; IF class.set=NIL THEN class.set _ superClass.set; IF class.get=NIL THEN class.get _ superClass.get; IF class.save=NIL THEN class.save _ superClass.save; IF class.scroll=NIL THEN class.scroll _ superClass.scroll; IF class.hscroll=NIL THEN class.hscroll _ superClass.hscroll; IF class.caption=NIL THEN class.caption _ superClass.caption; }; [] _ RefTab.Store[classTable, flavor, class] }; FetchViewerClass: PUBLIC PROC [flavor: ViewerFlavor] RETURNS [ViewerClass] = {IF flavor = $TypeScript THEN flavor _ $Typescript; RETURN[NARROW[RefTab.Fetch[classTable, flavor].val]]}; IsClass: PUBLIC PROC [viewer: Viewer, class: ViewerFlavor] RETURNS[BOOL] = { flavor: ViewerFlavor = class; -- should change the parameter name to flavor FOR class: ViewerClass _ viewer.class, class.parent UNTIL class=NIL DO IF class.flavor=flavor THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]; }; EnumerateViewers: PUBLIC PROC [enum: EnumProc] = { FOR c: Column DECREASING IN Column DO -- decreasing so will try static viewers last v: Viewer _ WindowManagerPrivate.rootViewerTree[c]; next: Viewer; UNTIL v=NIL DO next _ v.sibling; IF ~enum[v] THEN RETURN; v _ next; ENDLOOP; ENDLOOP; }; EnumerateChildren: PUBLIC PROC [viewer: Viewer, enum: EnumProc] = { v: Viewer _ viewer.child; next: Viewer; WHILE v#NIL DO next _ v.sibling; EnumerateChildren[v, enum]; IF ~enum[v] THEN RETURN; v _ next; ENDLOOP; }; FindViewer: PUBLIC PROC [name: Rope.ROPE] RETURNS [viewer: Viewer] = { MatchName: EnumProc = { IF Rope.Compare[name, v.name, FALSE]=equal THEN { viewer _ v; RETURN[FALSE]; } ELSE RETURN[TRUE]; }; EnumerateViewers[MatchName]; }; SaveViewer: PUBLIC PROC [viewer: Viewer] = { list: LIST OF Viewer; ok: BOOL _ FALSE; LockedStart: PROC = { FOR v: Viewer _ viewer, v.link DO v.saveInProgress _ TRUE; PaintViewer[v, caption, FALSE]; list _ CONS[v, list]; IF v.link = NIL OR v.link = viewer THEN EXIT; ENDLOOP}; LockedStop: PROC = { FOR saved: LIST OF Viewer _ list, saved.rest UNTIL saved = NIL DO v: Viewer = saved.first; IF v.destroyed THEN LOOP; v.saveInProgress _ FALSE; IF ok THEN v.newVersion _ v.newFile _ FALSE; PaintViewer[v, caption, FALSE]; [] _ ViewerEvents.ProcessEvent[save, v, FALSE]; ENDLOOP}; FOR v: Viewer _ viewer, v.link DO IF ViewerEvents.ProcessEvent[save, v, TRUE].abort THEN RETURN; IF v.link = NIL OR v.link = viewer THEN EXIT; ENDLOOP; LockedStart[]; IF viewer.class.save#NIL THEN ok _ viewer.class.save[viewer]; LockedStop[]; }; RestoreViewer: PUBLIC PROC [viewer: Viewer] = { DoOne: PROC [v: Viewer] = INLINE { KillInputFocus[v]; IF v.class.init # NIL THEN v.class.init[v]; v.newVersion _ v.newFile _ FALSE; PaintViewer[v, all]; }; DoOne[viewer]; IF viewer.link#NIL THEN FOR v: Viewer _ viewer.link, v.link UNTIL v=viewer DO DoOne[v]; ENDLOOP; }; KillInputFocus: PROC [viewer: Viewer] = { focus: Viewer _ InputFocus.GetInputFocus[].owner; WHILE focus # NIL DO IF focus # viewer THEN focus _ focus.parent ELSE {InputFocus.SetInputFocus[]; EXIT}; ENDLOOP; }; IndicateNewVersion: PUBLIC PROC [viewer: Viewer] = { link1, link2: Viewer; LockedNewVersion: PROC = { FOR v: Viewer _ viewer, v.link DO v.newVersion _ TRUE; PaintViewer[v, caption]; [] _ ViewerEvents.ProcessEvent[edit, v, FALSE]; IF v.link = NIL OR v.link = viewer THEN EXIT; ENDLOOP}; FOR v: Viewer _ viewer, v.link DO IF ViewerEvents.ProcessEvent[edit, v, TRUE].abort THEN RETURN; IF v.link = NIL OR v.link = viewer THEN EXIT; ENDLOOP; IF viewer # NIL THEN link1 _ viewer.link; IF link1 # NIL THEN link2 _ link1.link; ViewerLocks.CallUnderReadLocks[LockedNewVersion, viewer, link1, link2]; }; SetNewFile: PUBLIC PROC [viewer: Viewer] = { DoOne: PROC [v: Viewer] = { v.newFile _ TRUE; PaintViewer[v, caption]; }; DoOne[viewer]; IF viewer.link#NIL THEN FOR v: Viewer _ viewer.link, v.link UNTIL v=viewer DO DoOne[v]; ENDLOOP; }; SetOpenHeight: PUBLIC PROC [viewer: Viewer, clientHeight: INTEGER] = { overhead: INTEGER _ captionHeight + (IF viewer.border THEN windowBorderSize ELSE 0); IF viewer.menus#NIL THEN overhead _ overhead+NARROW[viewer.menus, MenusPrivate.ViewerMenus].h+menuBarHeight; viewer.openHeight _ clientHeight+overhead; }; SaveAllEdits: PUBLIC PROC = { old: Process.Priority = Process.GetPriority[]; Save: EnumProc = { Cursors.InvertCursor[]; IF (v.newVersion OR v.newFile) AND v.class.save # NIL THEN [] _ v.class.save[v, TRUE ! ANY => CONTINUE]; v.newVersion _ v.newFile _ FALSE; IF v.icon=dirtyDocument THEN v.icon _ document; IF v.link#NIL THEN FOR t: Viewer _ v.link, t.link UNTIL t=v DO t.newVersion _ t.newFile _ FALSE; ENDLOOP; Cursors.InvertCursor[]; RETURN[TRUE]; }; IF old>Process.priorityForeground THEN TRUSTED { -- called from CoPilot Process.SetPriority[Process.priorityForeground]; RTOS.RegisterCedarProcess[RTOS.GetCurrent[]]; }; EnumerateViewers[Save]; IF old>Process.priorityForeground THEN TRUSTED { -- called from CoPilot RTOS.UnregisterCedarProcess[RTOS.GetCurrent[]]; Process.SetPriority[old]; }; }; PaintEverything: PUBLIC PROC = { OPEN Process; ResetPaintCache[]; Carets.SuspendCarets[]; GreyScreen[0, 0, 9999, 9999, FALSE, FALSE]; ComputeColumn[static]; ComputeColumn[left]; ComputeColumn[right]; IF WindowManager.colorDisplayOn THEN ComputeColumn[color]; WaitForPaintingToFinish[]; Carets.ResumeCarets[]; }; UserToScreenCoords: PUBLIC PROC[self: Viewer, vx, vy: INTEGER _ 0] RETURNS[sx, sy: INTEGER] = { UNTIL self=NIL DO -- compute enclosing viewer offsets vx _ vx + self.cx; vy _ vy + self.cy; self _ self.parent; ENDLOOP; RETURN [vx, vy]; }; Display: TYPE = {default, color}; MouseInViewer: PUBLIC PROC[tsc: TIPUser.TIPScreenCoords] RETURNS[viewer: Viewer _ NIL, client: BOOL _ FALSE] = { ENABLE UNWIND => NULL; TopLevelHit: PROC[x, y: INTEGER, d: Display] RETURNS[Viewer] = { FOR column: Column DECREASING IN Column DO head: Viewer = WindowManagerPrivate.rootViewerTree[column]; -- head of column list FOR v: Viewer _ head, v.sibling UNTIL v=NIL DO vd: Display = (IF v.column=color AND NOT v.iconic THEN color ELSE default); IF d=vd AND x IN[v.wx..v.wx+v.ww) AND y IN[v.wy..v.wy+v.wh) THEN RETURN[v]; ENDLOOP; ENDLOOP; RETURN[NIL]; }; Client: PROC[v: Viewer, x, y: INTEGER] RETURNS [BOOL] = INLINE { RETURN[y IN [v.cy..v.cy+v.ch) AND x IN [v.cx..v.cx+v.cw)] }; ChildHit: PROC[parent: Viewer, x, y: INTEGER] RETURNS[Viewer] = { FOR v: Viewer _ parent.child, v.sibling UNTIL v=NIL DO IF x IN[v.wx..v.wx+v.ww) AND y IN[v.wy..v.wy+v.wh) THEN RETURN[v]; ENDLOOP; RETURN[NIL]; }; x: INTEGER _ tsc.mouseX; y: INTEGER _ tsc.mouseY; viewer _ TopLevelHit[x, y, (IF tsc.color THEN color ELSE default)]; IF viewer=NIL THEN RETURN[NIL, FALSE]; WHILE (client _ Client[viewer, x, y]) AND NOT viewer.iconic AND viewer.child#NIL DO ex: INTEGER = x-viewer.cx; ey: INTEGER = y-viewer.cy; child: Viewer = ChildHit[viewer, ex, ey]; IF child=NIL THEN EXIT; viewer _ child; x _ ex; y _ ey; ENDLOOP; IF client THEN { tsc.mouseX _ x-viewer.cx; tsc.mouseY _ y-viewer.cy } ELSE { tsc.mouseX _ x-viewer.wx; tsc.mouseY _ y-viewer.wy }; }; AddProp: PUBLIC PROC [viewer: Viewer, prop: ATOM, val: REF ANY] = { viewer.props _ Atom.PutPropOnList[viewer.props, prop, val]} ; FetchProp: PUBLIC PROC [viewer: Viewer, prop: ATOM] RETURNS [val: REF ANY] = { RETURN[Atom.GetPropFromList[viewer.props, prop]]} ; END. &ViewerOpsImplB.mesa; Written by Maxwell Edited by Maxwell, May 18, 1983 9:19 am Last Edited by: Pausch, August 17, 1983 12:01 pm Last Edited by: Wyatt, October 24, 1983 10:27 am let the Viewer package know about a new class of viewer. class information from an existing viewer class. Safe in that caller can move the enumerated viewer in the tree in which case all viewers get seen at least once Not called under locks so viewers can be saved when the column is locked. poor man's crash recovery OldUserToScreenCoords: PUBLIC PROC [self: Viewer, vx, vy: INTEGER _ 0] RETURNS [sx, sy: INTEGER] = { invert: BOOL; UNTIL self=NIL DO -- compute enclosing viewer offsets invert _ IF self.parent=NIL THEN self.class.coordSys=top ELSE self.class.coordSys#self.parent.class.coordSys; vx _ vx + self.cx; IF invert THEN vy _ Top2Bottom[self, vy]; vy _ vy + self.cy; self _ self.parent; ENDLOOP; RETURN [vx, vy]; }; OldMouseInViewer: PUBLIC PROC [tsc: TIPUser.TIPScreenCoords] RETURNS [viewer: Viewer, client: BOOL] = { ENABLE UNWIND => NULL; x: INTEGER _ tsc.mouseX; y: INTEGER _ tsc.mouseY; invert: BOOL; TopLevelHit: PROC RETURNS [Viewer] = { FOR c: Column DECREASING IN Column DO FOR v: Viewer _ WindowManagerPrivate.rootViewerTree[c], v.sibling UNTIL v=NIL DO IF ViewerHit[v] THEN RETURN[v]; ENDLOOP; REPEAT FINISHED => RETURN[NIL]; ENDLOOP; }; ViewerHit: PROC [v: Viewer] RETURNS [BOOL] = INLINE {RETURN[x IN [v.wx..v.wx+v.ww) AND y IN [v.wy..v.wy+v.wh) AND (IF tsc.color THEN (v.column=color AND ~v.iconic) ELSE (v.column#color OR v.iconic))]}; Client: PROC RETURNS [BOOL] = INLINE {RETURN[y IN [viewer.cy..viewer.cy+viewer.ch) AND x IN [viewer.cx..viewer.cx+viewer.cw)]}; CheckViewersChildren: PROC [v: Viewer] RETURNS [BOOL] = { ex, ey: INTEGER; EmbeddedViewerHit: PROC [v: Viewer] RETURNS [BOOL] = INLINE {RETURN[ex IN [v.wx..v.wx+v.ww) AND ey IN [v.wy..v.wy+v.wh)]}; ex _ x - v.cx; ey _ y - v.cy; invert _ IF v.parent=NIL THEN v.class.coordSys=top ELSE v.class.coordSys#v.parent.class.coordSys; IF invert THEN ey _ Bottom2Top[v, ey]; FOR v _ v.child, v.sibling UNTIL v=NIL DO IF EmbeddedViewerHit[v] THEN { embedded frames are client info relative x _ ex; y _ ey; viewer _ v; RETURN[TRUE]; }; ENDLOOP; RETURN[FALSE]; }; IF (viewer _ TopLevelHit[]) = NIL THEN RETURN [NIL, FALSE]; IF viewer.child#NIL AND ~viewer.iconic AND Client[] THEN WHILE viewer.child#NIL AND CheckViewersChildren[viewer] DO ENDLOOP; client _ Client[]; invert _ IF viewer.parent=NIL THEN client AND viewer.class.coordSys=top ELSE viewer.class.coordSys#viewer.parent.class.coordSys; overwrite screen coords record tsc.mouseX _ x - (IF client THEN viewer.cx ELSE viewer.wx); y _ y - (IF client THEN viewer.cy ELSE viewer.wy); tsc.mouseY _ IF ~invert THEN y ELSE IF client THEN Top2Bottom[viewer, y] ELSE viewer.wh-y; }; MouseInViewer: PUBLIC PROC[tsc: TIPUser.TIPScreenCoords] RETURNS[viewer: Viewer _ NIL, client: BOOL _ FALSE] = { ENABLE UNWIND => NULL; TopLevelHit: PROC[x, y: INTEGER, display: Display] RETURNS[Viewer] = { FOR column: Column DECREASING IN Column DO head: Viewer = WindowManagerPrivate.rootViewerTree[column]; -- head of column list FOR v: Viewer _ head, v.sibling UNTIL v=NIL DO viewerDisplay: Display = (IF v.column=color AND NOT v.iconic THEN color ELSE default); IF display=viewerDisplay AND x IN [v.wx..v.wx+v.ww) AND y IN [v.wy..v.wy+v.wh) THEN RETURN[v]; ENDLOOP; ENDLOOP; RETURN[NIL]; }; Client: PROC[v: Viewer, x, y: INTEGER] RETURNS [BOOL] = INLINE { RETURN[y IN [v.cy..v.cy+v.ch) AND x IN [v.cx..v.cx+v.cw)] }; ChildHit: PROC[parent: Viewer, x, y: INTEGER] RETURNS[Viewer] = { FOR v: Viewer _ parent.child, v.sibling UNTIL v=NIL DO IF x IN[v.wx..v.wx+v.ww) AND y IN[v.wy..v.wy+v.wh) THEN RETURN[v]; ENDLOOP; RETURN[NIL]; }; x: INTEGER _ tsc.mouseX; y: INTEGER _ tsc.mouseY; parentCoordSys: CoordSys _ bottom; viewer _ TopLevelHit[x, y, (IF tsc.color THEN color ELSE default)]; IF viewer=NIL THEN RETURN[NIL, FALSE]; WHILE (client _ Client[viewer, x, y]) AND NOT viewer.iconic AND viewer.child#NIL DO embedded viewers are relative to client area of parent coordSys: CoordSys = viewer.class.coordSys; ex: INTEGER = x-viewer.cx; ey: INTEGER = IF coordSys=parentCoordSys THEN y-viewer.cy ELSE viewer.ch-(y-viewer.cy); child: Viewer = ChildHit[viewer, ex, ey]; IF child=NIL THEN EXIT; viewer _ child; x _ ex; y _ ey; parentCoordSys _ coordSys; ENDLOOP; Overwrite screen coords record (Yecchh!  DKW) { invert: BOOL = IF viewer.parent=NIL THEN client AND viewer.class.coordSys=top ELSE viewer.class.coordSys#viewer.parent.class.coordSys; tsc.mouseX _ x - (IF client THEN viewer.cx ELSE viewer.wx); y _ y - (IF client THEN viewer.cy ELSE viewer.wy); tsc.mouseY _ IF ~invert THEN y ELSE IF client THEN viewer.ch-y ELSE viewer.wh-y; }; }; embedded viewers are relative to client area of parent Overwrite screen coords record (Yecchh!  DKW) Associate a property with a viewer Get back a property associated with a viewer SetMenu: PUBLIC PROC [viewer: Viewer, menu: Menus.Menu, paint: BOOL _ TRUE] = { sameSize: BOOL = (menu#NIL AND viewer.menu#NIL AND viewer.menu.linesUsed=menu.linesUsed); IF viewer.iconic THEN paint _ FALSE; IF viewer.parent#NIL THEN ERROR; viewer.menu _ IF menu=NIL THEN NIL ELSE Menus.CopyMenu[menu]; IF ~sameSize AND paint THEN EstablishViewerPosition[viewer, viewer.wx, viewer.wy, viewer.ww, viewer.wh]; IF paint THEN PaintViewer[viewer, IF sameSize THEN menu ELSE all]; }; ΚΨ– "cedar" style˜JšΟc'™'J™'J™0J™0J™šΟk ˜ Jšœžœ"˜,Jšœžœ˜+Jšœžœ˜Jšœ žœ ˜0Jšœžœ:˜GJšœžœ˜)Jšœžœ žœ˜Jšžœžœ<˜FJšœžœ˜ Jšœ žœ˜"J˜ J˜ Jšœ žœ˜!J˜J˜ Jšœžœ˜%J˜J˜—Jšœž ˜Jšžœ;žœK˜‘Jšžœ ˜Jšžœ ˜Jšœžœžœ'˜3J˜šœ0˜GJ˜—šΟnœžœžœ+˜KJšœ!žœ˜)Jš8™8J˜šžœžœžœ˜Jšœ=˜=J˜Jšžœžœžœ"˜:Jšžœ žœžœ ˜7Jšžœžœžœ"˜:Jšžœžœžœ$˜=Jšžœ žœžœ˜4Jšžœ žœžœ˜1Jšžœ žœžœ˜1Jšžœ žœžœ˜4Jšžœžœžœ"˜:Jšžœžœžœ$˜=Jšžœžœžœ$˜=J˜—J˜,J˜J˜—šŸœžœžœžœ˜LJšœžœžœ˜3Jšžœžœ)˜6Jš0™0—J™š Ÿœžœžœ'žœžœ˜LJšœ-˜Kšžœ1žœžœž˜FJšžœžœžœžœ˜)Jšžœ˜—Jšžœžœ˜J˜J˜—šŸœžœžœ˜2Jšo™oš žœ ž œžœžœ-˜SJšœ3˜3J˜ šžœžœž˜J˜Jšžœ žœžœ˜J˜ Jšžœ˜—Jšžœ˜—Jšœ˜J˜—šŸœžœžœ%˜CJ˜Jšœ ž˜ šžœžœž˜J˜J˜Jšžœ žœžœ˜J˜ Jšžœ˜—Jšœ˜J˜—š Ÿ œžœžœ žœžœ˜Fšœ˜šžœžœžœ˜1J˜ 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šœI™IJšœ˜Jšžœžœžœ ˜=Jšœ ˜ J˜Jšœ˜J˜—šŸ œžœžœ˜/šŸœžœžœ˜"Jšœ˜Jšžœžœžœ˜+Jšœžœ˜!J˜Jšœ˜—J˜šžœ žœž˜Jšžœ!žœ žœ žœ˜H—Jšœ˜J˜—šŸœžœ˜)Jšœ1˜1šžœ žœž˜šžœžœ˜+Jšžœžœ˜(—Jšžœ˜—Jšœ˜—J˜šŸœžœžœ˜4J˜šŸœžœ˜šžœž˜!Jšœžœ˜J˜Jšœ(žœ˜/Jš žœ žœžœžœžœ˜-Jšžœ˜ —J˜—šžœž˜!Jšžœ$žœžœžœ˜>Jš žœ žœžœžœžœ˜-Jšžœ˜—J˜Jšžœ žœžœ˜)Jšžœ žœžœ˜'J˜JšœG˜GJšœ˜J˜—šŸ œžœžœ˜,šŸœžœ˜Jšœ žœ˜J˜Jšœ˜—J˜šžœ žœž˜Jšžœ!žœ žœ žœ˜H—Jšœ˜J˜—šŸ œžœžœ žœ˜FJš œ žœžœžœžœ˜Tšžœžœžœ ˜#Jšœ žœ9˜H—J˜*Jšœ˜—J˜šŸ œžœžœ˜Jš™J˜.šœ˜J˜šžœžœ žœž˜5Jšžœžœžœžœ˜2—Jšœžœ˜!Jšžœžœ˜/š žœžœžœžœžœž˜>Jšœžœ˜!Jšžœ˜—J˜Jšžœžœ˜ Jšœ˜—šžœ žœžœ˜GJšœ0˜0Jšžœžœ˜-Jšœ˜—J˜šžœ žœžœ˜GJšžœžœ˜/Jšœ˜Jšœ˜—Jšœ˜J˜—šŸœžœžœžœ ˜.J˜J˜Jšœžœžœ˜+Jšœ˜J˜J˜Jšžœžœ˜:J˜J˜Jšœ˜J˜—šŸœžœžœžœ™FJšžœ žœ™Jšœžœ™ šžœžœžœ#™5šœ žœ žœžœ™8Jšžœ0™4—J™Jšžœžœ™)J™J™Jšžœ™—Jšžœ ™Jšœ™J™—šŸœžœžœžœ˜BJšžœ žœ˜šžœžœžœ#˜5J˜J˜J˜Jšžœ˜—Jšžœ ˜Jšœ˜J˜—šŸœžœžœ™J™—J™J™šœ žœ žœžœ™2Jšžœ*™.—Jšžœžœ™&J™šžœžœžœž™)šžœžœ™Jš(™(J™J™J™ Jšžœžœ™ Jšœ™—Jšžœ™—Jšžœžœ™Jšœ™J™—Jš žœžœžœžœžœžœ™;J™š žœžœžœžœ žœžœž™OJšžœžœžœ™,J™—J™š œ žœžœžœžœ™GJšžœ4™8J™—Jš™Jšœžœžœ žœ ™;Jšœ žœžœ žœ ™2Jš œ žœ žœžœžœžœžœ ™ZJ™Jšœ™J™—Jšœ žœ˜!J™šŸ œžœžœ™8Jšžœžœ žœžœ™7Jšžœžœžœ™šŸ œžœžœžœ ™Fšžœž œžœž™*Jšœ<™Ršžœžœžœž™.Jš œžœžœžœ žœžœ ™VJšžœ™Jš žœžœžœžœžœžœ™EJšžœ™—Jšžœ™—Jšžœžœ™ J™—š Ÿœžœžœžœžœžœ™@Jšžœžœžœžœ™<—šŸœžœžœžœ ™Ašžœ%žœžœž™6Jš žœžœžœžœžœžœ™BJšžœ™—Jšžœžœ™ J™—Jšœžœ™Jšœžœ™Jšœ"™"Jšœžœ žœžœ ™CJš žœžœžœžœžœžœ™&š žœ!žœžœžœžœž™SJš6™6Jšœ+™+Jšœžœ™šœžœžœžœ ™9Jšžœ™—J™)Jšžœžœžœžœ™Jšœ™Jšœ™Jšžœ™—J™Jš.™.š œ žœžœžœžœžœ™OJšžœ4™8Jšœžœžœ žœ ™;Jšœ žœžœ žœ ™2šœ žœ žœ™Jšžœžœžœ ™Jšžœ ™—J™—Jšœ™J™—šŸ œžœžœ˜8Jšžœžœ žœžœ˜7Jšžœžœžœ˜šŸ œžœžœžœ ˜@šžœž œžœž˜*Jšœ<˜Ršžœžœžœž˜.Jš œžœžœžœ žœžœ ˜KJšžœžœžœžœžœžœžœ˜KJšžœ˜—Jšžœ˜—Jšžœžœ˜ J˜—š Ÿœžœžœžœžœžœ˜@Jšžœžœžœžœ˜9Jšœ˜—šŸœžœžœžœ ˜Ašžœ%žœžœž˜6Jš žœžœžœžœžœžœ˜BJšžœ˜—Jšžœžœ˜ J˜—Jšœžœ˜Jšœžœ˜Jšœžœ žœžœ ˜CJš žœžœžœžœžœžœ˜&š žœ!žœžœžœžœž˜SJš6™6Jšœžœ˜Jšœžœ˜J˜)Jšžœžœžœžœ˜Jšœ˜Jšžœ˜—J˜Jš.™.Jšžœžœ7˜EJšžœ8˜