DIRECTORY ARAccess USING [AppendChar], Ascii USING [CR, LF, NUL, SP, TAB], Convert USING [CardFromRope, Error], Rope USING [Fetch, Length, ROPE], Token; TokensA: CEDAR MONITOR IMPORTS ARAccess, Convert, --Heap, Inline, --Rope--, String, StringLookUp --EXPORTS Token = BEGIN OPEN Ascii; UnterminatedQuote: PUBLIC SIGNAL = CODE; FilterState: TYPE = Token.FilterState; StandardFilterState: TYPE = Token.StandardFilterState; FilterProcType: TYPE = Token.FilterProcType; GetCharProcType: TYPE = Token.GetCharProcType; QuoteProcType: TYPE = Token.QuoteProcType; SkipMode: TYPE = Token.SkipMode; nonQuote: CHARACTER = Token.nonQuote; initialLength: CARDINAL = 100; --initial length for Token strings lengthIncrement: CARDINAL = 100; --amount of additional storage to allocate savedString: Rope.ROPE ¬ NIL; -- keep one string of length initialLength GetString: ENTRY PROC [length: CARDINAL] RETURNS [Rope.ROPE] = { ENABLE UNWIND => NULL; IF length = initialLength AND savedString # NIL THEN { ls: Rope.ROPE ¬ savedString; savedString ¬ NIL; ls ¬ NIL; RETURN[ls]}; RETURN[NIL--Heap.systemZone.NEW[StringBody[length]]--]}; FreeString: ENTRY PROC [ls: Rope.ROPE] = { ENABLE UNWIND => NULL; IF ls # NIL --AND ls.maxlength = initialLength-- AND savedString = NIL THEN { savedString ¬ ls; RETURN}; --Heap.systemZone.FREE[@ls]--}; Number: PUBLIC PROC [ h: Token.Handle, radix: CARDINAL, signalOnError: BOOLEAN ¬ TRUE] RETURNS [u: CARD] = BEGIN s: Rope.ROPE ¬ Filtered[h, NIL, NumberFilter]; IF s = NIL THEN {IF signalOnError THEN SIGNAL SyntaxError[s]; RETURN[0]}; u ¬ Convert.CardFromRope[ s, radix ! Convert.Error => { IF signalOnError THEN SIGNAL SyntaxError[s]; u ¬ 0; CONTINUE}; UNWIND => FreeString[s]]; FreeString[s]; END; Decimal: PUBLIC PROC [h: Token.Handle, signalOnError: BOOLEAN ¬ TRUE] RETURNS [i: INTEGER] = {i ¬ Number[h, 10, signalOnError]}; Item: PUBLIC PROCEDURE [h: Token.Handle, temporary: BOOLEAN ¬ TRUE] RETURNS [value: Rope.ROPE] = BEGIN value ¬ GetString[initialLength]; BEGIN ENABLE { UNWIND => FreeString[value]; }; Skip[h, NIL, WhiteSpace, TRUE]; DO IF WhiteSpaceInline[h.break] OR h.break = NUL THEN EXIT; value ¬ ARAccess.AppendChar[value, h.break]; h.break ¬ h.getChar[h]; ENDLOOP; IF value.Length = 0 THEN {FreeString[value]; RETURN[NIL]}; IF ~temporary THEN { old: Rope.ROPE ¬ value; value ¬ old; FreeString[old]}; END; END; ZeroData: PROCEDURE [data: FilterState] = TRUSTED INLINE BEGIN pu: REF LONG UNSPECIFIED = LOOPHOLE[data]; IF pu # NIL THEN pu­ ¬ 0; END; Skip: PUBLIC PROCEDURE [ h: Token.Handle, data: FilterState, filter: FilterProcType, skipInClass: BOOLEAN ¬ TRUE] = BEGIN ZeroData[data]; WHILE (h.break ¬ h.getChar[h]) # NUL AND filter[h.break, data] = skipInClass DO ENDLOOP; END; Filtered: PUBLIC PROCEDURE [ h: Token.Handle, data: FilterState, filter: FilterProcType, skip: SkipMode ¬ whiteSpace, temporary: BOOLEAN ¬ TRUE] RETURNS [value: Rope.ROPE] = BEGIN value ¬ NIL; ZeroData[data]; DO IF (h.break ¬ h.getChar[h]) = NUL THEN RETURN; IF skip = whiteSpace AND WhiteSpaceInline[h.break] THEN LOOP; IF filter[h.break, data] THEN EXIT; IF skip = none OR skip = whiteSpace THEN RETURN; ENDLOOP; value ¬ GetString[initialLength]; DO ENABLE { UNWIND => FreeString[value]; }; value ¬ ARAccess.AppendChar[value, h.break]; IF (h.break ¬ h.getChar[h]) = NUL OR ~filter[h.break, data] THEN EXIT; ENDLOOP; IF ~temporary THEN { old: Rope.ROPE ¬ value; value ¬ old; FreeString[old]}; END; closeQuote: CHAR ¬ 0c; QuoteFilter: FilterProcType = { IF c = NUL THEN {SIGNAL UnterminatedQuote; RETURN [FALSE]} ELSE RETURN[c # closeQuote]}; MaybeQuoted: PUBLIC PROCEDURE [ h: Token.Handle, data: FilterState, filter: FilterProcType ¬ NonWhiteSpace, isQuote: QuoteProcType ¬ Quote, skip: SkipMode ¬ whiteSpace, temporary: BOOLEAN ¬ TRUE] RETURNS [value: Rope.ROPE] = BEGIN ApplyFilter: FilterProcType ¬ filter; ZeroData[data]; value ¬ NIL; DO IF (h.break ¬ h.getChar[h]) = NUL THEN RETURN; IF skip = whiteSpace AND WhiteSpaceInline[h.break] THEN LOOP; IF (closeQuote ¬ isQuote[h.break]) # nonQuote THEN IF (h.break ¬ h.getChar[h]) = closeQuote THEN { h.break ¬ h.getChar[h]; IF h.break = closeQuote THEN EXIT; -- doubling close quote is literal quote character RETURN} ELSE { IF h.break = NUL THEN {SIGNAL UnterminatedQuote; RETURN}; ApplyFilter ¬ QuoteFilter; EXIT}; IF filter[h.break, data] THEN EXIT; IF skip = none OR skip = whiteSpace THEN RETURN; ENDLOOP; value ¬ GetString[initialLength]; BEGIN ENABLE { UNWIND => FreeString[value]; }; WHILE h.break # NUL DO value ¬ ARAccess.AppendChar[value, h.break]; IF ~ApplyFilter[h.break ¬ h.getChar[h], data] THEN BEGIN IF ApplyFilter = QuoteFilter THEN { h.break ¬ h.getChar[h]; -- get next character IF h.break = closeQuote THEN LOOP}; -- of closeQuote, include character in token EXIT; END; ENDLOOP; IF ~temporary THEN { old: Rope.ROPE ¬ value; value ¬ old; FreeString[old]}; END; END; Alphabetic: PUBLIC FilterProcType = BEGIN RETURN[SELECT c FROM IN ['a..'z], IN ['A..'Z] => TRUE, ENDCASE => FALSE]; END; AlphaNumeric: PUBLIC FilterProcType = BEGIN RETURN[ SELECT c FROM IN ['a..'z], IN ['A..'Z], IN ['0..'9] => TRUE, ENDCASE => FALSE]; END; uninitialized: CARDINAL = 0; inHost: CARDINAL = 1; startName: CARDINAL = 2; inName: CARDINAL = 3; FileName: PUBLIC FilterProcType = BEGIN IF data = NIL THEN ERROR NilData; SELECT c FROM IN ['a..'z], IN ['A..'Z], IN ['0..'9], '>, '*, '!, ';, '#, '-, '., '$, '+ => IF data[0] = uninitialized OR data[0] = startName THEN data[0] ¬ inName; '< => IF data[0] = uninitialized OR data[0] = startName THEN data[0] ¬ inName ELSE RETURN[FALSE]; '[ => IF data[0] = uninitialized THEN data[0] ¬ inHost ELSE RETURN[FALSE]; '] => IF data[0] = inHost THEN data[0] ¬ startName ELSE RETURN[FALSE]; ENDCASE => IF data[0] # inHost THEN RETURN[FALSE]; RETURN[TRUE]; END; Line: PUBLIC FilterProcType = BEGIN RETURN[SELECT c FROM CR, NUL => FALSE, ENDCASE => TRUE]; END; Numeric: PUBLIC FilterProcType = BEGIN RETURN[SELECT c FROM IN ['0..'9] => TRUE, ENDCASE => FALSE]; END; Switches: PUBLIC FilterProcType = -- '~, '-, AlphaNumeric BEGIN RETURN[ SELECT c FROM IN ['a..'z], IN ['A..'Z], IN ['0..'9], '~, '- => TRUE, ENDCASE => FALSE]; END; NumberFilter: FilterProcType = BEGIN RETURN[ SELECT c FROM IN ['0..'9], '+, '-, 'B, 'b, 'D, 'd => TRUE, ENDCASE => FALSE]; END; NonWhiteSpace: PUBLIC FilterProcType = BEGIN RETURN[c # NUL AND ~WhiteSpaceInline[c]]; END; WhiteSpace: PUBLIC FilterProcType = BEGIN RETURN[WhiteSpaceInline[c]]; END; WhiteSpaceInline: PROCEDURE [c: CHARACTER] RETURNS [ --isWhiteSpace:-- BOOLEAN] = INLINE BEGIN RETURN[SELECT c FROM SP, TAB, LF, CR => TRUE, ENDCASE => FALSE]; END; Brackets: PUBLIC QuoteProcType = -- () [] {} <> BEGIN RETURN[ SELECT c FROM '( => '), '[ => '], '{ => '}, '< => '>, ENDCASE => nonQuote]; END; Quote: PUBLIC QuoteProcType = -- '" BEGIN RETURN[SELECT c FROM '', '" => c, ENDCASE => nonQuote]; END; LSHandle: TYPE = REF LSObject; LSObject: TYPE = MACHINE DEPENDENT RECORD [ object: Token.Object, s: Rope.ROPE, i: CARDINAL]; FreeStringHandle: PUBLIC PROCEDURE [h: Token.Handle] RETURNS [nil: Token.Handle ¬ NIL] = {--Heap.systemZone.FREE[@h]--}; StringToHandle: PUBLIC PROCEDURE [s: Rope.ROPE, offset: CARDINAL ¬ 0] RETURNS [h: Token.Handle] = BEGIN lsh: LSHandle ¬ NEW[LSObject ¬ [[getChar: StringGetChar, break: Ascii.NUL], s, offset]]; h ¬ NEW[Token.Object ¬ [StringGetChar, Ascii.NUL]]; END; FreeTokenString: PUBLIC PROCEDURE [s: Rope.ROPE] RETURNS [nil: Rope.ROPE ¬ NIL] = {FreeString[s]}; StringGetChar: Token.GetCharProcType = TRUSTED BEGIN lsh: LSHandle ¬ LOOPHOLE[h]; leng: CARD ¬ lsh.s.Length[]; IF lsh.i < leng THEN { c ¬ lsh.s.Fetch[lsh.i]; lsh.i ¬ lsh.i + 1} ELSE c ¬ Ascii.NUL; END; NilData: PUBLIC SIGNAL = CODE; SyntaxError: PUBLIC SIGNAL [s: Rope.ROPE] = CODE; END...  Copyright Σ 1981, 1982, 1983 , 1992by Xerox Corporation. All rights reserved. File: TokensA.mesa - last edited by: PXK : 8-Jan-82 15:38:28 SXW : 12-Jul-81 14:57:51 LXR : 23-Feb-83 10:25:34 JGS: 13-Jan-83 10:58:22 Mark: 18-May-81 17:16:13 AXD : 29-Sep-82 20:42:59 BJD : 11-Jan-83 10:33:40 Philip James, March 13, 1991 4:45 pm PST Christian Jacobi, April 7, 1992 5:23 pm PDT Heap: TYPE USING [systemZone], Inline USING [BITAND], String USING [ AppendChar, CopyToNewString, InvalidNumber, Length, StringBoundsFault, StringToLongNumber, StringToNumber], StringLookUp: TYPE USING [InTable], Window USING [Box, nullBox]; on a bounds fault ls.Length _ 0; Boolean: PUBLIC PROCEDURE [h: Token.Handle, signalOnError: BOOLEAN _ TRUE] RETURNS [true: BOOLEAN _ FALSE] = BEGIN temp: Rope.ROPE _ NIL; -- _ [10]; BEGIN InvalidChar: PROCEDURE [expected: CHARACTER] RETURNS [invalid: BOOLEAN] = BEGIN temp _ ARAccess.AppendChar[temp, h.break _ h.getChar[h]]; invalid _ Inline.BITAND[h.break, 337B] # expected; END; Skip[h, NIL, WhiteSpace, TRUE]; String.AppendChar[temp, h.break]; SELECT Inline.BITAND[h.break, 337B] FROM 'T => BEGIN IF InvalidChar['R] OR InvalidChar['U] THEN GO TO invalid; IF InvalidChar['E] THEN GO TO invalid; -- allow compiler to cross-jump RETURN[TRUE]; END; 'F => BEGIN IF InvalidChar['A] OR InvalidChar['L] OR InvalidChar['S] THEN GO TO invalid; IF InvalidChar['E] THEN GO TO invalid; -- allow compiler to cross-jump RETURN[FALSE]; END; ENDCASE => GO TO invalid; EXITS invalid => IF signalOnError THEN SIGNAL SyntaxError[temp]; END; END; MAS: Can we get rid of this and just use Inline.LowHalf[LongNumber] if HighHalf[] = 0 or -1? Two issues: speed and equivalence of results. Octal: PUBLIC PROC [h: Token.Handle, signalOnError: BOOLEAN _ TRUE] RETURNS [c: CARDINAL] = {c _ Number[h, 8, signalOnError]}; LongNumber: PUBLIC PROC [ h: Token.Handle, radix: CARDINAL, signalOnError: BOOLEAN _ TRUE] RETURNS [u: LONG UNSPECIFIED] = BEGIN s: Rope.ROPE _ Filtered[h, NIL, NumberFilter]; IF s = NIL THEN {IF signalOnError THEN SIGNAL SyntaxError[s]; RETURN[0]}; u _ String.StringToLongNumber[ s, radix ! String.InvalidNumber => { IF signalOnError THEN SIGNAL SyntaxError[s]; u _ 0; CONTINUE}; UNWIND => FreeString[s]]; FreeString[s]; END; LongDecimal: PUBLIC PROC [h: Token.Handle, signalOnError: BOOLEAN _ TRUE] RETURNS [i: LONG INTEGER] = {i _ LongNumber[h, 10, signalOnError]}; LongOctal: PUBLIC PROC [h: Token.Handle, signalOnError: BOOLEAN _ TRUE] RETURNS [c: LONG CARDINAL] = {c _ LongNumber[h, 8, signalOnError]}; String.StringBoundsFault => BEGIN ns _ String.CopyToNewString[ s, Heap.systemZone, s.maxlength + lengthIncrement - s.length]; FreeString[s]; RESUME[value _ ns]; END value _ String.CopyToNewString[old, Heap.systemZone]; WindowBox: PUBLIC PROCEDURE [h: Token.Handle] RETURNS [box: Window.Box _ Window.nullBox] = BEGIN labels: ARRAY [0..4) OF Rope.ROPE _ ["X"L, "Y"L, "W"L, "H"L]; data: Token.StandardFilterState; string: Rope.ROPE _ NIL; MustBeBracketed: Token.FilterProcType = {RETURN[FALSE]}; string _ MaybeQuoted[h, @data, MustBeBracketed, Brackets]; IF String.Length[string] > 0 THEN { sh: Token.Handle = StringToHandle[string]; DO temp: Rope.ROPE _ Filtered[sh, @data, Alphabetic]; ': was consumed and now is in sh.break IF sh.break = Ascii.NUL THEN {FreeString[temp]; EXIT}; SELECT StringLookUp.InTable[temp, DESCRIPTOR[labels]] FROM 0 => box.place.x _ Decimal[sh, FALSE]; 1 => box.place.y _ Decimal[sh, FALSE]; 2 => box.dims.w _ Decimal[sh, FALSE]; 3 => box.dims.h _ Decimal[sh, FALSE]; ENDCASE => {FreeString[temp]; EXIT}; FreeString[temp]; ENDLOOP; [] _ FreeStringHandle[sh]}; FreeString[string]; END; No default skip! First handle (possible) skip Then accumulate all inClass characters String.StringBoundsFault => BEGIN ns _ String.CopyToNewString[ s, Heap.systemZone, s.maxlength + lengthIncrement - s.length]; FreeString[s]; RESUME[value _ ns]; END String.AppendChar[value, h.break]; value _ String.CopyToNewString[old, Heap.systemZone]; First handle (possible) skip Then accumulate all inClass characters String.StringBoundsFault => BEGIN ns _ String.CopyToNewString[ s, Heap.systemZone, s.maxlength + lengthIncrement - s.length]; FreeString[s]; RESUME[value _ ns]; END value _ String.CopyToNewString[old, Heap.systemZone]; Standard filters Delimited: PUBLIC FilterProcType = first non-blank char IS the delimiter. Must be used with skip = nonToken BEGIN delimiter: REF CHARACTER = LOOPHOLE[data]; IF data = NIL THEN ERROR NilData; IF data[0] # 0 THEN RETURN[c # delimiter­]; IF ~WhiteSpaceInline[c] AND c # NUL THEN delimiter­ _ c; RETURN[FALSE]; END; Type conversion SIGNALs Κ•NewlineDelimiter –(cedarcode) style™šœ ΟeœC™OJšœ$™$Jšœ™Jšœ™Jšœ™Jšœ™Jšœ™Jšœ™Jšœ™Jšœ(™(J™+—Icode˜šΟk ˜ Kšœ žœ˜Kš œžœžœžœžœžœ˜#Kšœžœ˜%Jšœžœžœ™Jšœžœžœ™Kšœžœžœ˜!šœžœ™J™3J™7—Jšœžœžœ ™#K˜Jšœžœ™—K˜Kš ΟnœžœžœžœΟcœ žœ˜r˜Kšžœžœ˜—˜KšŸœžœžœžœ˜(—˜Kšœ žœ˜&Kšœžœ˜6Kšœžœ˜,Kšœžœ˜.Kšœžœ˜*Kšœ žœ˜ Kšœ ž œ˜%K˜Kšœžœ "˜Ašœžœ *˜KJšœ™——˜Kšœžœžœ *˜IK˜š Ÿ œžœžœ žœžœžœ˜@Kšžœžœžœ˜šžœžœžœžœ˜6Kšœ žœ˜Kšœžœ˜šœžœ˜ J™—Kšžœ˜ —Kšžœž +œ˜8—K˜šŸ œžœžœ žœ˜*Kšžœžœžœ˜š žœžœ $œžœžœžœ˜MKšœžœ˜—Kš œ˜—K˜š Ÿœžœž œ"žœžœ™JJšžœžœžœ™!Jšž™Jšœ žœžœ  ™!Jšž™š Ÿ œž œ ž œžœ žœ™IJšž™J™9Jšœžœ™2Jšžœ™—Jšœžœžœ™J™!šžœžœž™(™Jšž™Jš žœžœžœžœžœ ™9Jš žœžœžœžœ  ™GJšžœžœ™ Jšžœ™—™Jšž™šžœžœžœž™=Jšžœžœ ™—Jš žœžœžœžœ  ™GJšžœžœ™Jšžœ™—Jšžœžœžœ ™—Jšžœ žœžœžœ™@Jšžœ™Jšžœ™——˜JšœC™CJšœG™GšŸœžœžœ˜Kšœžœžœžœ˜@Kšžœžœ˜Kšž˜Kšœžœžœ˜.Kšžœžœžœžœžœžœžœ˜I˜K˜ ˜Kšžœžœžœžœ˜>—Kšžœ˜—K˜Kšžœ˜——˜š Ÿœžœžœ"žœžœ˜EKšžœžœ'˜:—š Ÿœžœžœ"žœžœ™CJšžœžœ&™:——˜šŸ œžœžœ™Jšœžœžœžœ™@Jšžœžœž œ™Jšž™Jšœžœžœ™.Jšžœžœžœžœžœžœžœ™I™J™ ™Jšžœžœžœžœ™>—Jšžœ™—J™Jšžœ™——˜š Ÿ œžœžœ"žœžœ™IJšžœžœžœ+™C—š Ÿ œžœžœ"žœžœ™GJšžœžœžœ*™C——˜š Ÿœžœž œžœžœ˜CKšžœžœ˜Kšž˜K˜!Kšž˜šžœ˜Kšžœ˜™Jšž™™J™>—J™Jšžœ ™Jšž™—Kšœ˜—Kšœžœžœ˜šž˜Kš žœžœ žœžœžœ˜8K˜,K˜Kšžœ˜—Kšžœžœžœžœ˜:šžœ žœ˜Kšœ žœ ˜˜ J™6—K˜—Kšžœ˜Kšžœ˜——˜šŸ œžœž œ™-Jšžœ%™,Jšž™Jšœžœžœžœ™=J™ Jšœ žœžœ™JšŸœžœžœ™8J™:šžœžœ™#J™*šž™Jšœ žœ#™2Jšœ&™&Jšžœžœžœžœ™6šžœž œ ž™:Jšœžœ™&Jšœžœ™&Jšœžœ™%Jšœžœ™%Jšžœžœ™$—J™Jšžœ™—J™—J™šžœ™J™——Jšœ™—˜šŸœž œžœž˜8Kšž˜Kš œžœžœž œžœ˜*Kšžœžœžœ ˜Kšžœ˜——˜šŸœžœž œ˜K˜;Kšœ žœžœ˜Kšž˜K˜šžœžœžœ˜)Kšœ$žœžœ˜/—Kšžœ˜——˜šŸœžœž œ˜K˜;Kšœ(žœžœ˜7Kšžœžœ˜Kšž˜Kšœžœ˜ K˜Jšœ™šž˜Kšžœžœžœžœ˜.Kšžœžœžœžœ˜=Kšžœžœžœ˜#Kšžœ žœžœžœ˜0Kšžœ˜—Jšœ&™&K˜!šž˜šžœ˜Kšžœ˜™Jšž™™J™>—J™Jšžœ ™Jšž™—Kšœ˜—˜,J™"—Kš žœžœžœžœžœ˜FKšžœ˜—šžœ žœ˜Kšœ žœ ˜˜ J™5—K˜—Kšžœ˜——˜Kšœ žœ˜šŸ œ˜Kš žœžœžœžœžœžœ˜:Kšžœžœ˜—K˜šŸ œžœž œ˜K˜KK˜—J™Jšžœ ™Jšž™—Kšœ˜—šžœ žœž˜K˜,šžœ,žœ˜3Kšž˜šžœžœ˜#Kšœ ˜-Kšžœžœžœ ,˜P—Kšžœ˜Kšžœ˜—Kšžœ˜—šžœ žœ˜Kšœ žœ ˜˜ J™5—K˜—Kšžœ˜Kšžœ˜——˜Jšœ™—˜šŸ œžœ˜#Kšž˜Kšžœžœžœžœ žœ žœžœžœ˜IKšžœ˜——˜šŸ œžœ˜%Kšž˜šžœ˜šžœž˜ Kšžœ žœ žœ žœ˜.Kšžœžœ˜——Kšžœ˜——˜šŸ œžœ™"JšœH™HJšž™Jšœ žœž œžœ™*Jšžœžœžœžœ ™!Jšžœ žœžœ™+Jšžœžœžœžœ™8Jšžœžœ™Jšžœ™——˜Kšœžœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜—˜šŸœžœ˜!Kšž˜Kšžœžœžœžœ ˜!šžœž˜ šžœ žœ žœ#˜?K˜šžœžœžœ˜7K˜——˜šžœžœžœ˜7K˜—Kšžœžœžœ˜—˜šžœžœ˜ K˜—Kšžœžœžœ˜—Kš œžœžœžœžœžœ˜FKš žœžœžœžœžœ˜2Kšžœžœ˜ šžœ˜K˜———šŸœžœ˜Kšžœžœžœžœžœžœžœžœžœžœ˜C——˜šŸœžœ˜ Kšžœžœžœžœžœ žœžœžœžœ˜G——˜šŸœžœ ˜:Kšž˜šžœ˜šžœž˜ Kšžœ žœ žœžœ˜6Kšžœžœ˜——Kšžœ˜——˜šŸ œ˜Kšž˜šžœ˜šžœž˜ Kšžœ%žœ˜,Kšžœžœ˜——Kšžœ˜——˜šŸ œžœ˜'Kš žœžœžœžœžœ˜4——˜Kš Ÿ œžœžœžœžœ˜K—˜šŸœž œž œ˜*Kšžœ œžœž˜-Kšžœžœžœžœžœžœžœžœžœžœžœ˜K——˜šŸœžœ ˜0Kšž˜šžœ˜Kšžœžœ)žœ˜K—Kšžœ˜——˜šŸœžœ ˜$Kš žœžœžœžœžœžœ˜B——K˜˜Jšœ™—˜Kšœ žœžœ ˜š œ žœžœž œžœ˜+Kšœžœžœ˜1——˜šŸœžœž œ˜4Kšžœžœ œ˜C——˜š Ÿœžœž œ žœ žœ˜EKšžœ˜Kšž˜Kšœžœ3žœ˜XKšœžœ&žœ˜3Kšžœ˜——˜šŸœžœž œ žœ˜0Kšžœ žœžœ˜1——˜šŸ œžœ˜/Kšž˜Kšœžœ˜Kšœžœ˜šžœžœ˜K˜*—Kšžœ žœ˜Kšžœ˜——˜Jšœ™—˜KšŸœžœžœžœ˜Kš Ÿ œžœžœ žœžœ˜1—˜Kšžœ˜—K˜—…—jC‹