# unlambda.unl -- Unlambda 2 interpreter written in Unlambda 2 # copyright (c) 2003 Emil Jerabek # This program is free software, and it comes with no warranty. # You can redistribute it and/or modify it under the terms # of the GNU General Public License, either version 2, # or (at your option) any later version. # Usage: # # This interpreter expects a valid Unlambda program together with # its input, separated by a newline. (This is actually ambiguous; # to be exact, the interpreter stops parsing the program as soon # as it has read a complete Unlambda expression. It ignores subsequent # text upto the first newline character, and feeds the rest as data # to the interpreted program.) # Known problems: # # "|" reports . rather than v at the beginning of execution # of the interpreted program. Similarly for "?". # # The interpreter internally represents the interpreted program # as the lambda expression ^x. When the parsing stage # is complete, it evaluates the program easily by applying this # expression to a more or less arbitrary argument. # # This is a very simple scheme, but it relies heavily on proper # implementation of "d". E.g., Jacob Mandelson's implementation # doesn't handle "d" correctly (a simple example is ```s`kdri), which # effectively means that this interpreter will treat "d" as equivalent # to "i". The "c-refcnt" implementation from the Unlambda 2 distribution # is safe. # # Jean Marot's debugger doesn't parse this interpreter correctly, # because it mistreats "?#" as a start of a commentary. # As a partial solution, comment out indicated portions of code below. # The interpreter will then run, but it won't respect comments (and ?#'s) # in interpreted programs. # # The interpreter contains embeded "binary" characters, so be careful # if you try to convert it to non-UNIX end-of-line convention, for instance. # Actually, I suspect that the interpreter would have troubles on # platforms which use longer line separators, such as MS-DOS (untested). # Program structure: # # = ` # = ` # = ^h```@i`? # ^x`c^n``k$h``$x$n`ki$h # = ^x`$x$x # = `

#

