about summary refs log blame commit diff stats
path: root/html/508circle.mu.html
blob: 91d8b440b46c8c5738108b615426c37c3decc4e3 (plain) (tree)
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# write-int: add a single int to a stream

== code
#   instruction                     effective address                                                   register    displacement    immediate
# . op          subop               mod             rm32          base        index         scale       r32
# . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes

write-int:  # out: (addr stream byte), n: int
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # . save registers
    50/push-eax
    51/push-ecx
    57/push-edi
    # edi = out
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   8/disp8         .                 # copy *(ebp+8) to edi
    # ecx = out->write
    8b/copy                         0/mod/indirect  7/rm32/edi    .           .             .           1/r32/ecx   .               .                 # copy *edi to ecx
    # if (out->write >= out->size) abort
    3b/compare                      1/mod/*+disp8   7/rm32/edi    .           .             .           1/r32/ecx   8/disp8         .                 # compare ecx with *(edi+8)
    7d/jump-if->=  $write-int:abort/disp8
$write-int:to-stream:
    # out->data[out->write] = n
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           0/r32/eax   0xc/disp8       .                 # copy *(ebp+12) to eax
    89/copy                         1/mod/*+disp8   4/rm32/sib    7/base/edi  1/index/ecx   .           0/r32/eax   0xc/disp8       .                 # copy eax to *(edi+ecx+12)
    # out->write += 4
    81          0/subop/add         0/mod/indirect  7/rm32/edi    .           .             .           .           .               4/imm32           # add to *edi
$write-int:end:
    # . restore registers
    5f/pop-to-edi
    59/pop-to-ecx
    58/pop-to-eax
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

$write-int:abort:
    # . _write(2/stderr, error)
    # . . push args
    68/push  "write-int: out of space\n"/imm32
    68/push  2/imm32/stderr
    # . . call
    e8/call  _write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # . syscall(exit, 1)
    bb/copy-to-ebx  1/imm32
    b8/copy-to-eax  1/imm32/exit
    cd/syscall  0x80/imm8
    # never gets here

test-write-int-single:
    # - check that write-int writes to first int of 'stream'
    # setup
    # . clear-stream(_test-stream)
    # . . push args
    68/push  _test-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # write-int(_test-stream, "abcd")
    # . . push args
    68/push  0x64636261/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write-int/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-stream-equal(_test-stream, "abcd", msg)
    # . . push args
    68/push  "F - test-write-int-single"/imm32
    68/push  "abcd"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  check-stream-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # . end
    c3/return

test-write-byte-buffered-multiple:
    # - check that write-int correctly appends multiple writes
    # setup
    # . clear-stream(_test-stream)
    # . . push args
    68/push  _test-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # write-int(_test-stream, "abcd")
    # . . push args
    68/push  0x64636261/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write-int/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # write-int(_test-stream, "efgh")
    # . . push args
    68/push  0x68676665/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write-int/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-stream-equal(_test-stream, "abcdefgh", msg)
    # . . push args
    68/push  "F - test-write-byte-buffered-multiple"/imm32
    68/push  "abcdefgh"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  check-stream-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # . end
    c3/return

# . . vim:nowrap:textwidth=0
ref='#n72'>72 73 74 75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154








                                                                                                               
                                                 

                       

                                                                                                 

                                     

                             
                            


                             

                                                           
                              







































                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                     








                                                                                                                           

                                                                                                                                                                                              





                                                                                              
                                                                                                                                                              




                                                                                              
                                                                                                                                                              




                                                                                              
                                                                                                                                                              




                                                                                              
                                                                                                                                                              





































                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                             












                                                                                                                                                                
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 508circle.mu</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.PreProc { color: #c000c0; }
.muRegEdx { color: #af5f00; }
.Special { color: #ff6060; }
.LineNr { }
.Constant { color: #008787; }
.muRegEcx { color: #870000; }
.Delimiter { color: #c000c0; }
.muFunction { color: #af5f00; text-decoration: underline; }
.muComment { color: #005faf; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/508circle.mu'>https://github.com/akkartik/mu/blob/main/508circle.mu</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='508circle.mu.html#L1'>draw-circle</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), cx: int, cy: int, radius: int, color: int <span class="Delimiter">{</span>
<span id="L2" class="LineNr"> 2 </span>  <span class="PreProc">var</span> x: int
<span id="L3" class="LineNr"> 3 </span>  <span class="PreProc">var</span> y: int
<span id="L4" class="LineNr"> 4 </span>  <span class="PreProc">var</span> err: int
<span id="L5" class="LineNr"> 5 </span>  <span class="muComment"># x = -r</span>
<span id="L6" class="LineNr"> 6 </span>  <span class="PreProc">var</span> tmp/eax: int <span class="Special">&lt;-</span> copy radius
<span id="L7" class="LineNr"> 7 </span>  tmp <span class="Special">&lt;-</span> negate
<span id="L8" class="LineNr"> 8 </span>  copy-to x, tmp
<span id="L9" class="LineNr"> 9 </span>  <span class="muComment"># err = 2 - 2*r</span>
<span id="L10" class="LineNr">10 </span>  tmp <span class="Special">&lt;-</span> copy radius
<span id="L11" class="LineNr">11 </span>  tmp <span class="Special">&lt;-</span> shift-left <span class="Constant">1</span>
<span id="L12" class="LineNr">12 </span>  tmp <span class="Special">&lt;-</span> negate
<span id="L13" class="LineNr">13 </span>  tmp <span class="Special">&lt;-</span> add <span class="Constant">2</span>
<span id="L14" class="LineNr">14 </span>  copy-to err, tmp
<span id="L15" class="LineNr">15 </span>  <span class="muComment">#</span>
<span id="L16" class="LineNr">16 </span>  <span class="PreProc">var</span> tmpx/<span class="muRegEcx">ecx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L17" class="LineNr">17 </span>  <span class="PreProc">var</span> tmpy/<span class="muRegEdx">edx</span>: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L18" class="LineNr">18 </span>  <span class="Delimiter">{</span>
<span id="L19" class="LineNr">19 </span>    <span class="muComment"># pixel(cx-x, cy+y)</span>
<span id="L20" class="LineNr">20 </span>    tmpx <span class="Special">&lt;-</span> copy cx
<span id="L21" class="LineNr">21 </span>    tmpx <span class="Special">&lt;-</span> subtract x
<span id="L22" class="LineNr">22 </span>    tmpy <span class="Special">&lt;-</span> copy cy
<span id="L23" class="LineNr">23 </span>    tmpy <span class="Special">&lt;-</span> add y
<span id="L24" class="LineNr">24 </span>    <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, tmpx, tmpy, color
<span id="L25" class="LineNr">25 </span>    <span class="muComment"># pixel(cx-y, cy-x)</span>
<span id="L26" class="LineNr">26 </span>    tmpx <span class="Special">&lt;-</span> copy cx
<span id="L27" class="LineNr">27 </span>    tmpx <span class="Special">&lt;-</span> subtract y
<span id="L28" class="LineNr">28 </span>    tmpy <span class="Special">&lt;-</span> copy cy
<span id="L29" class="LineNr">29 </span>    tmpy <span class="Special">&lt;-</span> subtract x
<span id="L30" class="LineNr">30 </span>    <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, tmpx, tmpy, color
<span id="L31" class="LineNr">31 </span>    <span class="muComment"># pixel(cx+x, cy-y)</span>
<span id="L32" class="LineNr">32 </span>    tmpx <span class="Special">&lt;-</span> copy cx
<span id="L33" class="LineNr">33 </span>    tmpx <span class="Special">&lt;-</span> add x
<span id="L34" class="LineNr">34 </span>    tmpy <span class="Special">&lt;-</span> copy cy
<span id="L35" class="LineNr">35 </span>    tmpy <span class="Special">&lt;-</span> subtract y
<span id="L36" class="LineNr">36 </span>    <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, tmpx, tmpy, color
<span id="L37" class="LineNr">37 </span>    <span class="muComment"># pixel(cx+y, cy+x)</span>
<span id="L38" class="LineNr">38 </span>    tmpx <span class="Special">&lt;-</span> copy cx
<span id="L39" class="LineNr">39 </span>    tmpx <span class="Special">&lt;-</span> add y
<span id="L40" class="LineNr">40 </span>    tmpy <span class="Special">&lt;-</span> copy cy
<span id="L41" class="LineNr">41 </span>    tmpy <span class="Special">&lt;-</span> add x
<span id="L42" class="LineNr">42 </span>    <a href='500fake-screen.mu.html#L483'>pixel</a> <a href='500fake-screen.mu.html#L14'>screen</a>, tmpx, tmpy, color
<span id="L43" class="LineNr">43 </span>    <span class="muComment"># r = err</span>
<span id="L44" class="LineNr">44 </span>    tmp <span class="Special">&lt;-</span> copy err
<span id="L45" class="LineNr">45 </span>    copy-to radius, tmp
<span id="L46" class="LineNr">46 </span>    <span class="muComment"># if (r &lt;= y) { ++y; err += (y*2 + 1); }</span>
<span id="L47" class="LineNr">47 </span>    <span class="Delimiter">{</span>
<span id="L48" class="LineNr">48 </span>      tmpy <span class="Special">&lt;-</span> copy y
<span id="L49" class="LineNr">49 </span>      compare radius, tmpy
<span id="L50" class="LineNr">50 </span>      <span class="PreProc">break-if-&gt;</span>
<span id="L51" class="LineNr">51 </span>      increment y
<span id="L52" class="LineNr">52 </span>      tmpy <span class="Special">&lt;-</span> copy y
<span id="L53" class="LineNr">53 </span>      tmpy <span class="Special">&lt;-</span> shift-left <span class="Constant">1</span>
<span id="L54" class="LineNr">54 </span>      tmpy <span class="Special">&lt;-</span> increment
<span id="L55" class="LineNr">55 </span>      add-to err, tmpy
<span id="L56" class="LineNr">56 </span>    <span class="Delimiter">}</span>
<span id="L57" class="LineNr">57 </span>    <span class="muComment"># if (r &gt; x || err &gt; y) { ++x; err += (x*2 + 1); }</span>
<span id="L58" class="LineNr">58 </span>    $draw-circle:second-check: <span class="Delimiter">{</span>
<span id="L59" class="LineNr">59 </span>      <span class="Delimiter">{</span>
<span id="L60" class="LineNr">60 </span>        tmpx <span class="Special">&lt;-</span> copy x
<span id="L61" class="LineNr">61 </span>        compare radius, tmpx
<span id="L62" class="LineNr">62 </span>        <span class="PreProc">break-if-&gt;</span>
<span id="L63" class="LineNr">63 </span>        tmpy <span class="Special">&lt;-</span> copy y
<span id="L64" class="LineNr">64 </span>        compare err, tmpy
<span id="L65" class="LineNr">65 </span>        <span class="PreProc">break-if-&gt;</span>
<span id="L66" class="LineNr">66 </span>        <span class="PreProc">break</span> $draw-circle:second-check
<span id="L67" class="LineNr">67 </span>      <span class="Delimiter">}</span>
<span id="L68" class="LineNr">68 </span>      increment x
<span id="L69" class="LineNr">69 </span>      tmpx <span class="Special">&lt;-</span> copy x
<span id="L70" class="LineNr">70 </span>      tmpx <span class="Special">&lt;-</span> shift-left <span class="Constant">1</span>
<span id="L71" class="LineNr">71 </span>      tmpx <span class="Special">&lt;-</span> increment
<span id="L72" class="LineNr">72 </span>      add-to err, tmpx
<span id="L73" class="LineNr">73 </span>    <span class="Delimiter">}</span>
<span id="L74" class="LineNr">74 </span>    <span class="muComment"># loop termination condition</span>
<span id="L75" class="LineNr">75 </span>    compare x, <span class="Constant">0</span>
<span id="L76" class="LineNr">76 </span>    <span class="PreProc">loop-if-&lt;</span>
<span id="L77" class="LineNr">77 </span>  <span class="Delimiter">}</span>
<span id="L78" class="LineNr">78 </span><span class="Delimiter">}</span>
<span id="L79" class="LineNr">79 </span>
<span id="L80" class="LineNr">80 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='508circle.mu.html#L80'>draw-disc</a></span> <a href='500fake-screen.mu.html#L14'>screen</a>: (addr <a href='500fake-screen.mu.html#L14'>screen</a>), cx: int, cy: int, radius: int, color: int, border-color: int <span class="Delimiter">{</span>
<span id="L81" class="LineNr">81 </span>  <span class="PreProc">var</span> r/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L82" class="LineNr">82 </span>  <span class="Delimiter">{</span>
<span id="L83" class="LineNr">83 </span>    compare r, radius
<span id="L84" class="LineNr">84 </span>    <span class="PreProc">break-if-&gt;=</span>
<span id="L85" class="LineNr">85 </span>    <a href='508circle.mu.html#L1'>draw-circle</a> <a href='500fake-screen.mu.html#L14'>screen</a>, cx cy, r, color
<span id="L86" class="LineNr">86 </span>    r <span class="Special">&lt;-</span> increment
<span id="L87" class="LineNr">87 </span>    <span class="PreProc">loop</span>
<span id="L88" class="LineNr">88 </span>  <span class="Delimiter">}</span>
<span id="L89" class="LineNr">89 </span>  <a href='508circle.mu.html#L1'>draw-circle</a> <a href='500fake-screen.mu.html#L14'>screen</a>, cx cy, r, border-color
<span id="L90" class="LineNr">90 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->