介绍
你好!我的名字叫HellMood,这篇文章是关于一个名为Memories的小型MS DOS程序的。该程序的大小为256字节,在2020年的“ PC 256字节”竞赛场景 “修订”中赢得了冠军,并获得了观众奖。你可以看程序的输出的视频在这里,并与在线观众和主持人的反应的视频在这里。下载版本并在此处发表评论。本文将对程序进行深入的分析,讨论历史参考和开发阶段。该文章发布在sizecoding Wiki中。它不仅使您了解内存的内部结构,而且还将帮助您创建类似的内容。探索它!如果您不熟悉sizecoding(编写所需大小的程序)或使用x86汇编程序,则建议您从此Wiki的基础开始。这些原理很容易理解,但要弄清实施细节却不那么容易。简短评论
在本文中,我们将讨论发送给竞赛的DosBox版本(256字节)。该归档文件还包含适用于FreeDos和Windows XP DOS的版本,在撰写本文时,这些版本不适用于所有计算机。这些替代版本已作为概念证明包含在存档中,以表明该程序不仅可在仿真器中运行。在2020年“修订”比赛的“ PC 256字节”类别中,可以将“ FreeDos”或“ DosBox”指示为平台(后者在特定配置中)。实际上,正如其他版本所证明的那样,您可以修改DosBox的版本,以便它可以在FreeDos,MS DOS,WinXP和Win98中使用,但是本文将不再赘述。尽管如此,所有平台和计算机的可靠版本仍在开发中。至于可能的进一步优化,尽管我已经找到了可以优化代码的几个地方,但我只会谈论发送给竞赛的版本。由于这是小效果历史的证明,因此几乎没有代码是完美的,并且可以进一步简化。为了不引起不同版本的混淆,我将只谈论竞争。小影响的历史
http://www.pouet.net上的尺寸类别我们是sizcoders,原因是尺寸类别。对于MS DOS,这些类别为256b,128b,64b和32b。这些是演示场景中最大的档案馆之一的标准www.pouet.net。没有16b类别,但是可以在16个字节中实现许多小的效果。几乎所有“记忆”中的效果都是我之前编写和优化的,基本上,它们的实现是试图减小效果的现有大小或创建类似但较小的效果。尺寸减小是指将其减小为以下2 ^ N个较小类别之一。例如,如果效果以33-64字节实现,则将其减少到32字节或更小。几乎每次我设法将效果“降低”到较低的类别时,我都会将生成的微型程序发送到一个专门针对演示场景的事件,在该事件中,允许远程参与者参加256b类别,和/或将结果发布在www.pouet.net上。。在本节中,我将向您介绍这些效果,以及它们的起源和作者。棋盘阵列
kasparov,16个字节,这种效果的来源是我自己在2018年发布的“ Kasparov 16b”(链接)。似乎(从发行说明中引用),我“只是制作了这块板,使其适合17个字节,但是直到我想出一个窍门时,它才算漂亮……”。以前,已经有类似的效果,以32字节实现:开发人员崩溃导致的2003 ew。(链接)在这种情况下,我尝试实现具有8x8正方形和可识别的黑白正方形的“真实”棋盘,以及各个棋盘的正确方向,即右下角(h1)应该为白色。为了使这种效果适用于全局框架,在“回忆”中,必须使用另一种技术来重新实现它:在屏幕上记录;此外,滚动方向已更改,使其与“滚动倾斜平面”效果不同。缩放圈
可扩展圈子(缩放圈子)本应作为32字节的介绍内容参加demopati,但我从来没有参加。此效果没有64字节的前任效果,因为在64b类别中,可能会出现更复杂的效果。放大圈是我拼命尝试进入类别32b的结果,其中有一个圆形“隧道”,对此我的个人记录仍然是52个字节(“ Neontube”-2016)(link),从而成为经典64的优化字节效应的“不断进化”开发者ryg / Farbrausch(2003)(链接)。在缩放圆圈过程中,距离和角度被消除/忽略,因此有可能落入类别32b。滚动倾斜平面
Floorcast是32字节版本,是Scrolling倾斜平面的一种变体,是我自己发行的版本之一,即2018 floorcast 32b。“溢出”的效果在大小编码方面有其自己的历史,并且已从256字节逐渐减少到32字节。不同版本的平面数量不同,在某些平面中显示两个,在其他平面中-仅一个。在“ floorcast 32b”版本中,我特别决定放弃“ XOR”纹理,在“ Memories”中,我再次使用它,并以“ AND”的形式用最后的修饰将其遮盖。- 2008 rain_storm版本-256字节- 链接
- 2008版org_100h-128字节- 链接
- 2013 Baudsurfer版本-86字节- 链接
- 2014 Baudsurfer版本-64字节- 链接
- 2018 HellMood版本-32字节- 链接
视差棋盘
Projektbeschreibung,32字节我在2018年发布了32字节Projektbeschreibung效果的视差棋盘。在其中,我尝试将“跟随光”(链接)的大小从“ Digimind”(2006年)或我自己的“ Lucy”(2014年)(链接)减少到32个字节。非常有用的灵感来源是Rrrolas的Paralaxa(32个字节,2007年,链接)和Sensenstahl(2013年)的Byteropolis(链接))Rrrolas渲染技术非常接近我的最终决定,更改了代码以更正飞机的位置,用棋盘替换三角形,并改善颜色。内存使用Digimind版本的配色方案。另外,最大程度地修改了效果以减少变形。谢尔宾斯基旋转异构体
colpinski,16个字节rotastic(32字节)它包含两个效果:rotozoomer和Sierpinski效果作为纹理。Sierpinski效果基于我自己的2013 Colpinski 16b效果(链接),在该效果中,我使用frag函数fsqrt设法获得了最大可能。此效果没有前例,因为可以直接通过组合X和Y来实现,而不必使用迭代功能系统或元胞自动机。我在2017年发布了“旋转和缩放”(rotozoomer),称为32b入门“ rotastic”(链接),它基于开发人员Farbrausch(51个字节,2002年,链接)和“阴谋”组的“ Gargaj”的“ ryg”思想“(49字节,2002,链接)。射线管弯曲隧道
进入一个新时代,即64位版本raycast弯曲通道已成为我自己的64字节发行版“进入新时代”的修改版本(2018,链接)。原始颜色替换为标准调色板的颜色,几何形状和相应的计算略有更改,因此深度效果不用于计算纹理值。此效果的单独版本为50个字节。创建64字节版本的主要灵感来源是两个128字节的简介:“ TBC”中的“海绵”(2009,链接)和Baudsurfer的“ Wolf128”(2014,链接),我自己开发了该算法。每天晚上海洋
Ocean,版本64b海洋效果基于我自己的“ Ocean” 2016 64字节发行版(链接)。剪切了原始颜色和音乐的单独生成,这两个生成器在不使用额外字节堆的情况下都与主内存框架不兼容。“黎明”的特殊效果是由于框架结构的整体实现。我将在下一章中讨论这一点。褪色效果
两种效果之间的过渡本身就是没有任何前任效果的效果。相反,这是一个已经发展了数年的想法,也许它被许多其他人同样地采用了。简而言之,当计算帧时,每个像素的位置被随机化,并且确定应该使用哪种效果的时间被该随机化值偏移,该随机化值先前被减少。这使您可以使用标准的VGA调色板(图像,源),而不是创建自己的颜色以进行平滑混合,从而节省了空间。我的“微型巨型演示”的框架
要将多个小效果组合到一个“巨型演示”中,它们应使用相同的技术,并且最多不应应用假设(关于存储器和寄存器的内容)。他们还需要使用相同的计时值并按照总时间工作。准备适合该框架的单个效果花了很长时间,并且一开始有很多额外的空间。应该注意的是,由于巨大的过度使用内存,一些最令人印象深刻的效果(根据观众的反应和对社交网络的看法判断)可能未包含在演示中。在解决所有影响之后,我可以开始考虑对经常重复的计算进行“包围”,这将节省更多的字节。该框架执行以下操作:org 100h
s:
mov al,0x13 ; set AL to mode 320*200 in 256 colors
int 0x10 ; call BIOS to set mode
xchg bp,ax ; set timing value to 0x13
push 0xa000-10 ; write the screen adress to register ES
pop es ; works in conjunction with Rrrola trick
mov ax,0x251c ; parameter for changing timer interrupt
mov dl,timer ; adress of timer routine, assume DH=1
int 0x21 ; install timer routine
top:
mov ax,0xcccd ; load magic Rrrola constant
mul di ; transform screen pointer to X, Y
add al,ah ; use transformation garbage as
xor ah,ah ; pseudorandom value and clear AH
add ax,bp ; add time value to random value
shr ax,9 ; divide by 512 (basically the speed)
and al,15 ; filter effect number
xchg bx,ax ; move effect number to BX
mov bh,1 ; reset BH to align with start of code
mov bl,[byte bx+table] ; read the effect address from the table
call bx ; call the effect
stosb ; write the return value and advance
inc di ; triple interlace trick for after
inc di ; effect and smoothing the animation
jnz top ; repeat until the frame is complete
mov al,tempo ; set AL to divider for timer
out 40h,al ; set timing (dual pass)
in al,0x60 ; read keyboard
dec al ; quit on ESC
jnz top ; otherwise repeat loop
sounds: db 0xc3, 11, 0x93; 0xc3 is MIDI/RET; fx2-s is used as volume
table: db fx2-s,fx1-s,fx0-s,fx3-s,fx4-s,fx5-s,fx6-s,sounds-s,stop-s
棋盘阵列
棋盘阵列最开始的效果。临时移动字符串后,将应用经典的XOR模式。为了营造棋盘格的印象,除两位以外的所有颜色都设置为彩色。真正的诀窍是转移到调色板的“好”位置。帧中被视为黑色的部分实际上不是黑色,而是标准VGA调色板的深色部分。这种转变使您可以使暗室和暗室具有古代棋盘的感觉。 xchg dx,ax ; get XY into AX
sub ax,bp ; subtract time from row
xor al,ah ; XOR pattern (x xor y)
or al,0xDB ; pattern for array of boards
add al,13h ; shift to good palette spot
缩放圈
缩放圆圈从点(X,Y)到中心(0,0)的距离D为sqrt(X²+Y²)。该框架以前使DL包含居中坐标X,而DH = Y需要在代码中居中。要在x86中执行平方根计算操作,需要大量代码,但实际上可以省略。仔细选择颜色后,没有平方根的会聚圆弧的感觉似乎很有说服力。 mov al,dh ; get Y in AL
sub al,100 ; align Y vertically
imul al ; AL = Y²
xchg dx,ax ; Y²/256 in DH, X in AL
imul al ; AL = X²
add dh,ah ; DH = (X² + Y²)/256
mov al,dh ; AL = (X² + Y²)/256
add ax,bp ; offset color by time
and al,8+16 ; select special rings
滚动倾斜平面
滚动倾斜平面此效果的实现方式如下:首先,为了模拟距离,将一个大常数除以线号Y。然后将获得的值使用两次:a)乘以X的中心值,b)乘以当前时间作为偏移量。然后,使用XOR模式组合这些结果,从中选择特殊的模式。 mov ax,0x1329 ; initialize with constant
add dh,al ; preventing divide overflow
div dh ; reverse divide AL = C/Y'
xchg dx,ax ; DL = C/Y', AL = X
imul dl ; AH = CX/Y'
sub dx,bp ; DL = C/Y'-T
xor ah,dl ; AH = (CX/Y') ^ (C/Y'-T)
mov al,ah ; move to AL
and al,4+8+16 ; select special pattern
视差棋盘
视差检查板这是一种具有动态几何形状的reykasting(发射射线)。对象的每个平面由于带符号的16位乘法而水平划分,并且由于具有列号的隐式逻辑的操作而垂直划分。此外,还应用了间接变形来连接所得网格的边缘(4个“实心”区域,4个“透明”区域交替)。如果光束穿过实心区域之一,则颜色变为迭代次数(+灰色阴影中的调色板偏移量),如果不是,则平面移至屏幕指针,此后重复该过程,直到达到最大迭代次数为止。 mov cx,bp ; set inital point to time
mov bx,-16 ; limit to 16 iterations
fx3L:
add cx,di ; offset point by screenpointer
mov ax,819 ; magic, related to Rrrola constant
imul cx ; get X',Y' in DX
ror dx,1 ; set carry flag on "hit"
inc bx ; increment iteration count
ja fx3L ; loop until "hit" or "iter=max"
lea ax,[bx+31] ; map value to standard gray scale
谢尔宾斯基旋转异构体
塞尔平斯基旋转异构体使用www.google.com创建的图1 / cos(atan(x))对于具有缩放比例的旋转,通常需要三角函数或其良好的近似值。让我们看一下通常的2D旋转方程,并以一种特殊的方式对其进行解释,以消除计算中的三角学:x' = x*cos(a) - y*sin(a)
y' = x*sin(a) + y*cos(a)
如果我们添加缩放比例,它将看起来像这样:x' = z * (x*cos(a) - y*sin(a))
y' = z * (x*sin(a) + y*cos(a))
现在,我们不定义z,而是将1 / cos(a)放在方括号中:x' = 1/cos(a) * (x - y*tan(a))
y' = 1/cos(a) * (x*tan(a) + y)
现在我们用时间变量替换tan(a),因为正切函数在接近180°时趋于无穷大:x' = 1/cos(atan(T)) * (x - y*T)
y' = 1/cos(atan(T)) * (x*T + y)
如果我们不担心缺乏设置比例因子的能力并且不直接控制角度,那么我们可以在不使用三角函数的情况下从-180°旋转到+ 180°。结果,比例因数最终与时间T相关。在图像中显示了系数的函数,因此该比例发生了从无穷小数到1(原始大小)再回到无穷小。花了大量的字节来装饰这种效果,固定时间偏移,加快动画播放速度,增加Sierpinski三角形的像素并创建漂亮的色彩,但是我认为这是值得的。 lea cx,[bp-2048]; center time to pass zero
sal cx,3 ; speed up by factor 8!
movzx ax,dh ; get X into AL
movsx dx,dl ; get Y int DL
mov bx,ax ; save X in BX
imul bx,cx ; BX = X*T
add bh,dl ; BH = X*T/256+Y
imul dx,cx ; DX = Y*T
sub al,dh ; AL = X-Y*T/256
and al,bh ; AL = (X-Y*T/256)&(X*T/256+Y)
and al,252 ; thicker sierpinski
salc ; set pixel value to black
jnz fx4q ; leave black if not sierpinski
mov al,0x2A ; otherwise: a nice orange
fx4q:
射线管弯曲隧道
raycast弯曲隧道这是一种从“进入新时代”开始激荡的隧道(请参见上文)。Reddit 上已发布了针对类似Essence程序的这种效果的详细说明。我摆脱了独特的颜色,改变了倾斜的方向,并且几何形状变得更加封闭,从而提高了旧计算机和DosBox的性能。 mov cl,-9 ; start with depth 9 (moves backwards)
fx5L:
push dx ; save DX, destroyed inside the loop
mov al,dh ; Get Y into AL
sub al,100 ; Centering Y has to be done "manually".
imul cl ; Multiply AL=Y by the current distance, to get a projection(1)
xchg ax,dx ; Get X into AL, while saving the result in DX (DH)
add al,cl ; add distance to projection, (bend to the right)
imul cl ; Multiply AL=X by the current distance, to get a projection(2)
mov al,dh ; Get projection(1) in AL
xor al,ah ; combine with projection(2)
add al,4 ; center the walls around 0
test al,-8 ; check if the wall is hit
pop dx ; restore DX
loopz fx5L ; repeat until "hit" or "iter=max"
sub cx,bp ; offset depth by time
xor al,cl ; XOR pattern for texture
aam 6 ; irregular pattern with MOD 6
add al,20 ; offset into grayscale palette
每天晚上海洋
海洋之夜Oceanday海洋效应是“福禄克”的一个很好的例子。如果我们将值作为整数加载到FPU中并存储为浮点,然后再次将其解释为整数,那么我们将得到一个很好的模式。如果将其与逆除法结合使用,则会获得漂亮的波浪效果。它与DX寄存器紧密配合,DX寄存器在所需位置上有符号反转,因此我们可以轻松地将天空与大海分开。但是,最后的触摸是颜色。根据全局框架的结构,AL的值在函数的输入处确定,其中包含效果的地址。通过稍微改组代码,您无需使用说明即可获得“自由”的天空颜色,就像“转换为白天”的颜色一样,这也是效果的地址。这不是一个巧合。在DosBox版本以外的其他版本中,因此,天空的颜色可能会有所不同。 sub dh,120 ; check if pixel is in the sky
js fx6q ; quit if that's the case
mov [bx+si],dx ; move XY to a memory location
fild word [bx+si] ; read memory location as integer
fidivr dword [bx+si]; reverse divide by constant
fstp dword [bx+si-1]; store result as floating point
mov ax,[bx+si] ; get the result into AX
add ax,bp ; modify color by time
and al,128 ; threshold into two bands
dec ax ; beautify colors to blue/black
褪色效果
为方便起见,将效果与全局框架隔离。实际上,它从屏幕指针生成一个伪随机数,然后通过其缩放值执行时间偏移,此后它会产生所需的效果。 mov ax,0xcccd ; load magic Rrrola constant
mul di ; transform screen pointer to X, Y
add al,ah ; use transformation garbage as
xor ah,ah ; pseudorandom value and clear AH
add ax,bp ; add time value to random value
shr ax,9 ; divide by 512 (basically the speed)
and al,15 ; filter effect number
xchg bx,ax ; move effect number to BX
mov bh,1 ; reset BH to align with start of code
mov bl,[byte bx+table] ; read the effect address from the table
MIDI音乐
这部分代码增加时间值并产生声音。通过选择通道3,我们可以将“更换工具通道”指令重用为“ RET”。通过移动效果代码,可以为音量创建合适的值,从而节省另一个字节。值得考虑的是,这部分代码仅在MIDI设备已经处于UART模式时才有效,否则您将需要再花三个字节。许多观众和组织者告诉我,该乐曲有点像Mike Oldfield的《咒语》,但它是用非常简单的技术创作的。从Hypnoteye 2015开始,我尝试了程序MIDI,并最终发布了一个小型MIDI框架(64字节)。他工作的主要原理是在音调空间中以固定的音调跳变并将高值转换为低值(通过模除法)。步长和modvalue的简单组合可以达到有趣的效果。例如,stepwidth = 3可使您获得持续持久的减少的小和弦,而stepwidth = 4或stepwidth = 6-三重音效果。通过精心选择的modvalue,这些模式可以创建序列。我没有进行适当的理论分析,只是简单地探索了音调的空间并注意到了有趣的声音。sounds: db 0xc3, 11, 0x93, fx2-s
...
inc bp ; increment timing value
test bp, 7 ; play a note every 8th step
jnz nomuse ; quit if in between
mov dx,0x330 ; port number for MIDI
mov si,sounds ; adress for sound data
outsb ; change instrument of channel 3
outsb ; to vibraphone
outsb ; play a note on channel 3
imul ax,bp,-19*32*4 ; the magic melody constant
shr ax,10 ; scale down and implicit "and 63"
add al,22 ; pitch base is 22
out dx,al ; play THIS note on channel 3
outsb ; play it with THIS volume
完整的发布代码
; "memories" by HellMood/DESiRE
; the tiny megademo, 256 byte msdos intro
; shown in April 2020 @ REVISION
;
; (= WILL BE COMMENTED IN DETAIL LATER =)
;
; create : nasm.exe memories.asm -fbin -o memories.com
; CHOOSE YOUR TARGET PLATFORM (compo version is dosbox)
; be sure to use the dosbox.conf from this archive!
; only ONE of the defines should be active!
%define dosbox ; size : 256 bytes
;%define freedos ; size : 230 bytes
;%define winxpdos ; size : 263 bytes
; DON'T TOUCH THESE UNLESS YOU KNOW WHAT YOU'RE DOING
%ifdef winxpdos
%define music
%define switch_uart
%define safe_dx
%define safe_segment
%endif
%ifdef freedos
%define safe_dx
%endif
%ifdef dosbox
%define music
;%define safe_dx ; sometimes needed
%endif
; GLOBAL PARAMETERS, TUNE WITH CARE!
%define volume 127 ; not used on dosbox (optimization)
%define instrument 11
%define scale_mod -19*32*4;
%define time_mask 7
%define targetFPS 35
%define tempo 1193182/256/targetFPS
%define sierp_color 0x2A
%define tunnel_base_color 20
%define tunnel_pattern 6
%define tilt_plate_pattern 4+8+16
%define circles_pattern 8+16
org 100h
s:
%ifdef freedos
mov fs,ax
mov [fs:0x46c],ax
%endif
mov al,0x13
int 0x10
xchg bp,ax
push 0xa000-10
pop es
%ifndef freedos
mov ax,0x251c
%ifdef safe_dx
mov dx,timer
%else ; assume DH=1, mostly true on DosBox
mov dl,timer
%endif
int 0x21
%endif
top:
%ifdef freedos
mov bp,[fs:0x46c]
%endif
mov ax,0xcccd
mul di
add al,ah
xor ah,ah
add ax,bp
shr ax,9
and al,15
xchg bx,ax
mov bh,1
mov bl,[byte bx+table]
call bx
stosb
inc di
inc di
jnz top
mov al,tempo
out 40h,al
in al,0x60
dec al
jnz top
sounds:
db 0xc3 ; is MIDI/RET
%ifdef music
db instrument,0x93
%ifdef switch_uart
db volume ; without switch, volume is in table
db 0x3f
%endif
%endif
table: ; first index is volume, change order with care!
db fx2-s,fx1-s,fx0-s,fx3-s,fx4-s,fx5-s,fx6-s,sounds-s,stop-s
stop:
pop ax
ret
timer:
%ifndef freedos
%ifdef safe_segment
push cs
pop ds
%endif
inc bp
%ifdef music
test bp, time_mask
jnz nomuse
mov dx,0x330
mov si,sounds
outsb
outsb
outsb
imul ax,bp,scale_mod
shr ax,10
add al,22
out dx,al
outsb
%ifdef switch_uart
inc dx
outsb
%endif
%endif
nomuse:
iret
%endif
fx0: ; tilted plane, scrolling
mov ax,0x1329
add dh,al
div dh
xchg dx,ax
imul dl
sub dx,bp
xor ah,dl
mov al,ah
and al,tilt_plate_pattern
ret
fx2: ; board of chessboards
xchg dx,ax
sub ax,bp
xor al,ah
or al,0xDB
add al,13h
ret
fx1: ; circles, zooming
mov al,dh
sub al,100
imul al
xchg dx,ax
imul al
add dh,ah
mov al,dh
add ax,bp
and al,circles_pattern
ret
fx3: ; parallax checkerboards
mov cx,bp
mov bx,-16
fx3L:
add cx,di
mov ax,819
imul cx
ror dx,1
inc bx
ja fx3L
lea ax,[bx+31]
ret
fx4: ; sierpinski rotozoomer
lea cx,[bp-2048]
sal cx,3
movzx ax,dh
movsx dx,dl
mov bx,ax
imul bx,cx
add bh,dl
imul dx,cx
sub al,dh
and al,bh
and al,0b11111100
salc ; VERY slow on dosbox, but ok
jnz fx4q
mov al,sierp_color
fx4q:
ret
fx5: ; raycast bent tunnel
mov cl,-9
fx5L:
push dx
mov al,dh
sub al,100
imul cl
xchg ax,dx
add al,cl
imul cl
mov al,dh
xor al,ah
add al,4
test al,-8
pop dx
loopz fx5L
sub cx,bp
xor al,cl
aam tunnel_pattern; VERY slow on dosbox, but ok
add al,tunnel_base_color
ret
fx6: ; ocean night / to day sky
sub dh,120
js fx6q
mov [bx+si],dx
fild word [bx+si]
fidivr dword [bx+si]
fstp dword [bx+si-1]
mov ax,[bx+si]
add ax,bp
and al,128
dec ax
fx6q:
ret
奖金-NFO / ASCII art : hammerfist
∂#MW%e _d$Ng,
'B, ∂b _jM@$QZb,cQ" )@
,edRB$b,l@ Wk,yGR$KM&$b, ,dP" Wl ]bsd%UR8BG6&$@DSyG#ZKM&$b,
,dP "T%L 'MGF "*∂R_ Tg "*4Zk,#I YP W" 7P "*∂R
4M gd@ ^ ∂@ d@b dQ$#@Z@R3L_ "*GMj 'W ,gd$ d@b 9Q$#%b
W#, `M Wb `* _4P `Qk *#N8L `H5 @b 'QR7YK `* _4F" Qk
`6@L dML '@ ,BK 'M ∂B *b, '#L
^QBb,_ _,4&M∞∂@=,_ _dGL _gQKM GL @k 'Mg,_ _dG,
"*BN5W$2#MNP" "*G3WRM8&B5P"`Y@QNW3Z5P" ∂#$W8BRM3XZN87 "*GW38M%EBDW5P"`
p r e s e n t s
4
d@,
_& `Wl
_,aP "#baedM$#@@K JP*"?ML
,ad@$#P" ,d@NEWVB" X,aQPYb,_
V@Mm,_ ,d@MW#BW' EMP" '¶R ,ngBP^fML
¶M@N@y Y#BNW#M" J9" `MQ9" "MgRBq ,QBMg,
VN#P` ,d@@ `WM@^ 7f ¶F` 7kY" ^G _.eQNE1.
]B _G@MWN$, `P ' 4b QP ¶w@F*^ ^Qb
]O@NRM#W@MNB, ; ^` j JP^ Yl
J#NRNWM@#BcT"^ ,A _J _q@ `X
'¶WM#B@WdY`,7 _G#YN#PM _,gG" M,
*BN#WP" dK ,Q@NRMB"]9 , _,M@Q* #A
"U^ V@h, iNBW#NT J' J9 s@QN" _; 'D,
¶RMBv&NMQR@9 .W .K' "9` ,6BA _JL ]l
Y#NE@W#NRP #[ `¶8 _d@MW#B_jW#W BN
"GQ@MR#W QL_ *B _,p#NBW#NQMG@WY 3Q
"Y@F ,XW@M%im,_Yb_ _,g5@#MW@QMNE@E@NRMB ,WM
` _,gP*"#REM#GB@N#MQbnd@N#M@MW#R8QSB^'WQERM@ ;4NB,
,GYKL ¶E#B8R8QSB@M@#BM#W@MNB"`_ , "^` N ,dW@Ql
_Q`'W`*t '¶@GS#MBQ#E@W#NQBW[ 'LvQ_ ,K _dNABGM#N
,F ' `^WAB@QGE9*"9^*@L jP7FY, ¶h,_.jWM#BR#GBM,
J; , _ ' ' "LL YxE#B8R8QSBNW@W;
AP _,Ag6^ _ J ¶A `"Q#M@MW#R8E#P
j@ `"XQW[ 'LvK,_ 'L_,/ @t Y#NE@WNR"
:M/ 9^*@L jP7F" _PYKL _,A; ¶RSNQ"
dKL ' ` ' "L "`'W`*t `"XQb `W^
Q`8t 'L_,/ , _ ' 9^Q
,W _PYKL _,Ag6^ ' W, _ ,#N&
!N _ J "`'W`*t `"XQW[ _ J N!_JG9^RwQ' *t
`W, 'LvK,_ ' _gGB8@L _ 'LvK,_ ,WgB' V 7L
_.,gm&@B&wBZF" j@'` "WL _gML jZd7Yb lN" dBWl
,g&QB*"^` `"*G@g, .gR&k,_ ,N" '@QF ¶k;gMF *QvQ jQ, ,@N@B#,
.eQF*` `Yb@" "*6Qg,gF , 7 XMN" 'MNB, ^¶QWSER@N;
,gP" qy, W' ^Q' &L ,g@W' `QMEL `"WBNWP
g7 ¶9 ,X M? 9" _q8MSK ¶EMt *@K
Vh _,m#L _AH le ,GBDNE9^A, *@F NMg
¶L,qQ@ND _.m@Bl We ,gM@B8#Q' ¶h_ lWE,
W9NHW@` JWM#B@] @e 4WR@NGF^ 'QL dRWl
VMd* "@BE@PM 'N *UP" VW, JRSB;
,@F j `¶WK W, ¶t XNt _A@E#N
_JP ,6& "GLdM XD, _.g8NMA@k,_ _,gG#NMGR;
"Z .JRER 'VMi _jNB#W&_ _,j@E@W#Nl ¶MBGMNQGNQMG@QBW9
¶h ,G@NRMBl `" ,d#R@M$F ¶Mg,_.gp&@@NEWVBWBMG *QMN8R8SBN$E@WF
Vb dW#R8QSRb, *YM@EQ,_ 'MENBW#NQMG#B@R@MW#l "BM@QNENRQG'
*WGS#MBMNEYL `^"*8M@Q@NRM#W@BWSNW@QBF"` `^*@QBF^ [HFT]
^M@MW#Q9 ^Wt `^¶RQ@W8NQGP*`
¶Q#@P Vk lA `"^`
Y" `MA J#,
*R@, ,MQl
Y#Wk, GWM8L
W8RQSt,_ AQ@MR#,
`@M@#SB@Mbm.,_ QNBW#NW
¶QB8R8SBN$WNRM@#GNtwg@NMQR@B'
*MBQ#8R8QS@NE@WNBW#NQMG@NR;
`WGS#MBQ#R8QSB@NE@W#NQBW9
*OMW@QMNE@E@NRMW@QMB@*
`^"YQW@Q#SB#NE@EGP
`^"*8R@GBQF`