= ^h```@i`c$h # = ^n```... # ```` # = `?`^x``$x$n``s``s`ks # = `?s^x``$x$n`k`ks # ... # = `?|^x``$x$n`k`k| # = `?.^x``$x$n```$x@i`k`k`|i # = `?#^x``$x$n```$x # = `$n # = `??^x``$x$n^p``@i`c^m``...` # = `?u^y``$y$m`k?u # = `$m`k?\377 # # (most lambda expressions above were manually simplified # to keep them at reasonable length) ````sii ``s``s``s`k@`ki``s`kc`k ``s``s`k?```s``s`ks``s``s`ks`kik`k`k``s``s`ks``sii``sii ``s``s`k?s``s``s`ks``s``s`ks`kik`k`k`k`ks ``s``s`k?k``s``s`ks``s``s`ks`kik`k`k`k`kk ``s``s`k?i``s``s`ks``s``s`ks`kik`k`k`k`ki ``s``s`k?v``s``s`ks``s``s`ks`kik`k`k`k`kv ``s``s`k?c``s``s`ks``s``s`ks`kik`k`k`k`kc ``s``s`k?d``s``s`ks``s``s`ks`kik`k`k`k`kd ``s``s`k?r``s``s`ks``s``s`ks`kik`k`k`k`kr ``s``s`k?e``s``s`ks``s``s`ks`kik`k`k`k`ke ``s``s`k?S``s``s`ks``s``s`ks`kik`k`k`k`ks ``s``s`k?K``s``s`ks``s``s`ks`kik`k`k`k`kk ``s``s`k?I``s``s`ks``s``s`ks`kik`k`k`k`ki ``s``s`k?V``s``s`ks``s``s`ks`kik`k`k`k`kv ``s``s`k?C``s``s`ks``s``s`ks`kik`k`k`k`kc ``s``s`k?D``s``s`ks``s``s`ks`kik`k`k`k`kd ``s``s`k?R``s``s`ks``s``s`ks`kik`k`k`k`kr ``s``s`k?E``s``s`ks``s``s`ks`kik`k`k`k`ke ``s``s`k?@``s``s`ks``s``s`ks`kik`k`k`k`k@ ``s``s`k?|``s``s`ks``s``s`ks`kik`k`k`k`k| ``s``s`k?.``s``s`ks``s``s`ks`kik`k``s``s``si`k@`ki``s`kk``s`kk``s`k|`ki #ifndef perl ``s``s`k?#``s``s`ks``s``s`ks`kik`k``s``s``si`k``sii`k``s``s``s`k@`ki``s`k? ``s`k`s`kc``s``s`ks``s`kk``s`ks``s`kkk`k``ss`k`k`kii`k``sii #endif ``s``s`k??``s``s`ks``s``s`ks`kik`k`k``s``s`k@`ki``s`kc`k ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k? ``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?!``s``s`ks``s``s`ks`kik`k`k`k?! ``s``s`k?"``s``s`ks``s``s`ks`kik`k`k`k?" #ifndef perl ``s``s`k?#``s``s`ks``s``s`ks`kik`k`k`k?# #endif ``s``s`k?$``s``s`ks``s``s`ks`kik`k`k`k?$ ``s``s`k?%``s``s`ks``s``s`ks`kik`k`k`k?% ``s``s`k?&``s``s`ks``s``s`ks`kik`k`k`k?& ``s``s`k?'``s``s`ks``s``s`ks`kik`k`k`k?' ``s``s`k?(``s``s`ks``s``s`ks`kik`k`k`k?( ``s``s`k?)``s``s`ks``s``s`ks`kik`k`k`k?) ``s``s`k?*``s``s`ks``s``s`ks`kik`k`k`k?* ``s``s`k?+``s``s`ks``s``s`ks`kik`k`k`k?+ ``s``s`k?,``s``s`ks``s``s`ks`kik`k`k`k?, ``s``s`k?-``s``s`ks``s``s`ks`kik`k`k`k?- ``s``s`k?.``s``s`ks``s``s`ks`kik`k`k`k?. ``s``s`k?/``s``s`ks``s``s`ks`kik`k`k`k?/ ``s``s`k?0``s``s`ks``s``s`ks`kik`k`k`k?0 ``s``s`k?1``s``s`ks``s``s`ks`kik`k`k`k?1 ``s``s`k?2``s``s`ks``s``s`ks`kik`k`k`k?2 ``s``s`k?3``s``s`ks``s``s`ks`kik`k`k`k?3 ``s``s`k?4``s``s`ks``s``s`ks`kik`k`k`k?4 ``s``s`k?5``s``s`ks``s``s`ks`kik`k`k`k?5 ``s``s`k?6``s``s`ks``s``s`ks`kik`k`k`k?6 ``s``s`k?7``s``s`ks``s``s`ks`kik`k`k`k?7 ``s``s`k?8``s``s`ks``s``s`ks`kik`k`k`k?8 ``s``s`k?9``s``s`ks``s``s`ks`kik`k`k`k?9 ``s``s`k?:``s``s`ks``s``s`ks`kik`k`k`k?: ``s``s`k?;``s``s`ks``s``s`ks`kik`k`k`k?; ``s``s`k?<``s``s`ks``s``s`ks`kik`k`k`k?< ``s``s`k?=``s``s`ks``s``s`ks`kik`k`k`k?= ``s``s`k?>``s``s`ks``s``s`ks`kik`k`k`k?> ``s``s`k??``s``s`ks``s``s`ks`kik`k`k`k?? ``s``s`k?@``s``s`ks``s``s`ks`kik`k`k`k?@ ``s``s`k?A``s``s`ks``s``s`ks`kik`k`k`k?A ``s``s`k?B``s``s`ks``s``s`ks`kik`k`k`k?B ``s``s`k?C``s``s`ks``s``s`ks`kik`k`k`k?C ``s``s`k?D``s``s`ks``s``s`ks`kik`k`k`k?D ``s``s`k?E``s``s`ks``s``s`ks`kik`k`k`k?E ``s``s`k?F``s``s`ks``s``s`ks`kik`k`k`k?F ``s``s`k?G``s``s`ks``s``s`ks`kik`k`k`k?G ``s``s`k?H``s``s`ks``s``s`ks`kik`k`k`k?H ``s``s`k?I``s``s`ks``s``s`ks`kik`k`k`k?I ``s``s`k?J``s``s`ks``s``s`ks`kik`k`k`k?J ``s``s`k?K``s``s`ks``s``s`ks`kik`k`k`k?K ``s``s`k?L``s``s`ks``s``s`ks`kik`k`k`k?L ``s``s`k?M``s``s`ks``s``s`ks`kik`k`k`k?M ``s``s`k?N``s``s`ks``s``s`ks`kik`k`k`k?N ``s``s`k?O``s``s`ks``s``s`ks`kik`k`k`k?O ``s``s`k?P``s``s`ks``s``s`ks`kik`k`k`k?P ``s``s`k?Q``s``s`ks``s``s`ks`kik`k`k`k?Q ``s``s`k?R``s``s`ks``s``s`ks`kik`k`k`k?R ``s``s`k?S``s``s`ks``s``s`ks`kik`k`k`k?S ``s``s`k?T``s``s`ks``s``s`ks`kik`k`k`k?T ``s``s`k?U``s``s`ks``s``s`ks`kik`k`k`k?U ``s``s`k?V``s``s`ks``s``s`ks`kik`k`k`k?V ``s``s`k?W``s``s`ks``s``s`ks`kik`k`k`k?W ``s``s`k?X``s``s`ks``s``s`ks`kik`k`k`k?X ``s``s`k?Y``s``s`ks``s``s`ks`kik`k`k`k?Y ``s``s`k?Z``s``s`ks``s``s`ks`kik`k`k`k?Z ``s``s`k?[``s``s`ks``s``s`ks`kik`k`k`k?[ ``s``s`k?\``s``s`ks``s``s`ks`kik`k`k`k?\ ``s``s`k?]``s``s`ks``s``s`ks`kik`k`k`k?] ``s``s`k?^``s``s`ks``s``s`ks`kik`k`k`k?^ ``s``s`k?_``s``s`ks``s``s`ks`kik`k`k`k?_ ``s``s`k?```s``s`ks``s``s`ks`kik`k`k`k?` ``s``s`k?a``s``s`ks``s``s`ks`kik`k`k`k?a ``s``s`k?b``s``s`ks``s``s`ks`kik`k`k`k?b ``s``s`k?c``s``s`ks``s``s`ks`kik`k`k`k?c ``s``s`k?d``s``s`ks``s``s`ks`kik`k`k`k?d ``s``s`k?e``s``s`ks``s``s`ks`kik`k`k`k?e ``s``s`k?f``s``s`ks``s``s`ks`kik`k`k`k?f ``s``s`k?g``s``s`ks``s``s`ks`kik`k`k`k?g ``s``s`k?h``s``s`ks``s``s`ks`kik`k`k`k?h ``s``s`k?i``s``s`ks``s``s`ks`kik`k`k`k?i ``s``s`k?j``s``s`ks``s``s`ks`kik`k`k`k?j ``s``s`k?k``s``s`ks``s``s`ks`kik`k`k`k?k ``s``s`k?l``s``s`ks``s``s`ks`kik`k`k`k?l ``s``s`k?m``s``s`ks``s``s`ks`kik`k`k`k?m ``s``s`k?n``s``s`ks``s``s`ks`kik`k`k`k?n ``s``s`k?o``s``s`ks``s``s`ks`kik`k`k`k?o ``s``s`k?p``s``s`ks``s``s`ks`kik`k`k`k?p ``s``s`k?q``s``s`ks``s``s`ks`kik`k`k`k?q ``s``s`k?r``s``s`ks``s``s`ks`kik`k`k`k?r ``s``s`k?s``s``s`ks``s``s`ks`kik`k`k`k?s ``s``s`k?t``s``s`ks``s``s`ks`kik`k`k`k?t ``s``s`k?u``s``s`ks``s``s`ks`kik`k`k`k?u ``s``s`k?v``s``s`ks``s``s`ks`kik`k`k`k?v ``s``s`k?w``s``s`ks``s``s`ks`kik`k`k`k?w ``s``s`k?x``s``s`ks``s``s`ks`kik`k`k`k?x ``s``s`k?y``s``s`ks``s``s`ks`kik`k`k`k?y ``s``s`k?z``s``s`ks``s``s`ks`kik`k`k`k?z ``s``s`k?{``s``s`ks``s``s`ks`kik`k`k`k?{ ``s``s`k?|``s``s`ks``s``s`ks`kik`k`k`k?| ``s``s`k?}``s``s`ks``s``s`ks`kik`k`k`k?} ``s``s`k?~``s``s`ks``s``s`ks`kik`k`k`k?~ ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``s``s`k?``s``s`ks``s``s`ks`kik`k`k`k? ``si`k`k? ``si`k``sii i ```sii``s``s``s`k@`ki``s`k? ``s`k`s`kc``s``s`ks``s`kk``s`ks``s`kkk`k``ss`k`k`kii