DIRECTORY RussellSyntax USING [TokType, GetRussellToken], RussellICode, IO USING [STREAM], Rope USING [ROPE], Convert USING [CharFromLiteral, RopeFromLiteral, IntFromRope], RefText USING [ObtainScratch, ReleaseScratch, line]; RussellParserImpl: CEDAR PROGRAM IMPORTS RussellSyntax, RefText, Convert EXPORTS RussellICode = BEGIN OPEN RussellICode ; ParseRussellExpression: PUBLIC PROCEDURE [source: IO.STREAM, errMsgProc: ErrMsgProc] RETURNS [ICExp] = BEGIN tokType: RussellSyntax.TokType; tokVal: REF ANY; nextTokType: RussellSyntax.TokType; nextTokVal: REF ANY; inputPos: INT _ 0; charsRead: INT; scanBuf: REF TEXT; answer: ICExp; Scan: PROCEDURE [] = BEGIN tokType _ nextTokType; tokVal _ nextTokVal; [tokType~nextTokType, tokVal~nextTokVal, charsRead~charsRead] _ RussellSyntax.GetRussellToken[source~source, buffer~scanBuf]; inputPos _ inputPos + charsRead END ; -- Scan LogError: PROCEDURE [errMsg: Rope.ROPE] = BEGIN errMsgProc[errPos~inputPos, errMsg~errMsg] END ; -- LogError Mandatory: PROCEDURE [typeWanted: RussellSyntax.TokType, errMsg: Rope.ROPE] = BEGIN IF tokType = typeWanted THEN Scan[] ELSE LogError[errMsg]; END ; -- Mandatory Optional: PROCEDURE [typeWanted: RussellSyntax.TokType] = BEGIN IF tokType = typeWanted THEN Scan[] END ; -- Optional ScanThrough: PROCEDURE [typeWanted: RussellSyntax.TokType, errMsg: Rope.ROPE] = BEGIN IF tokType # typeWanted THEN LogError[errMsg] ; WHILE (tokType # typeWanted) AND (tokType # tokEOF) DO Scan[] ENDLOOP ; IF tokType = tokEOF THEN LogError["unexpected EOF"] ELSE Scan[] END ; -- ScanThrough RequireAndRecoverTo: PROCEDURE [typeWanted: RussellSyntax.TokType, errMsg: Rope.ROPE, recoverProc: PROC[]] = BEGIN IF tokType # typeWanted THEN LogError[errMsg~errMsg] ; DO SELECT TRUE FROM tokType = tokEOF => { LogError["unexpected EOF"] ; EXIT } ; tokType = typeWanted => { Scan[]; EXIT } ; InFirstOfExp[] => recoverProc[] ; ENDCASE => Scan[] ; ENDLOOP END ; -- RequireAndRecoverTo RecoverExp: PROCEDURE [] = BEGIN [] _ ParseExp[] END ; -- RecoverExp RecoverBinding: PROCEDURE [] = BEGIN [] _ ParseBinding[nameRequired~FALSE] END ; -- RecoverBinding RecoverTyping: PROCEDURE [] = BEGIN [] _ ParseTyping[nameRequired~FALSE] END ; -- RecoverTyping RecoverGuardedExp: PROCEDURE [] = BEGIN [] _ ParseGuardedExp[] END ; -- RecoverGuardedExp InFirstOfExp: PROCEDURE [] RETURNS [BOOL] = BEGIN RETURN[ SELECT tokType FROM tokId, tokLParen, tokLTupleBrak, tokLRecTupleBrak, tokLBrak, tokKWfunc, tokKWproc, tokKWref, tokKWprod, tokKWunion, tokLUnionBrak, tokKWif, tokKWdo, tokKWopen, tokKWlambda, tokKWtype, tokKWsafetype, tokCharConst, tokStringConst, tokIntConst => TRUE , ENDCASE => FALSE ] END ; -- InFirstOfExp InFirstOfGuardedExp: PROCEDURE [] RETURNS [BOOL] = BEGIN RETURN[ SELECT tokType FROM tokId, tokLParen, tokLTupleBrak, tokLRecTupleBrak, tokLBrak, tokKWfunc, tokKWproc, tokKWref, tokKWprod, tokKWunion, tokLUnionBrak, tokKWif, tokKWdo, tokKWopen, tokKWlambda, tokKWtype, tokKWsafetype, tokCharConst, tokStringConst, tokIntConst => TRUE , ENDCASE => FALSE ] END ; -- InFirstOfGuardedExp InFirstOfBinding: PROCEDURE [nameRequired: BOOL] RETURNS [BOOL] = BEGIN IF nameRequired THEN RETURN[ tokType = tokId ]; RETURN[ SELECT tokType FROM tokId, tokLParen, tokLTupleBrak, tokLRecTupleBrak, tokLBrak, tokKWfunc, tokKWproc, tokKWref, tokKWprod, tokKWunion, tokLUnionBrak, tokKWif, tokKWdo, tokKWopen, tokKWlambda, tokKWtype, tokKWsafetype, tokCharConst, tokStringConst, tokIntConst => TRUE , ENDCASE => FALSE ] END ; -- InFirstOfBinding InFirstOfTyping: PROCEDURE [nameRequired: BOOL] RETURNS [BOOL] = BEGIN IF nameRequired THEN RETURN[ tokType = tokId ]; RETURN[ SELECT tokType FROM tokId, tokLParen, tokLTupleBrak, tokLRecTupleBrak, tokLBrak, tokKWfunc, tokKWproc, tokKWref, tokKWprod, tokKWunion, tokLUnionBrak, tokKWif, tokKWdo, tokKWopen, tokKWlambda, tokKWtype, tokKWsafetype, tokCharConst, tokStringConst, tokIntConst => TRUE , ENDCASE => FALSE ] END ; -- InFirstOfTyping ParseExp: PROCEDURE [] RETURNS [ICExp] = BEGIN tempICExp1, tempICExp2: ICExp; tempICExp1 _ ParseExp3[]; DO SELECT tokType FROM tokStmtSep => BEGIN Scan[]; IF NOT InFirstOfExp[] THEN EXIT ; tempICExp2 _ ParseExp3[]; tempICExp1 _ NEW[ SeqICNode _ [ leftPart~tempICExp1, rightPart~tempICExp2 ]] END ; ENDCASE => EXIT ; ENDLOOP ; RETURN[ tempICExp1 ] END ; -- ParseExp ParseExp3: PROCEDURE [] RETURNS [ICExp] = BEGIN tempICExp1, tempICExp2: ICExp; tempICExp1 _ ParseExp2[]; WHILE InFirstOfExp[] DO tempICExp2 _ ParseExp2[]; tempICExp1 _ NEW[ ApplyICNode _ [ proc~tempICExp1, arg~tempICExp2 ]] ENDLOOP ; RETURN[ tempICExp1 ] END ; -- ParseExp3 ParseExp2: PROCEDURE [] RETURNS [ICExp] = BEGIN tempICExp1, tempICExp2: ICExp; tempICExp1 _ ParseExp1[]; DO SELECT tokType FROM tokConcat => BEGIN Scan[]; tempICExp2 _ ParseExp1[]; tempICExp1 _ NEW[ ConcatICNode _ [ leftPart~tempICExp1, rightPart~tempICExp2 ]] END ; ENDCASE => EXIT ; ENDLOOP ; RETURN[ tempICExp1 ] END ; -- ParseExp2 ParseExp1: PROCEDURE [] RETURNS [ICExp] = BEGIN tempICExp: ICExp; tempICExp _ ParseExp0[]; DO SELECT tokType FROM tokSelect => BEGIN Scan[]; IF tokType = tokId THEN BEGIN tempICExp _ NEW[ SelectICNode _ [ tuple~tempICExp, name~NARROW[tokVal]]]; Scan[] END ELSE BEGIN LogError[errMsg~"expecting selector name"] END END ; ENDCASE => EXIT ; ENDLOOP ; RETURN[ tempICExp ] END ; -- ParseExp1 ParseExp0: PROCEDURE [] RETURNS [ICExp] = BEGIN tempICExp1, tempICExp2: ICExp; tempICBinding: ICBinding; tempICTyping: ICTyping; tempICGuardedExp: ICGuardedExp; SELECT tokType FROM tokLParen => BEGIN Scan[]; tempICExp1 _ ParseExp[]; RequireAndRecoverTo[typeWanted~tokRParen, errMsg~"expecting right paren", recoverProc~RecoverExp]; RETURN[ tempICExp1 ] END ; tokKWtuple, tokLTupleBrak, tokLRecTupleBrak => BEGIN localName: ATOM _ NIL; IF tokType = tokKWtuple THEN BEGIN Scan[]; IF tokType = tokId THEN BEGIN localName _ NARROW[ tokVal ]; Scan[]; END END ; SELECT tokType FROM tokLTupleBrak => BEGIN Scan[]; tempICBinding _ ParseBindings[nameRequired~FALSE]; tempICExp1 _ NEW[ MkTupleICNode _ [ bindings~tempICBinding, localName~localName]]; RequireAndRecoverTo[typeWanted~tokRTupleBrak, errMsg~"expecting right tuple bracket", recoverProc~RecoverBinding] END ; tokLRecTupleBrak => BEGIN Scan[]; tempICBinding _ ParseBindings[nameRequired~TRUE]; tempICExp1 _ NEW[ MkRecTupleICNode _ [ bindings~tempICBinding, localName~localName]]; RequireAndRecoverTo[typeWanted~tokRRecTupleBrak, errMsg~"expecting right recursive tuple bracket", recoverProc~RecoverBinding]; END ; ENDCASE => BEGIN LogError[ errMsg~"expecting left tuple bracket"]; tempICExp1 _ NIL END ; RETURN[ tempICExp1 ] END ; tokKWfunc, tokKWproc => BEGIN isFunc: BOOL _ (tokType = tokKWfunc); Scan[]; Mandatory[ typeWanted~tokLBrak, errMsg~"expecting left bracket"]; tempICTyping _ ParseTyping[nameRequired~FALSE]; Mandatory[typeWanted~tokFunctionArrow, errMsg~"expecting arrow"]; tempICExp1 _ ParseExp[]; IF isFunc THEN tempICExp2 _ NEW[ FuncICNode _ [param~tempICTyping, resultType~tempICExp1]] ELSE tempICExp2 _ NEW[ ProcICNode _ [param~tempICTyping, resultType~tempICExp1]]; ScanThrough[typeWanted~tokRBrak, errMsg~"expecting right bracket"]; RETURN[ tempICExp2 ] END ; tokKWprod, tokLBrak => BEGIN localName: ATOM _ NIL; IF tokType = tokKWprod THEN BEGIN Scan[]; IF tokType = tokId THEN BEGIN localName _ NARROW[ tokVal ]; Scan[] END END; Mandatory[ typeWanted~tokLBrak, errMsg~"expecting left bracket"]; tempICTyping _ ParseTypings[nameRequired~TRUE]; tempICExp1 _ NEW[ ProductICNode _ [components~tempICTyping] ]; RequireAndRecoverTo[typeWanted~tokRBrak, errMsg~"expecting right bracket", recoverProc~RecoverTyping]; RETURN[ tempICExp1 ] END ; tokKWunion, tokLUnionBrak => BEGIN brakTypeWanted: RussellSyntax.TokType; IF tokType = tokKWunion THEN BEGIN Scan[] END; SELECT tokType FROM tokLBrak => { brakTypeWanted _ tokRBrak; Scan[] } ; tokLUnionBrak => { brakTypeWanted _ tokRUnionBrak; Scan[] } ; ENDCASE => { LogError[ errMsg~"expecting left bracket"]; } ; tempICTyping _ ParseTypings[nameRequired~TRUE]; tempICExp1 _ NEW[ UnionICNode _ [components~tempICTyping] ]; RequireAndRecoverTo[typeWanted~brakTypeWanted, errMsg~"expecting right bracket", recoverProc~RecoverTyping]; RETURN[ tempICExp1 ] END ; tokKWref => BEGIN Scan[]; Mandatory[ typeWanted~tokLBrak, errMsg~"expecting left bracket"]; tempICExp1 _ ParseExp[]; tempICExp2 _ NEW[ RefICNode _ [referentType~tempICExp1] ]; RequireAndRecoverTo[typeWanted~tokRBrak, errMsg~"bad ref type", recoverProc~RecoverExp]; RETURN[ tempICExp2 ] END ; tokKWif => BEGIN Scan[]; tempICGuardedExp _ ParseGuardedExps[]; IF tokType = tokKWelse THEN BEGIN Scan[]; Optional[typeWanted~tokGuardArrow]; tempICExp1 _ ParseExp[] END ELSE BEGIN tempICExp1 _ NIL END ; tempICExp2 _ NEW[ CondICNode _ [thenClauses~tempICGuardedExp, elseExp~tempICExp1]]; RequireAndRecoverTo[typeWanted~tokKWfi, errMsg~"bad guarded exp list in conditional", recoverProc~RecoverGuardedExp]; RETURN[ tempICExp2 ] END ; tokKWdo => BEGIN Scan[]; tempICGuardedExp _ ParseGuardedExps[]; tempICExp1 _ NEW[ LoopICNode _ [loopClauses~tempICGuardedExp]]; RequireAndRecoverTo[typeWanted~tokKWod, errMsg~"bad guarded exp list in loop", recoverProc~RecoverGuardedExp]; RETURN[ tempICExp1 ] END ; tokKWopen => BEGIN Scan[]; tempICExp1 _ ParseExp[]; Mandatory[typeWanted~tokKWin, errMsg~"expecting in"]; tempICExp2 _ ParseExp[]; tempICExp2 _ NEW[ OpenICNode _ [tuple~tempICExp1, body~tempICExp2]]; RequireAndRecoverTo[typeWanted~tokKWni, errMsg~"bad open body", recoverProc~RecoverExp]; RETURN[ tempICExp2 ] END ; tokKWlambda => BEGIN Scan[]; tempICTyping _ ParseTyping[nameRequired~FALSE]; Mandatory[typeWanted~tokKWin, errMsg~"expecting in"]; tempICExp1 _ ParseExp[]; tempICExp2 _ NEW[ LambdaICNode _ [param~tempICTyping, body~tempICExp1] ]; RequireAndRecoverTo[typeWanted~tokKWni, errMsg~"bad function body", recoverProc~RecoverExp]; RETURN[ tempICExp2 ] END ; tokId => BEGIN tempICExp1 _ NEW[ IdICNode _ [name ~ NARROW[tokVal]]]; Scan[]; RETURN[ tempICExp1 ] END ; tokKWtype => BEGIN Scan[]; tempICExp1 _ NEW[ PrimConstICNode _ [which~$type]]; RETURN[ tempICExp1 ] END ; tokKWsafetype => BEGIN Scan[]; tempICExp1 _ NEW[ PrimConstICNode _ [which~$safetype]]; RETURN[ tempICExp1 ] END ; tokCharConst => BEGIN tempICExp1 _ NEW[ CharConstICNode _ [which ~ Convert.CharFromLiteral[r~NARROW[tokVal]]]]; Scan[]; RETURN[ tempICExp1 ] END ; tokStringConst => BEGIN tempICExp1 _ NEW[ StringConstICNode _ [which ~ Convert.RopeFromLiteral[r~NARROW[tokVal]]]]; Scan[]; RETURN[ tempICExp1 ] END ; tokIntConst => BEGIN tempICExp1 _ NEW[ IntConstICNode _ [which ~ Convert.IntFromRope[r~NARROW[tokVal]]]]; Scan[]; RETURN[ tempICExp1 ] END ; ENDCASE => BEGIN LogError[errMsg~"syntax error"]; RETURN[ NIL ] END ; END ; -- ParseExp0 ParseBindings: PROCEDURE [nameRequired: BOOL _ TRUE] RETURNS [ICBinding] = BEGIN tempICBinding: ICBinding _ NIL; tail: ICBinding _ NIL; p: ICBinding; DO IF NOT InFirstOfBinding[nameRequired~nameRequired] THEN RETURN[ tempICBinding ] ; p _ ParseBinding[nameRequired]; IF p = NIL THEN RETURN[ tempICBinding ] ; IF tail = NIL THEN tempICBinding _ p ELSE tail.next _ p; tail _ p; WHILE tokType = tokListSep DO Scan[] ENDLOOP ENDLOOP END ; -- ParseBindings ParseBinding: PROCEDURE [nameRequired: BOOL _ TRUE] RETURNS [ICBinding] = BEGIN tempName: ATOM _ NIL; tempType: ICExp _ NIL; tempValue: ICExp; tempICBinding: ICBinding; SELECT TRUE FROM (tokType = tokId) AND ((nextTokType = tokHasType) OR (nextTokType = tokIsBoundTo)) => BEGIN tempName _ NARROW[tokVal]; Scan[]; IF tokType = tokHasType THEN BEGIN Scan[]; tempType _ ParseExp[] END ; Mandatory[ typeWanted~tokIsBoundTo, errMsg~"expecting binding"] END ; nameRequired => BEGIN LogError[ errMsg~"require name in binding" ]; RETURN[ NIL ] END ENDCASE => NULL ; tempValue _ ParseExp[]; tempICBinding _ NEW[ BindingICNode _ [name~tempName, type~tempType, value~tempValue ]]; RETURN[ tempICBinding ] END ; -- ParseBinding ParseTypings: PROCEDURE [nameRequired: BOOL _ TRUE] RETURNS [ICTyping] = BEGIN tempICTyping: ICTyping _ NIL; tail: ICTyping _ NIL; p: ICTyping; DO IF NOT InFirstOfTyping[nameRequired~nameRequired] THEN RETURN[ tempICTyping ] ; p _ ParseTyping[nameRequired]; IF p = NIL THEN RETURN[ tempICTyping ] ; IF tail = NIL THEN tempICTyping _ p ELSE tail.next _ p; tail _ p; WHILE tokType = tokListSep DO Scan[] ENDLOOP ENDLOOP END ; -- ParseTypings ParseTyping: PROCEDURE [nameRequired: BOOL _ TRUE] RETURNS [ICTyping] = BEGIN tempName: ATOM; tempICExp: ICExp; tempICTyping: ICTyping; SELECT TRUE FROM (tokType = tokId) AND (nextTokType = tokHasType) => BEGIN tempName _ NARROW[tokVal]; Scan[]; Scan[]; END ; nameRequired => BEGIN LogError[ errMsg~"require name in typing" ]; RETURN[ NIL ] END ; ENDCASE => BEGIN tempName _ NIL END ; tempICExp _ ParseExp[]; tempICTyping _ NEW[ TypingICNode _ [name~tempName, type~tempICExp]]; RETURN[ tempICTyping ] END ; -- ParseTyping ParseGuardedExps: PROCEDURE [] RETURNS [ICGuardedExp] = BEGIN tempICGuardedExp: ICGuardedExp _ NIL; tail: ICGuardedExp _ NIL; p: ICGuardedExp; DO IF NOT InFirstOfGuardedExp[] THEN RETURN[ tempICGuardedExp ] ; p _ ParseGuardedExp[]; IF p = NIL THEN RETURN[ tempICGuardedExp ] ; IF tail = NIL THEN tempICGuardedExp _ p ELSE tail.next _ p; tail _ p; WHILE tokType = tokGuardedExpSep DO Scan[] ENDLOOP ENDLOOP END ; -- ParseGuardedExps ParseGuardedExp: PROCEDURE [] RETURNS [ICGuardedExp] = BEGIN tempName: ATOM; tempTuple: ICExp; tempResult: ICExp; tempICGuardedExp: ICGuardedExp; tempTuple _ ParseExp[]; Mandatory[ typeWanted~tokQuery, errMsg~"invalid guard"]; IF tokType = tokId THEN BEGIN tempName _ NARROW[tokVal]; Scan[] END ELSE BEGIN tempName _ NIL; LogError[ errMsg~"expecting selector name"]; END ; Mandatory[ typeWanted~tokGuardArrow, errMsg~"invalid guard"]; tempResult _ ParseExp[]; tempICGuardedExp _ NEW[ GuardedExpICNode _ [ tuple~tempTuple, name~tempName, result~tempResult]]; RETURN[ tempICGuardedExp ] END ; -- ParseGuardedExp scanBuf _ RefText.ObtainScratch[RefText.line]; Scan[]; Scan[]; answer _ ParseExp[]; RefText.ReleaseScratch[scanBuf]; RETURN[ answer ]; END ; -- ParseRussellExpression END . \RussellParserImpl.mesa This module is a parser for Russell 84. Last Edited by: Demers, March 7, 1984 9:53:30 am PST Exp ::= Exp { ; Exp }* -- Sequence, allow ; as terminator. Exp ::= Exp { Exp }* -- Application, left-associative. Exp ::= Exp { | Exp }* -- Tuple concatentation. Exp ::= Exp { . Id }? -- Selection. Exp ::= ... -- All the other cases, see below. Exp ::= ( Exp ) -- Parenthesized expression. Exp ::= tuple Id < BindingSeq > -- Tuple formation. Exp ::= tuple Id <* BindingSeq *> -- Recursive tuple formation. Exp ::= func[ Id: Exp -> Exp ] -- Function type. Exp ::= proc[ Id: Exp -> Exp ] -- Procedure type. Exp ::= prod Id [ TypingSequence ] -- Product type with local name. Exp ::= prod [ TypingSequence ] -- Product type without local name. Exp ::= [ TypingSequence ] -- Product type without local name. Exp ::= union [ TypingSequence ] Exp ::= union { TypingSequence } Exp ::= { TypingSequence } -- Union type constructor. Exp ::= ref [ Exp ] -- Reference type constructor. Exp ::= if GuardedExpSeq fi -- Conditional. Exp ::= do GuardedExpSeq od -- Loop. Exp ::= open Exp in Exp ni -- Block. Κε˜head1™Ibodyšœ'™'L™4unitšΟk ˜ Icodešœœ˜/Nšœ ˜ Nšœœœ˜Nšœœœ˜Nšœœ0˜>Nšœœ'˜4—šΟnœ ˜ Nšœ ˜'Nšœ ˜šœ˜Nšœ˜š žœœ œœœ˜dšœ˜Mšœ˜Nšœœœ˜Nšœ#˜#Nšœ œœ˜Nšœ œ˜Nšœ œ˜Nšœ œœ˜Nšœ˜šžœ œ˜šœ˜N˜Nšœ˜šœ=˜=Nšœ?˜?—Nšœ˜NšœΟc˜ ——šžœ œœ˜'šœ˜Nšœ*˜*NšœŸ ˜——šž œ œ2œ˜Kšœ˜šœ˜Nšœ˜ Nšœ˜—NšœŸ ˜——šžœ œ$˜7šœ˜šœ˜Nšœ˜ —NšœŸ ˜——šž œ œ2œ˜Mšœ˜šœ˜Nšœ˜—šœœ˜6N˜Nš ˜ —šœ˜Nšœ˜Nšœ˜ —NšœŸ˜——šžœ œ2œœ˜jšœ˜šœ˜Nšœ˜—š˜šœœ˜šœ˜Nšœœ˜%—šœ˜Nšœœ˜—šœ˜Nšœ˜—šœ˜ Nšœ˜——Nš˜—NšœŸ˜——šž œ œ˜šœ˜Jšœ˜NšœŸ ˜——šžœ œ˜šœ˜Jšœœ˜%NšœŸ˜——šž œ œ˜šœ˜Jšœœ˜$NšœŸ˜——šžœ œ˜šœ˜Jšœ˜NšœŸ˜——šž œ œœœ˜)šœ˜šœ ˜Nšœτœ˜ϊNšœ˜—NšœŸ˜——šžœ œœœ˜0šœ˜šœ ˜Nšœτœ˜ϊNšœ˜—NšœŸ˜——š žœ œœœœ˜?šœ˜šœ ˜Nšœœ˜—šœ ˜Nšœτœ˜ϊNšœ˜—NšœŸ˜——š žœ œœœœ˜>šœ˜šœ ˜Nšœœ˜—šœ ˜Nšœτœ˜ϊNšœ˜—NšœŸ˜——šžœ œœ˜&N™:šœ˜Nšœ˜Mšœ˜š˜šœ ˜šœ˜N˜Nšœœœœ˜!Nšœ˜Nšœ œ<˜LNšœ˜—Nšœœ˜—Nš ˜ —Nšœ˜NšœŸ ˜——šž œ œœ˜'NšœŸ!™6šœ˜Nšœ˜Mšœ˜šœ˜Nšœ˜Nšœ œ4˜DNš ˜ —Nšœ˜NšœŸ ˜——šž œ œœ˜'N™/šœ˜Nšœ˜Mšœ˜š˜šœ ˜šœ ˜N˜Nšœ˜Nšœ œ?˜ONšœ˜—Nšœ˜—Nš ˜ —Nšœ˜NšœŸ ˜——šž œ œœ˜'NšœŸ ™#šœ˜Nšœ˜Mšœ˜š˜šœ ˜šœ ˜N˜šœ˜šœ˜ Nšœ œ)œ ˜IN˜Nš˜—š ˜ Nšœ*˜*Nš˜——Nšœ˜—Nšœ˜—Nš ˜ —Nšœ ˜NšœŸ ˜——šž œ œœ˜'N™/šœ˜N˜Nšœ˜Nšœ˜Nšœ˜šœ ˜šœ ˜N™,N˜N˜Nšœb˜bNšœ˜Nšœ˜—šœ/˜4N™3N™?Nšœ œœ˜šœœ˜"N˜šœ ˜Nšœ œ ˜N˜Nš˜—Nš˜—šœ ˜šœ˜N˜Nšœ+œ˜2šœ œ˜Nšœ2˜2—Nšœq˜qNš˜—šœ˜N˜Nšœ+œ˜1šœ œ˜"Nšœ2˜2—Nšœ˜Nšœ˜—šœ˜N˜1Nšœ ˜Nšœ˜——Nšœ˜Nšœ˜—šœ˜N™0N™1Nšœœ˜%N˜NšœA˜ANšœ(œ˜/NšœA˜ANšœ˜šœ˜ Nšœœ;˜PNšœœ<˜Q—N˜CNšœ˜Nšœ˜—šœ˜N™CN™CN™>Nšœ œœ˜šœœ˜!Nšœ˜šœ ˜Nšœ œ ˜Jšœ˜Jš˜—Nšœ˜—NšœA˜ANšœ)œ˜/Nšœ œ.˜>Nšœf˜fNšœ˜Nšœ˜—šœ˜"N™ N™ N™5Nšœ&˜&šœœ˜"Nšœ˜Nšœ˜—šœ ˜šœ ˜ Nšœ'˜'—šœ˜Nšœ,˜,—šœ˜ Nšœ1˜1——Nšœ)œ˜/Nšœ œ,˜