#!/opt/anaconda1anaconda2anaconda3/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2011, 2012, Wolfgang Scherer, <Wolfgang.Scherer at gmx.de>
#
# This file is part of AdHoc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>,
# or write to Wolfgang Scherer, <Wolfgang.Scherer at gmx.de>

# @:adhoc_uncomment:@
# @:adhoc_template:@ doc/index.rst
# AdHoc Standalone Python Script Generator
# ########################################
#
# The *AdHoc* compiler can be used as a program (see `Script Usage`_)
# as well as a module (see :class:`adhoc.AdHoc`).
#
# Since the *AdHoc* compiler itself is installed as a compiled *AdHoc*
# script, it serves as its own usage example.
#
# After installation of the *adhoc.py* script, the full source can be
# obtained in directory ``__adhoc__``, by executing::
#
#     adhoc.py --explode
#
# .. @@contents@@
#
# @:adhoc_template:@ doc/index.rst # off
# @:adhoc_uncomment:@

"""\
.. _Script Usage:

adhoc.py - Python ad hoc compiler.

======  ====================
usage:  adhoc.py [OPTIONS] [file ...]
or      import adhoc
======  ====================

Options
=======

  ===================== ==================================================
  -c, --compile         compile file(s) or standard input into output file
                        (default: standard output).
  -d, --decompile       decompile file(s) or standard input into
                        output directory (default ``__adhoc__``).
  -o, --output OUT      output file for --compile/output directory for
                        --decompile.

  -q, --quiet           suppress warnings
  -v, --verbose         verbose test output
  --debug[=NUM]         show debug information

  -h, --help            display this help message
  --documentation       display module documentation.

  --template list       show available templates.
  --eide[=COMM]         Emacs IDE template list (implies --template list).
  --template[=NAME]     extract named template to standard
                        output. Default NAME is ``-``.
  --extract[=DIR]       extract adhoc files to directory DIR (default: ``.``)
  --explode[=DIR]       explode script with adhoc in directory DIR
                        (default ``__adhoc__``)
  --implode             implode script with adhoc
  --install             install adhoc.py script

  -t, --test            run doc tests
  ===================== ==================================================

*adhoc.py* is compatible with Python 2.4+ and Python 3. (For Python
<2.6 the packages *stringformat* and *argparse* are needed and
included.)

.. _END_OF_HELP:

.. |=NUM| replace:: ``[=NUM]``

Script Examples
===============

Templates
---------

Sections marked by |adhoc_template| can be retrieved as templates on
standard output.

Additionally, all other files compiled into an adhoc file with one of

================ ======================
|adhoc|          ==> |adhoc_import|
|adhoc_verbatim| ==> |adhoc_template_v|
|adhoc_include|  ==> |adhoc_unpack|
================ ======================

are accessible as templates.

``python adhoc.py --template list`` provides a list of templates:

>>> ign = main('adhoc.py --template list'.split())
================================================= ================================ ================
                     Command                                  Template                   Type
================================================= ================================ ================
adhoc.py --template adhoc_test                    # !adhoc_test                    adhoc_import
adhoc.py --template adhoc_test.sub                # !adhoc_test.sub                adhoc_import
adhoc.py --template argparse_local                # !argparse_local                adhoc_import
adhoc.py --template namespace_dict                # !namespace_dict                adhoc_import
adhoc.py --template stringformat_local            # !stringformat_local            adhoc_import
adhoc.py --template use_case_000_                 # !use_case_000_                 adhoc_import
adhoc.py --template use_case_001_templates_       # !use_case_001_templates_       adhoc_import
adhoc.py --template use_case_002_include_         # !use_case_002_include_         adhoc_import
adhoc.py --template use_case_003_import_          # !use_case_003_import_          adhoc_import
adhoc.py --template use_case_005_nested_          # !use_case_005_nested_          adhoc_import
adhoc.py --template docutils.conf                 # docutils.conf                  adhoc_template_v
adhoc.py --template                               # -                              adhoc_template
adhoc.py --template README.txt                    # README.txt                     adhoc_template
adhoc.py --template adhoc_init                    # -adhoc_init                    adhoc_template
adhoc.py --template catch-stdout                  # -catch-stdout                  adhoc_template
adhoc.py --template col-param-closure             # -col-param-closure             adhoc_template
adhoc.py --template doc/USE_CASES.txt             # doc/USE_CASES.txt              adhoc_template
adhoc.py --template doc/index.rst                 # doc/index.rst                  adhoc_template
adhoc.py --template max-width-class               # -max-width-class               adhoc_template
adhoc.py --template rst-to-ascii                  # -rst-to-ascii                  adhoc_template
adhoc.py --template test                          # -test                          adhoc_template
adhoc.py --template MANIFEST.in                   # !MANIFEST.in                   adhoc_unpack
adhoc.py --template Makefile                      # !Makefile                      adhoc_unpack
adhoc.py --template README.css                    # !README.css                    adhoc_unpack
adhoc.py --template doc/Makefile                  # !doc/Makefile                  adhoc_unpack
adhoc.py --template doc/_static/adhoc-logo-32.ico # !doc/_static/adhoc-logo-32.ico adhoc_unpack
adhoc.py --template doc/adhoc-logo.svg            # !doc/adhoc-logo.svg            adhoc_unpack
adhoc.py --template doc/conf.py                   # !doc/conf.py                   adhoc_unpack
adhoc.py --template doc/make.bat                  # !doc/make.bat                  adhoc_unpack
adhoc.py --template doc/z-massage-index.sh        # !doc/z-massage-index.sh        adhoc_unpack
adhoc.py --template setup.py                      # !setup.py                      adhoc_unpack
================================================= ================================ ================

``python adhoc.py --template`` prints the standard template ``-``
(closing delimiter replaced by ellipsis):

>>> ign = main('./adhoc.py --template'.split()) #doctest: +ELLIPSIS
# @:adhoc_disable... allow modification of exploded sources in original place
sys.path.append('__adhoc__')
# @:adhoc_disable...
<BLANKLINE>
# @:adhoc_run_time... The run-time class goes here
# @:adhoc_run_time_engine... settings enabled at run-time
# @:adhoc_enable...
# RtAdHoc.flat = False
# @:adhoc_enable...
# @:adhoc_run_time_engine...
<BLANKLINE>
#import adhoc                                               # @:adhoc...

``python adhoc.py --template test`` prints the template named ``-test``.
the leading ``-`` signifies disposition to standard output:

>>> ign = main('./adhoc.py --template test'.split())
Test template.

Extract
-------

The default destination for extracting files is the current working
directory.

Files extracted consist of

- packed files generated by |adhoc_include|
- templates generated by |adhoc_verbatim|
- templates with a file destination other than standard output

``python adhoc.py --extract __adhoc_extract__`` unpacks the following files into
directory ``__adhoc_extract__``:

>>> import shutil
>>> ign = main('./adhoc.py --extract __adhoc_extract__'.split())
>>> file_list = []
>>> for dir, subdirs, files in os.walk('__adhoc_extract__'):
...     file_list.extend([os.path.join(dir, file_) for file_ in files])
>>> for file_ in sorted(file_list):
...     printf(file_)
__adhoc_extract__/MANIFEST.in
__adhoc_extract__/Makefile
__adhoc_extract__/README.css
__adhoc_extract__/README.txt
__adhoc_extract__/doc/Makefile
__adhoc_extract__/doc/USE_CASES.txt
__adhoc_extract__/doc/_static/adhoc-logo-32.ico
__adhoc_extract__/doc/adhoc-logo.svg
__adhoc_extract__/doc/conf.py
__adhoc_extract__/doc/index.rst
__adhoc_extract__/doc/make.bat
__adhoc_extract__/doc/z-massage-index.sh
__adhoc_extract__/docutils.conf
__adhoc_extract__/setup.py
__adhoc_extract__/use_case_000_.py
__adhoc_extract__/use_case_001_templates_.py
__adhoc_extract__/use_case_002_include_.py
__adhoc_extract__/use_case_003_import_.py
__adhoc_extract__/use_case_005_nested_.py
>>> shutil.rmtree('__adhoc_extract__')

Export
------

The default destination for exporting files is the
subdirectory ``__adhoc__``.

Files exported consist of

- imported modules generated by |adhoc|
- all files covered in section `Extract`_

``python adhoc.py --explode __adhoc_explode__`` unpacks the following files into
directory ``__adhoc_explode__``:

>>> import shutil
>>> ign = main('./adhoc.py --explode __adhoc_explode__'.split())
>>> file_list = []
>>> for dir, subdirs, files in os.walk('__adhoc_explode__'):
...     file_list.extend([os.path.join(dir, file_) for file_ in files])
>>> for file_ in sorted(file_list):
...     printf(file_)
__adhoc_explode__/MANIFEST.in
__adhoc_explode__/Makefile
__adhoc_explode__/README.css
__adhoc_explode__/README.txt
__adhoc_explode__/adhoc.py
__adhoc_explode__/adhoc_test/__init__.py
__adhoc_explode__/adhoc_test/sub/__init__.py
__adhoc_explode__/argparse_local.py
__adhoc_explode__/doc/Makefile
__adhoc_explode__/doc/USE_CASES.txt
__adhoc_explode__/doc/_static/adhoc-logo-32.ico
__adhoc_explode__/doc/adhoc-logo.svg
__adhoc_explode__/doc/conf.py
__adhoc_explode__/doc/index.rst
__adhoc_explode__/doc/make.bat
__adhoc_explode__/doc/z-massage-index.sh
__adhoc_explode__/docutils.conf
__adhoc_explode__/namespace_dict.py
__adhoc_explode__/rt_adhoc.py
__adhoc_explode__/setup.py
__adhoc_explode__/stringformat_local.py
__adhoc_explode__/use_case_000_.py
__adhoc_explode__/use_case_001_templates_.py
__adhoc_explode__/use_case_002_include_.py
__adhoc_explode__/use_case_003_import_.py
__adhoc_explode__/use_case_005_nested_.py
>>> shutil.rmtree('__adhoc_explode__')

File Permissions
================

- File mode is restored.
- File ownership is not restored.
- File modification times are restored.

  Since only naive datetimes are recorded, this only works correctly
  within the same timezone.

.. @:adhoc_index_only:@

AdHoc Module
============

.. @:adhoc_index_only:@
"""

# @:adhoc_uncomment:@
# @:adhoc_template:@ doc/index.rst
#
# Purpose
# =======
#
# *AdHoc* provides python scripts with
#
# - template facilities
# - default file generation
# - standalone module inclusion
#
# @:adhoc_index_only:@
# See also `Use Cases`_.
#
# @:adhoc_index_only:@
# *AdHoc* has been designed to provide an implode/explode cycle:
#
# ========  =======  =========  =======  =========
# source_0                               xsource_0
# source_1  implode             explode  xsource_1
# ...       ------>  script.py  ------>  ...
# source_n                               xsource_n
# ========  =======  =========  =======  =========
#
# where ``xsource_i === source_i``. I.e., ``diff source_i xsource_i``
# does not produce any output.
#
# Quickstart
# ==========
#
# module.py:
#
#     | # -\*- coding: utf-8 -\*-
#     | mvar = 'value'
#
# script.py:
#
#     | # -\*- coding: utf-8 -\*-
#     | # |adhoc_run_time|
#     | import module # |adhoc|
#     | print('mvar: ' + module.mvar)
#
# Compilation::
#
#     adhoc.py --compile script.py >/tmp/script-compiled.py
#
# Execution outside source directory::
#
#     cd /tmp && python script-compiled.py
#
# shows::
#
#     mvar: value
#
# Decompilation::
#
#     cd /tmp && \
#     mkdir -p __adhoc__ && \
#     adhoc.py --decompile <script-compiled.py >__adhoc__/script.py
#
# .. |@:| replace:: ``@:``
# .. |:@| replace:: ``:@``
# .. |adhoc_run_time| replace:: |@:|\ ``adhoc_run_time``\ |:@|
# .. |adhoc| replace:: |@:|\ ``adhoc``\ |:@|
#
# Description
# ===========
#
# The *AdHoc* compiler/decompiler parses text for tagged lines and
# processes them as instructions.
#
# The minimal parsed entity is a tagged line, which is any line
# containing a recognized *AdHoc* tag.
#
# All *AdHoc* tags are enclosed in delimiters (default: |@:| and |:@|). E.g:
#
#   |@:|\ adhoc\ |:@|
#
# Delimiters come in several flavors, namely line and section
# delimiters and a set of macro delimiters. By default, line and
# section delimiters are the same, but they can be defined separately.
#
# `Flags`_ are tagged lines, which denote a single option or
# command. E.g.:
#
#   | import module     # |@:|\ adhoc\ |:@|
#   | # |@:|\ adhoc_self\ |:@| my_module_name
#
# `Sections`_ are tagged line pairs, which delimit a block of
# text. The first tagged line opens the section, the second tagged
# line closes the section. E.g.:
#
#   | # |@:|\ adhoc_enable\ |:@|
#   | # disabled_command()
#   | # |@:|\ adhoc_enable\ |:@|
#
# `Macros`_ have their own delimiters (default: |@m| and |m>|). E.g.:
#
#   | # |@m|\ MACRO_NAME\ |m>|
#
# The implementation is realized as class :class:`adhoc.AdHoc` which
# is mainly used as a namespace. The run-time part of
# :class:`adhoc.AdHoc` -- which handles module import and file export
# -- is included verbatim as class :class:`RtAdHoc` in the generated
# output.
#
# Flags
# -----
#
# :|adhoc_run_time|:
#     The place where the *AdHoc* run-time code is added.  This flag must
#     be present in files, which use the |adhoc| import feature.  It
#     is not needed for the enable/disable features.
#
#     This flag is ignored, if double commented. E.g.:
#
#       | # # |adhoc_run_time|
#
# :|adhoc| [force] [flat | full]:
#     Mark import line for run-time compilation.
#
#     If ``force`` is specified, the module is imported, even if it
#     was imported before.
#
#     If ``flat`` is specified, the module is not recursively
#     exported.
#
#     If ``full`` is specified, the module is recursively
#     exported. (This parameter takes priority over ``flat``).
#
#     If neither ``flat`` nor ``full`` are specified,
#     :attr:`adhoc.AdHoc.flat` determines the export scope.
#
#     This flag is ignored, if the line is commented out. E.g.:
#
#       | # import module  # |adhoc|
#
# .. _adhoc_include:
#
# :|adhoc_include| file_spec, ...:
#     Include files for unpacking. ``file_spec`` is one of
#
#     :file:
#       ``file`` is used for both input and output.
#
#     :file ``from`` default-file:
#       ``file`` is used for input and output. if ``file`` does not
#       exist, ``default-file`` is used for input.
#
#     :source-file ``as`` output-file:
#       ``source-file`` is used for input. ``output-file`` is used for
#       output. If ``source-file`` does not exist, ``output-file`` is
#       used for input also.
#
#     This flag is ignored, if double commented. E.g.:
#
#       | # # |adhoc_include| file
#
# :|adhoc_verbatim| [flags] file_spec, ...:
#     Include files for verbatim extraction. See adhoc_include_ for
#     ``file_spec``.
#
#     The files are included as |adhoc_template_v| sections. *file* is used
#     as *export_file* mark. If *file* is ``--``, the template disposition
#     becomes standard output.
#
#     Optional flags can be any combination of ``[+|-]NUM`` for
#     indentation and ``#`` for commenting. E.g.:
#
#       | # |adhoc_verbatim| +4# my_file from /dev/null
#
#     *my_file* (or ``/dev/null``) is read, commented and indented 4
#     spaces.
#
#     If the |adhoc_verbatim| tag is already indented, the specified
#     indentation is subtracted.
#
#     This flag is ignored, if double commented. E.g.:
#
#       | # # |adhoc_verbatim| file
#
# :|adhoc_self| name ...:
#     Mark name(s) as currently compiling.  This is useful, if
#     ``__init__.py`` imports other module parts. E.g:
#
#       | import pyjsmo             # |@:|\ adhoc\ |:@|
#
#     where ``pyjsmo/__init__.py`` contains:
#
#       | # |@:|\ adhoc_self\ |:@| pyjsmo
#       | from pyjsmo.base import * # |@:|\ adhoc\ |:@|
#
# :|adhoc_compiled|:
#     If present, no compilation is done on this file. This flag is
#     added by the compiler to the run-time version.
#
# Sections
# --------
#
# :|adhoc_enable|:
#     Leading comment char and exactly one space are removed from lines
#     in these sections.
#
# :|adhoc_disable|:
#     A comment char and exactly one space are added to non-blank
#     lines in these sections.
#
# :|adhoc_template| -mark | export_file:
#     If mark starts with ``-``, the output disposition is standard output
#     and the template is ignored, when exporting.
#
#     Otherwise, the template is written to output_file during export.
#
#     All template parts with the same mark/export_file are concatenated
#     to a single string.
#
# :|adhoc_template_v| export_file:
#     Variation of |adhoc_template|. Automatically generated by |adhoc_verbatim|.
#
# :|adhoc_uncomment|:
#     Treated like |adhoc_enable| before template output.
#
# :|adhoc_indent| [+|-]NUM:
#     Add or remove indentation before template output.
#
# :|adhoc_import|:
#     Imported files are marked as such by the compiler. There is no
#     effect during compilation.
#
# :|adhoc_unpack|:
#     Included files are marked as such by the compiler. There is no
#     effect during compilation.
#
# :|adhoc_remove|:
#     Added sections are marked as such by the compiler. Removal is
#     done when exporting.
#
#     Before compilation, existing |adhoc_remove| tags are renamed to
#     |adhoc_remove_|.
#
#     After automatically added |adhoc_remove| sections have been
#     removed during export, remaining |adhoc_remove_| tags are
#     renamed to |adhoc_remove| again.
#
#     .. note:: Think twice, before removing material from original
#        sources at compile time. It will violate the condition
#        ``xsource_i === source_i``.
#
# :|adhoc_run_time_engine|:
#     The run-time class :class:`RtAdHoc` is enclosed in this special
#     template section.
#
#     It is exported as ``rt_adhoc.py`` during export.
#
# Macros
# ------
#
# Macros are defined programmatically::
#
#     AdHoc.macros[MACRO_NAME] = EXPANSION_STRING
#
# A macro is invoked by enclosing a MACRO_NAME in
# :attr:`adhoc.AdHoc.macro_call_delimiters`. (Default: |@m|, |m>|).
#
# :|MACRO_NAME|:
#     Macro call.
#
# Internal
# --------
#
# :|adhoc_run_time_class|:
#     Marks the beginning of the run-time class.  This is only
#     recognized in the *AdHoc* programm/module.
#
# :|adhoc_run_time_section|:
#     All sections are concatenated and used as run-time code.  This is
#     only recognized in the *AdHoc* programm/module.
#
# In order to preserve the ``xsource_i === source_i`` bijective
# condition, macros are expanded/collapsed with special macro
# definition sections. (See :attr:`adhoc.AdHoc.macro_xdef_delimiters`;
# Default: |<m|, |m@|).
#
# :|adhoc_macro_call|:
#     Macro call section.
#
# :|adhoc_macro_expansion|:
#     Macro expansion section.
#
# @:adhoc_template:@ doc/index.rst # off
# @:adhoc_uncomment:@

# @:adhoc_uncomment:@
# @:adhoc_template:@ doc/index.rst
# @:adhoc_index_only:@
#
# .. include:: USE_CASES.txt
# @:adhoc_index_only:@
#
# AdHoc Script
# ============
# @:adhoc_index_only:@
#
# .. automodule:: adhoc
#     :members:
#     :show-inheritance:
#
# .. _namespace_dict:
#
# NameSpace/NameSpaceDict
# =======================
#
# .. automodule:: namespace_dict
#     :members:
#     :show-inheritance:
#
# @:adhoc_index_only:@
# @:adhoc_template:@ doc/index.rst # off
# @:adhoc_uncomment:@

# @:adhoc_uncomment:@
# @:adhoc_template:@ doc/index.rst
#
# .. |adhoc_self| replace:: |@:|\ ``adhoc_self``\ |:@|
# .. |adhoc_include| replace:: |@:|\ ``adhoc_include``\ |:@|
# .. |adhoc_verbatim| replace:: |@:|\ ``adhoc_verbatim``\ |:@|
# .. |adhoc_compiled| replace:: |@:|\ ``adhoc_compiled``\ |:@|
# .. |adhoc_enable| replace:: |@:|\ ``adhoc_enable``\ |:@|
# .. |adhoc_disable| replace:: |@:|\ ``adhoc_disable``\ |:@|
# .. |adhoc_template| replace:: |@:|\ ``adhoc_template``\ |:@|
# .. |adhoc_template_v| replace:: |@:|\ ``adhoc_template_v``\ |:@|
# .. |adhoc_uncomment| replace:: |@:|\ ``adhoc_uncomment``\ |:@|
# .. |adhoc_indent| replace:: |@:|\ ``adhoc_indent``\ |:@|
# .. |adhoc_import| replace:: |@:|\ ``adhoc_import``\ |:@|
# .. |adhoc_unpack| replace:: |@:|\ ``adhoc_unpack``\ |:@|
# .. |adhoc_remove| replace:: |@:|\ ``adhoc_remove``\ |:@|
# .. |adhoc_remove_| replace:: |@:|\ ``adhoc_remove_``\ |:@|
# .. |adhoc_run_time_class| replace:: |@:|\ ``adhoc_run_time_class``\ |:@|
# .. |adhoc_run_time_section| replace:: |@:|\ ``adhoc_run_time_section``\ |:@|
# .. |adhoc_run_time_engine| replace:: |@:|\ ``adhoc_run_time_engine``\ |:@|
# .. |@m| replace:: ``@|:``
# .. |m>| replace:: ``:|>``
# .. |<m| replace:: ``<|:``
# .. |m@| replace:: ``:|@``
# .. |MACRO_NAME| replace:: |@m|\ ``MACRO_NAME``\ |m>|
# .. |adhoc_macro_call| replace:: |<m|\ ``adhoc_macro_call``\ |m@|
# .. |adhoc_macro_expansion| replace:: |<m|\ ``adhoc_macro_expansion``\ |m@|
#
# @:adhoc_template:@ doc/index.rst # off
# @:adhoc_uncomment:@

# --------------------------------------------------
# |||:sec:||| COMPATIBILITY
# --------------------------------------------------

import sys
# (progn (forward-line 1) (snip-insert-mode "py.b.printf" t) (insert "\n"))
# adapted from http://www.daniweb.com/software-development/python/code/217214
try:
    printf = eval("print") # python 3.0 case
except SyntaxError:
    printf_dict = dict()
    try:
        exec("from __future__ import print_function\nprintf=print", printf_dict)
        printf = printf_dict["printf"] # 2.6 case
    except SyntaxError:
        def printf(*args, **kwd): # 2.4, 2.5, define our own Print function
            fout = kwd.get("file", sys.stdout)
            w = fout.write
            if args:
                w(str(args[0]))
            sep = kwd.get("sep", " ")
            for a in args[1:]:
                w(sep)
                w(str(a))
            w(kwd.get("end", "\n"))
    del printf_dict

# (progn (forward-line 1) (snip-insert-mode "py.f.isstring" t) (insert "\n"))
# hide from 2to3
exec('''
def isstring(obj):
    return isinstance(obj, basestring)
''')
try:
    isstring("")
except NameError:
    def isstring(obj):
        return isinstance(obj, str) or isinstance(obj, bytes)

# (progn (forward-line 1) (snip-insert-mode "py.b.dict_items" t) (insert "\n"))
try:
    getattr(dict(), 'iteritems')
    ditems  = lambda d: getattr(d, 'iteritems')()
    dkeys   = lambda d: getattr(d, 'iterkeys')()
    dvalues = lambda d: getattr(d, 'itervalues')()
except AttributeError:
    ditems  = lambda d: getattr(d, 'items')()
    dkeys   = lambda d: getattr(d, 'keys')()
    dvalues = lambda d: getattr(d, 'values')()

import os
import re

# --------------------------------------------------
# |||:sec:||| CONFIGURATION
# --------------------------------------------------

dbg_comm = ((('dbg_comm' in globals()) and (globals()['dbg_comm'])) or ('# '))
dbg_twid = ((('dbg_twid' in globals()) and (globals()['dbg_twid'])) or (9))
dbg_fwid = ((('dbg_fwid' in globals()) and (globals()['dbg_fwid'])) or (23))

# (progn (forward-line 1) (snip-insert-mode "py.b.dbg.setup" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.strings" t) (insert "\n"))
def _uc(string):                                           # ||:fnc:||
    return unicode(string, 'utf-8')
try:
    _uc("")
except NameError:
    _uc = lambda x: x

uc_type = type(_uc(""))

def uc(value):                                             # ||:fnc:||
    if isstring(value) and not isinstance(value, uc_type):
        return _uc(value)
    return value

def _utf8str(string):                                      # ||:fnc:||
    if isinstance(string, uc_type):
        return string.encode('utf-8')
    return string

def utf8str(value):                                        # ||:fnc:||
    if isstring(value):
        return _utf8str(value)
    return value

def _nativestr(string):                                    # ||:fnc:||
    # for python3, unicode strings have type str
    if isinstance(string, str):
        return string
    # for python2, encode unicode strings to utf-8 strings
    if isinstance(string, uc_type):
        return string.encode('utf-8')
    try:
        return str(string.decode('utf-8'))
    except UnicodeDecodeError:
        return string

def nativestr(value):                                      # ||:fnc:||
    if isstring(value):
        return _nativestr(value)
    return value

# (progn (forward-line 1) (snip-insert-mode "py.f.strclean" t) (insert "\n"))
def strclean(value):
    '''Make a copy of any structure with all strings converted to
    native strings.

    :func:`strclean` is good for :meth:`__str__` methods.

    It is needed for doctest output that should be compatible with
    both python2 and python3.

    The output structure is not necessarily an exact copy of the input
    structure, since objects providing iterator or item interfaces are
    only copied through those!
    '''
    if isstring(value):
        return _nativestr(value)
    if hasattr(value, 'items'):
        try:
            out = type(value)()
        except:
            (t, e, tb) = sys.exc_info() # |:debug:|
            printf(''.join(traceback.format_tb(tb)), file=sys.stderr)
            printe('OOPS: ' + t.__name__ + ': ' + str(e) + ' [' + str(value.__class__.__name__) + '] [' + str(value) + ']')
        for k, v in value.items():
            out[strclean(k)] = strclean(v)
        return out
    if hasattr(value, '__iter__') or hasattr(value, 'iter'):
        if isinstance(value, tuple):
            out = []
        else:
            out = type(value)()
        for e in value:
            out.append(strclean(e))
        if isinstance(value, tuple):
            out = type(value)(out)
        return out
    return value

# (progn (forward-line 1) (snip-insert-mode "py.f.issequence" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.logging" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.ordereddict" t) (insert "\n"))

# (progn (forward-line 1) (snip-insert-mode "py.main.pyramid.activate" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.main.project.libdir" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.main.sql.alchemy" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.main.sql.ws" t) (insert "\n"))

# The standard template should be something useful

# @:adhoc_uncomment:@
# @:adhoc_template:@ -
# # @:adhoc_disable:@ allow modification of exploded sources in original place
# sys.path.append('__adhoc__')
# # @:adhoc_disable:@
# @:adhoc_template:@
# @:adhoc_uncomment:@

# @:adhoc_run_time:@
# @:adhoc_remove:@
# @:adhoc_run_time_engine:@
# -*- coding: utf-8 -*-
# @:adhoc_compiled:@ 2014-03-23 03:03:45.660522
import sys
import os
import re

# @:adhoc_uncomment:@
# @:adhoc_template:@ -catch-stdout
try:
    from cStringIO import StringIO as _AdHocBytesIO, StringIO as _AdHocStringIO
except ImportError:
    try:
        from StringIO import StringIO as _AdHocBytesIO, StringIO as _AdHocStringIO
    except ImportError:
        from io import BytesIO as _AdHocBytesIO, StringIO as _AdHocStringIO

# @:adhoc_template:@
# @:adhoc_uncomment:@
class RtAdHoc(object):                                     # |||:cls:|||
    line_delimiters = ('@:', ':@')
    section_delimiters = ('@:', ':@')

    template_process_hooks = {}
    extra_templates = []

    export_dir = '__adhoc__'
    extract_dir = '.'
    flat = True
    forced = False

    frozen = False

    quiet = False
    verbose = False
    debug = False

    include_path = []
    export_need_init = {}
    export_have_init = {}
    extract_warn = False

    def _adhoc_string_util():
        def isstring(obj):
            return isinstance(obj, basestring)
        try:
            isstring("")
        except NameError:
            def isstring(obj):
                return isinstance(obj, str) or isinstance(obj, bytes)
        def _uc(string):
            return unicode(string, 'utf-8')
        try:
            _uc("")
        except NameError:
            _uc = lambda x: x
        uc_type = type(_uc(""))
        def uc(value):
            if isstring(value) and not isinstance(value, uc_type):
                return _uc(value)
            return value
        return staticmethod(isstring), uc_type, staticmethod(uc)

    isstring, uc_type, uc = _adhoc_string_util()

    @staticmethod
    def adhoc_tag(symbol_or_re, delimiters, is_re=False):    # |:fnc:|
        ldlm = delimiters[0]
        rdlm = delimiters[1]
        if is_re:
            ldlm = re.escape(ldlm)
            rdlm = re.escape(rdlm)
        return ''.join((ldlm, symbol_or_re, rdlm))

    @classmethod
    def tag_split(cls, string, tag, is_re=False):            # |:fnc:|
        if not is_re:
            tag = re.escape(tag)
        ro = re.compile(''.join(('^[^\n]*(', tag, ')[^\n]*$')), re.M)
        result = []
        last_end = 0
        string = cls.decode_source(string)
        for mo in re.finditer(ro, string):
            start = mo.start(0)
            end = mo.end(0)
            result.append((False, string[last_end:start]))
            result.append((True, string[start:end+1]))
            last_end = end+1
        result.append((False, string[last_end:]))
        return result

    @classmethod
    def adhoc_parse_line(cls, tagged_line, symbol_or_re=None, # |:clm:|
                         delimiters=None, is_re=False, strip_comment=None):
        if delimiters is None:
            delimiters = cls.line_delimiters
        if symbol_or_re is None:
            dlm = delimiters[1]
            if dlm:
                symbol_or_re = ''.join(('[^', dlm[0], ']+'))
            else:
                symbol_or_re = ''.join(('[^\\s]+'))
            is_re = True
        if not is_re:
            symbol_or_re = re.escape(symbol_or_re)
        tag_rx = cls.adhoc_tag(''.join(('(', symbol_or_re, ')')), delimiters, is_re=True)
        mo = re.search(tag_rx, tagged_line)
        if mo:
            ptag = mo.group(1)
        else:
            ptag = ''
        strip_rx = ''.join(('^.*', tag_rx, '\\s*'))
        tag_arg = re.sub(strip_rx, '', tagged_line).strip()
        if strip_comment:
            tag_arg = re.sub('\\s*#.*', '', tag_arg)
        return (ptag, tag_arg)

    @classmethod
    def set_delimiters(cls, line_delimiters=None, section_delimiters=None): # |:clm:|
        delimiter_state = (cls.line_delimiters, cls.section_delimiters)
        if line_delimiters is None:
            line_delimiters = delimiter_state[0]
            if section_delimiters is None:
                section_delimiters = delimiter_state[1]
        elif section_delimiters is None:
            section_delimiters = line_delimiters
        cls.line_delimiters, cls.section_delimiters = (
            line_delimiters, section_delimiters)
        return delimiter_state

    @classmethod
    def reset_delimiters(cls, delimiter_state):              # |:clm:|
        cls.line_delimiters, cls.section_delimiters = delimiter_state

    @classmethod
    def inc_delimiters(cls):                                 # |:clm:|

        inc_first = lambda dlm: (((not dlm) and ('')) or (dlm[0] + dlm))
        inc_last = lambda dlm: (((not dlm) and ('')) or (dlm + dlm[-1]))
        outer_delimiters = [(inc_first(dlm[0]), inc_last(dlm[1]))
                            for dlm in (cls.line_delimiters,
                                        cls.section_delimiters)]
        return cls.set_delimiters(*outer_delimiters)

    @classmethod
    def line_tag(cls, symbol_or_re, is_re=False):            # |:clm:|
        return cls.adhoc_tag(symbol_or_re, cls.line_delimiters, is_re)

    @classmethod
    def section_tag(cls, symbol_or_re, is_re=False):         # |:clm:|
        return cls.adhoc_tag(symbol_or_re, cls.section_delimiters, is_re)

    @classmethod
    def tag_lines(cls, string, tag, is_re=False):            # |:clm:|
        result = []
        for section in cls.tag_split(string, tag, is_re):
            if section[0]:
                result.append(section[1])
        return result

    @classmethod
    def tag_partition(cls, string, tag, is_re=False, headline=False): # |:clm:|
        in_section = False
        body_parts = []
        sections = []
        tagged_line = ''
        for section in cls.tag_split(string, tag, is_re):
            if section[0]:
                in_section = not in_section
                tagged_line = section[1]
                continue
            if in_section:
                if headline:
                    sections.append((tagged_line, section[1]))
                else:
                    sections.append(section[1])
            else:
                body_parts.append(section[1])
        return body_parts, sections

    @classmethod
    def tag_sections(cls, string, tag, is_re=False, headline=False): # |:clm:|
        body_parts, sections = cls.tag_partition(string, tag, is_re, headline)
        return sections

    @classmethod
    def line_tag_parse(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        return cls.adhoc_parse_line(tagged_line, symbol_or_re, cls.line_delimiters,
                                    is_re, strip_comment=strip_comment)

    @classmethod
    def line_tag_strip(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        return cls.line_tag_parse(tagged_line, symbol_or_re, is_re, strip_comment)[1]

    @classmethod
    def section_tag_parse(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        return cls.adhoc_parse_line(tagged_line, symbol_or_re, cls.section_delimiters,
                                    is_re, strip_comment=strip_comment)

    @classmethod
    def section_tag_strip(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        return cls.section_tag_parse(tagged_line, symbol_or_re, is_re, strip_comment)[1]

    @classmethod
    def transform_lines(cls, transform, string,              # |:clm:|
                        symbol_or_re, is_re=False, delimiters=None):
        if delimiters is None:
            delimiters = cls.line_delimiters
        result = []
        in_section = False
        for section in cls.tag_split(
            string, cls.adhoc_tag(symbol_or_re, delimiters, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                blob = transform(blob)
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def transform_sections(cls, transform, string,           # |:clm:|
                           symbol_or_re, is_re=False):
        result = []
        in_section = False
        headline = ''
        for section in cls.tag_split(
            string, cls.section_tag(symbol_or_re, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                if in_section:
                    headline = blob
                    continue
            elif in_section:
                blob, headline = transform(blob, headline)
                result.append(headline)
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def line_tag_rename(cls, string, symbol_or_re, renamed, is_re=False, delimiters=None): # |:clm:|
        if is_re:
            transform = lambda blob: re.sub(symbol_or_re, renamed, blob)
        else:
            transform = lambda blob: blob.replace(symbol_or_re, renamed)
        return cls.transform_lines(transform, string, symbol_or_re, is_re, delimiters)

    @classmethod
    def line_tag_remove(cls, string, symbol_or_re, is_re=False, delimiters=None): # |:clm:|
        transform = lambda blob: ''
        return cls.transform_lines(transform, string, symbol_or_re, is_re, delimiters)

    @classmethod
    def section_tag_rename(cls, string, symbol_or_re, renamed, is_re=False): # |:clm:|
        if is_re:
            transform = lambda blob: re.sub(symbol_or_re, renamed, blob)
        else:
            transform = lambda blob: blob.replace(symbol_or_re, renamed)
        return cls.transform_lines(transform, string, symbol_or_re, is_re, cls.section_delimiters)

    @classmethod
    def section_tag_remove(cls, string, symbol_or_re, is_re=False): # |:clm:|
        transform = lambda blob: ''
        return cls.transform_lines(transform, string, symbol_or_re, is_re, cls.section_delimiters)

    @classmethod
    def indent_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        result = []
        in_section = False
        indent = 0
        for section in cls.tag_split(
            string, cls.section_tag(symbol_or_re, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                if in_section:
                    tag_arg = cls.section_tag_strip(blob)
                    if tag_arg:
                        indent = int(tag_arg)
                    else:
                        indent = -4
            else:
                if in_section and indent:
                    if indent < 0:
                        rx = re.compile(''.join(('^', ' ' * (-indent))), re.M)
                        blob = rx.sub('', blob)
                    elif indent > 0:
                        rx = re.compile('^', re.M)
                        blob = rx.sub(' ' * indent, blob)
                    indent = 0
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def enable_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        enable_ro = re.compile('^([ \t\r]*)(# ?)', re.M)
        enable_sub = '\\1'
        transform = lambda blob, hl: (enable_ro.sub(enable_sub, blob), hl)
        return cls.transform_sections(transform, string, symbol_or_re, is_re)

    adhoc_rx_tab_check = re.compile('^([ ]*\t)', re.M)
    adhoc_rx_disable_simple = re.compile('^', re.M)
    adhoc_rx_min_indent_check = re.compile('^([ ]*)([^ \t\r\n]|$)', re.M)

    @classmethod
    def disable_transform(cls, section, headline=None):      # |:clm:|
        if not section:
            return (section, headline)

        if cls.adhoc_rx_tab_check.search(section):
            # tabs are evil
            if cls.verbose:
                list(map(sys.stderr.write,
                         ('# dt: evil tabs: ', repr(section), '\n')))
            return (
                cls.adhoc_rx_disable_simple.sub(
                    '# ', section.rstrip()) + '\n',
                headline)

        min_indent = ''
        for mo in cls.adhoc_rx_min_indent_check.finditer(section):
            indent = mo.group(1)
            if indent:
                if (not min_indent or len(min_indent) > len(indent)):
                    min_indent = indent
            elif mo.group(2):
                min_indent = ''
                break
        adhoc_rx_min_indent = re.compile(
            ''.join(('^(', min_indent, '|)([^\n]*)$')), re.M)

        if section.endswith('\n'):
            section = section[:-1]
        dsection = []
        for mo in adhoc_rx_min_indent.finditer(section):
            indent = mo.group(1)
            rest = mo.group(2)
            if not indent and not rest:
                #leave blank lines blank
                dsection.append('\n')
            else:
                dsection.extend((indent, '# ', rest, '\n'))
        return (''.join(dsection), headline)

    @classmethod
    def disable_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        return cls.transform_sections(
            cls.disable_transform, string, symbol_or_re, is_re)

    @classmethod
    def remove_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        ah_retained, ah_removed = cls.tag_partition(
            string, cls.section_tag(symbol_or_re, is_re), is_re)
        return ''.join(ah_retained)

    @staticmethod
    def check_coding(source):                                # |:fnc:|
        if source:
            eol_seen = 0
            for c in source:
                if isinstance(c, int):
                    lt_ = lambda a, b: a < b
                    chr_ = lambda a: chr(a)
                else:
                    lt_ = lambda a, b: True
                    chr_ = lambda a: a
                break
            check = []
            for c in source:
                if lt_(c, 127):
                    check.append(chr_(c))
                if c == '\n':
                    eol_seen += 1
                    if eol_seen == 2:
                        break
            check = ''.join(check)
            mo = re.search('-[*]-.*coding:\\s*([^;\\s]+).*-[*]-', check)
        else:
            mo = None
        if mo:
            coding = mo.group(1)
        else:
            coding = 'utf-8'
        return coding

    @classmethod
    def decode_source(cls, source):                          # |:clm:|
        if not source:
            return cls.uc('')
        if not isinstance(source, cls.uc_type) and hasattr(source, 'decode'):
            source = source.decode(cls.check_coding(source))
        return source

    @classmethod
    def encode_source(cls, source):                          # |:clm:|
        if not source:
            return ''.encode('utf-8')
        if isinstance(source, cls.uc_type) and hasattr(source, 'encode'):
            source = source.encode(cls.check_coding(source))
        return source

    @classmethod
    def read_source(cls, file_, decode=True):                # |:clm:|
        source = None
        if not file_ or file_ == '-':
            # Python3 has a buffer attribute for binary input.
            if hasattr(sys.stdin, 'buffer'):
                source = sys.stdin.buffer.read()
            else:
                source = sys.stdin.read()
        else:
            try:
                sf = open(file_, 'rb')
                source = sf.read()
                sf.close()
            except IOError:
                for module in sys.modules.values():
                    if (module
                        and hasattr(module, '__file__')
                        and module.__file__ == file_):
                        if (hasattr(module, '__adhoc__')
                            and hasattr(module.__adhoc__, 'source')):
                            source = module.__adhoc__.source
                            break
        if source is None:
            raise IOError('source not found for `' + str(file_) + '`')
        if decode:
            return cls.decode_source(source)
        return source

    @classmethod
    def write_source(cls, file_, source, mtime=None, mode=None): # |:clm:|
        esource = cls.encode_source(source)
        if not file_ or file_ == '-':
            if hasattr(sys.stdout, 'buffer'):
                sys.stdout.buffer.write(esource)
            else:
                try:
                    sys.stdout.write(esource)
                except TypeError:
                    sys.stdout.write(source)
        else:
            sf = open(file_, 'wb')
            sf.write(esource)
            sf.close()
            if mode is not None:
                os.chmod(file_, mode)
            if mtime is not None:
                import datetime
                if cls.isstring(mtime):
                    try:
                        date, ms = mtime.split('.')
                    except ValueError:
                        date = mtime
                        ms = 0
                    mtime = cls.strptime(date, '%Y-%m-%dT%H:%M:%S')
                    mtime += datetime.timedelta(microseconds=int(ms))
                if isinstance(mtime, datetime.datetime):
                    ts = int(mtime.strftime("%s"))
                else:
                    ts = mtime
                os.utime(file_, (ts, ts))

    @classmethod
    def check_xfile(cls, file_, xdir=None):                  # |:clm:|
        if xdir is None:
            xdir = cls.extract_dir
        if not file_:
            file_ = '-'
        if file_ == '-':
            return file_
        file_ = os.path.expanduser(file_)
        if os.path.isabs(file_):
            xfile = file_
        else:
            xfile = os.path.join(xdir, file_)
        xfile = os.path.abspath(xfile)
        if os.path.exists(xfile):
            # do not overwrite files
            if (cls.extract_warn or (cls.verbose)) and not cls.quiet:
                list(map(sys.stderr.write, (
                    "# xf: ", cls.__name__, ": warning file `", file_,
                    "` exists. skipping ...\n")))
            return None
        xdir = os.path.dirname(xfile)
        if not os.path.exists(xdir):
            os.makedirs(xdir)
        return xfile

    @classmethod
    def pack_file(cls, source, zipped=True):                 # |:clm:|
        import base64, gzip
        if zipped:
            sio = _AdHocBytesIO()
            gzf = gzip.GzipFile('', 'wb', 9, sio)
            gzf.write(cls.encode_source(source))
            gzf.close()
            source = sio.getvalue()
            sio.close()
        else:
            source = cls.encode_source(source)
        source = base64.b64encode(source)
        source = source.decode('ascii')
        return source

    @classmethod
    def unpack_file(cls, source64, zipped=True, decode=True): # |:clm:|
        import base64, gzip
        source = source64.encode('ascii')
        source = base64.b64decode(source)
        if zipped:
            sio = _AdHocBytesIO(source)
            gzf = gzip.GzipFile('', 'rb', 9, sio)
            source = gzf.read()
            gzf.close()
            sio.close()
        if decode:
            source = cls.decode_source(source)
        return source

    @classmethod
    def unpack_(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                mode=None, zipped=True, flat=None, source64=None):
        xfile = cls.check_xfile(file_, cls.extract_dir)
        if xfile is None:
            return
        if cls.verbose:
            list(map(sys.stderr.write,
                     ("# xf: ", cls.__name__, ": unpacking `", file_, "`\n")))
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        cls.write_source(xfile, source, mtime, mode)

    @classmethod
    def strptime(cls, date_string, format_):                 # |:clm:|
        import datetime
        if hasattr(datetime.datetime, 'strptime'):
            strptime_ = datetime.datetime.strptime
        else:
            import time
            strptime_ = lambda date_string, format_: (
                datetime.datetime(*(time.strptime(date_string, format_)[0:6])))
        return strptime_(date_string, format_)

    @classmethod
    def import_(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                mode=None, zipped=True, flat=None, source64=None):
        import datetime
        import time

        module = cls.module_setup(mod_name)

        if mtime is None:
            mtime = datetime.datetime.fromtimestamp(0)
        else:
            # mtime=2011-11-23T18:04:26[.218506], zipped=True, flat=None, source64=
            try:
                date, ms = mtime.split('.')
            except ValueError:
                date = mtime
                ms = 0
            mtime = cls.strptime(date, '%Y-%m-%dT%H:%M:%S')
            mtime += datetime.timedelta(microseconds=int(ms))

        source = cls.unpack_file(source64, zipped=zipped, decode=False)

        mod_parts = mod_name.split('.')
        mod_child = mod_parts[-1]
        parent = '.'.join(mod_parts[:-1])
        old_mtime = module.__adhoc__.mtime
        module = cls.module_setup(mod_name, file_, mtime, source, mode)
        if len(parent) > 0:
            setattr(sys.modules[parent], mod_child, module)

        if module.__adhoc__.mtime != old_mtime:
            source = cls.encode_source(module.__adhoc__.source)
            exec(source, module.__dict__)

    @classmethod
    def module_setup(cls, module=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                     source=None, mode=None):
        m = 'ms: '
        class Attr:                                          # |:cls:|
            pass

        import types, datetime, os
        if not isinstance(module, types.ModuleType):
            mod_name = module
            if mod_name is None:
                mod_name = __name__
            try:
                if mod_name not in sys.modules:
                    __import__(mod_name)
                module = sys.modules[mod_name]
            except (ImportError, KeyError):
                import imp
                module = imp.new_module(mod_name)
                sys.modules[mod_name] = module
        else:
            mod_name = module.__name__

        if mtime is None:
            if (file_ is not None
                or source is not None):
                # the info is marked as outdated
                mtime = datetime.datetime.fromtimestamp(1)
            else:
                # the info is marked as very outdated
                mtime = datetime.datetime.fromtimestamp(0)

        if not hasattr(module, '__adhoc__'):
            adhoc = Attr()
            setattr(module, '__adhoc__', adhoc)
            setattr(adhoc, '__module__', module)

            mtime_set = None
            mode_set = mode
            if hasattr(module, '__file__'):
                module_file = module.__file__
                if module_file.endswith('.pyc'):
                    module_file = module_file[:-1]
                if os.access(module_file, os.R_OK):
                    stat = os.stat(module_file)
                    mtime_set = datetime.datetime.fromtimestamp(
                        stat.st_mtime)
                    mode_set = stat.st_mode
            if mtime_set is None:
                # the info is marked as very outdated
                mtime_set = datetime.datetime.fromtimestamp(0)
            adhoc.mtime = mtime_set
            adhoc.mode = mode_set
        else:
            adhoc = module.__adhoc__

        if (mtime > adhoc.mtime
            or not hasattr(module, '__file__')):
            if file_ is not None:
                setattr(module, '__file__', file_)
                if os.access(file_, os.R_OK):             # |:api_fi:|
                    stat = os.stat(file_)
                    adhoc.mtime = datetime.datetime.fromtimestamp(
                        stat.st_mtime)
                    adhoc.mode = stat.st_mode
                    if adhoc.mtime > mtime:
                        # the file on disk is newer than the adhoc'ed source
                        try:
                            delattr(adhoc, 'source')
                        except AttributeError:
                            pass
                        source = None

        if (mtime > adhoc.mtime
            or not hasattr(adhoc, 'source')):
            if source is not None:
                adhoc.source = source
                adhoc.mtime = mtime
                adhoc.mode = mode

        if not hasattr(adhoc, 'source'):
            try:
                file_ = module.__file__
                file_, source = cls.std_source_param(file_, source)
                adhoc.source = source
            except (AttributeError, IOError):
                pass

        return module

    @classmethod
    def std_source_param(cls, file_=None, source=None): # |:clm:||:api_fi:|
        if file_ is None:
            file_ = __file__
        if file_.endswith('.pyc'):
            file_ = file_[:-1]
        if source is None:
            source = cls.read_source(file_)
        return (file_, source)

    @classmethod
    def export_source(cls, string, no_remove=False, no_disable=False): # |:clm:|
        string = cls.collapse_macros(string)
        if not no_remove:
            string = cls.remove_sections(string, 'adhoc_remove')
        string = cls.remove_sections(string, 'adhoc_import')
        string = cls.remove_sections(string, 'adhoc_unpack')
        string = cls.remove_sections(string, 'adhoc_template_v')
        if not no_disable:
            string = cls.enable_sections(string, 'adhoc_disable')
            string = cls.disable_sections(string, 'adhoc_enable')
        if not no_remove:
            string = cls.section_tag_rename(string, 'adhoc_remove_', 'adhoc_remove')
        return string

    @classmethod
    def unpack(cls, file_=None, source=None):                # |:clm:|
        file_, source = cls.std_source_param(file_, source)
        source_sections, unpack_sections = cls.tag_partition(
            source, cls.section_tag('adhoc_unpack'))
        sv_extract_warn = cls.extract_warn
        cls.extract_warn = True
        unpack_call = ''.join((cls.__name__, '.unpack_'))
        for unpack_section in unpack_sections:
            unpack_section = re.sub('^\\s+', '', unpack_section)
            unpack_section = re.sub(
                '^[^(]*(?s)', unpack_call, unpack_section)
            try:
                #RtAdHoc = cls # unpack_call takes care of this
                exec(unpack_section.lstrip(), globals(), locals())
            except IndentationError:
                sys.stderr.write("!!! IndentationError !!!\n")
        cls.extract_warn = sv_extract_warn

    @classmethod
    def extract(cls, file_=None, source=None):               # |:clm:|
        cls.unpack(file_, source)
        cls.extract_templates(file_, source, export=True)

    @classmethod
    def export__(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                 mode=None, zipped=True, flat=None, source64=None):
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        if file_ is None:
            return
        file_base = os.path.basename(file_)
        if file_base.startswith('__init__.py'):
            is_init = True
        else:
            is_init = False

        parts = mod_name.split('.')
        base = parts.pop()
        if parts:
            module_dir = os.path.join(*parts)
            cls.export_need_init[module_dir] = True
        else:
            module_dir = ''
        if is_init:
            module_dir = os.path.join(module_dir, base)
            cls.export_have_init[module_dir] = True
        module_file = os.path.join(module_dir, file_base)

        cls.export_(source, module_file, mtime, mode, flat)

    @classmethod
    def export_(cls, source, file_, mtime, mode, flat=None): # |:clm:|
        cflat = cls.flat
        if flat is None:
            flat = cflat
        cls.flat = flat
        if not flat:
            # extract to export directory
            sv_extract_dir = cls.extract_dir
            cls.extract_dir = cls.export_dir
            cls.extract(file_, source)
            cls.extract_dir = sv_extract_dir

            source_sections, import_sections = cls.tag_partition(
                source, cls.section_tag('adhoc_import'))
            source = cls.export_source(''.join(source_sections))
            export_call = ''.join((cls.__name__, '.export__'))

            xfile = cls.check_xfile(file_, cls.export_dir)
            if xfile is not None:
                cls.write_source(xfile, source, mtime, mode)
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: ", cls.__name__, ".export_ for `", file_,
                              "` using `", export_call,"`\n")))

            for import_section in import_sections:
                # this calls RtAdHoc.export__
                import_section = re.sub('^\\s+', '', import_section)
                import_section = re.sub(
                    '^[^(]*(?s)', export_call, import_section)
                try:
                    #RtAdHoc = cls # export_call takes care of this
                    exec(import_section, globals(), locals())
                except IndentationError:
                    sys.stderr.write("!!! IndentationError !!!\n")
        else:
            xfile = cls.check_xfile(file_, cls.export_dir)
            if xfile is not None:
                cls.write_source(xfile, source, mtime, mode)
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: ", cls.__name__, ".export_ for `", file_,
                              "` using `", export_call,"`\n")))
        cls.flat = cflat

    @classmethod
    def export(cls, file_=None, source=None):                # |:clm:|
        file_, source = cls.std_source_param(file_, source)
        sv_import = cls.import_
        cls.import_ = cls.export__

        file_ = os.path.basename(file_)
        cls.export_(source, file_, None, None, False)
        sv_extract_dir = cls.extract_dir
        cls.extract_dir = cls.export_dir
        engine_tag = cls.section_tag('adhoc_run_time_engine')
        engine_source = cls.export_source(
            source, no_remove=True, no_disable=True)
        engine_source = cls.get_named_template(
            None, file_, engine_source, tag=engine_tag, ignore_mark=True)
        if engine_source:
            efile = cls.check_xfile('rt_adhoc.py')
            if efile is not None:
                cls.write_source(efile, engine_source)
        cls.extract_dir = sv_extract_dir
        for init_dir in cls.export_need_init:
            if not cls.export_have_init[init_dir]:
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: create __init__.py in `", init_dir, "`\n")))
                inf = open(os.path.join(
                    cls.export_dir, init_dir, '__init__.py'), 'w')
                inf.write('')
                inf.close()
        cls.import_ = sv_import

    @classmethod
    def dump__(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
               mode=None, zipped=True, flat=None, source64=None):
        if cls.verbose:
            list(map(sys.stderr.write,
                     ("# xf: ", cls.__name__, ": dumping `", file_, "`\n")))
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        return source

    @classmethod
    def dump_(cls, dump_section, dump_type=None):            # |:clm:|
        if dump_type is None:
            dump_type = 'adhoc_import'
        if not dump_section:
            return ''
        dump_call = ''.join(('unpacked = ', cls.__name__, '.dump__'))
        dump_section = re.sub('^\\s+', '', dump_section)
        dump_section = re.sub(
            '^[^(]*(?s)', dump_call, dump_section)
        dump_dict = {'unpacked': ''}
        try:
            #RtAdHoc = cls # dump_call takes care of this
            exec(dump_section.lstrip(), globals(), dump_dict)
        except IndentationError:
            sys.stderr.write("!!! IndentationError !!!\n")
        return dump_dict['unpacked']

    @classmethod
    def dump_file(cls, match, file_=None, source=None, tag=None, # |:clm:|
                  is_re=False):
        file_, source = cls.std_source_param(file_, source)
        if tag is None:
            tag = cls.section_tag('(adhoc_import|adhoc_update)', is_re=True)
            is_re = True
        source_sections, dump_sections = cls.tag_partition(
            source, tag, is_re, headline=True)
        dump_call = ''.join((cls.__name__, '.dump_'))
        for dump_section in dump_sections:
            tagged_line = dump_section[0]
            dump_section = dump_section[1]
            tag_arg = cls.section_tag_strip(tagged_line)
            check_match = match
            if tag_arg != match and not match.startswith('-'):
                check_match = ''.join(('-', match))
            if tag_arg != match and not match.startswith('!'):
                check_match = ''.join(('!', match))
            if tag_arg != match:
                continue
            dump_section = re.sub('^\\s+', '', dump_section)
            dump_section = re.sub(
                '^[^(]*(?s)', dump_call, dump_section)
            try:
                #RtAdHoc = cls # dump_call takes care of this
                exec(dump_section.lstrip(), globals(), locals())
            except IndentationError:
                sys.stderr.write("!!! IndentationError !!!\n")

    macro_call_delimiters = ('@|:', ':|>')
    macro_xdef_delimiters = ('<|:', ':|@')
    macros = {}

    @classmethod
    def expand_macros(cls, source, macro_call_dlm=None, macro_xdef_dlm=None): # |:clm:|
        if macro_call_dlm is None:
            macro_call_dlm = cls.macro_call_delimiters
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        import re
        for macro_name, macro_expansion in cls.macros.items():
            macro_tag = cls.adhoc_tag(macro_name, macro_call_dlm, False)
            macro_tag_rx = cls.adhoc_tag(macro_name, macro_call_dlm, True)
            macro_call = ''.join(('# ', macro_tag, '\n'))
            macro_call_rx = ''.join(('^[^\n]*', macro_tag_rx, '[^\n]*\n'))
            mc_tag = ''.join(('# ', cls.adhoc_tag('adhoc_macro_call', macro_xdef_dlm, False), "\n"))
            mx_tag = ''.join(('# ', cls.adhoc_tag('adhoc_macro_expansion', macro_xdef_dlm, False), "\n"))
            xdef = ''.join((
                mc_tag,
                macro_call,
                mc_tag,
                mx_tag,
                macro_expansion,
                mx_tag,
                ))
            rx = re.compile(macro_call_rx, re.M)
            source = rx.sub(xdef, source)
        return source

    @classmethod
    def has_expanded_macros(cls, source, macro_xdef_dlm=None): # |:clm:|
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        mx_tag = cls.adhoc_tag('adhoc_macro_expansion', macro_xdef_dlm, False)
        me_count = len(cls.tag_lines(source, mx_tag))
        return me_count > 0

    @classmethod
    def activate_macros(cls, source, macro_call_dlm=None, macro_xdef_dlm=None): # |:clm:|
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        if not cls.has_expanded_macros(source, macro_xdef_dlm):
            source = cls.expand_macros(source, macro_call_dlm, macro_xdef_dlm)
        sv = cls.set_delimiters (macro_xdef_dlm)
        source = cls.remove_sections(source, 'adhoc_macro_call')
        source = cls.section_tag_remove(source, 'adhoc_macro_expansion')
        cls.reset_delimiters(sv)
        return source

    @classmethod
    def collapse_macros(cls, source, macro_xdef_dlm=None):   # |:clm:|
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        if cls.has_expanded_macros(source, macro_xdef_dlm):
            sv = cls.set_delimiters (macro_xdef_dlm)
            source = cls.section_tag_remove(source, 'adhoc_macro_call')
            source = cls.remove_sections(source, 'adhoc_macro_expansion')
            cls.reset_delimiters(sv)
        return source

    @classmethod
    def std_template_param(cls, file_=None, source=None,     # |:clm:|
                           tag=None, is_re=False, all_=False):
        file_, source = cls.std_source_param(file_, source)
        if tag is None:
            is_re=True
            if all_:
                tag = cls.section_tag('adhoc_(template(_v)?|import|unpack)', is_re=is_re)
            else:
                tag = cls.section_tag('adhoc_template(_v)?', is_re=is_re)
        source = cls.activate_macros(source)
        return (file_, source, tag, is_re)

    @classmethod
    def get_templates(cls, file_=None, source=None,          # |:clm:|
                      tag=None, is_re=False,
                      ignore_mark=False, all_=False):
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_)
        source = cls.enable_sections(source, 'adhoc_uncomment')
        source = cls.indent_sections(source, 'adhoc_indent')
        source_sections, template_sections = cls.tag_partition(
            source, tag, is_re=is_re, headline=True)
        templates = {}
        for template_section in template_sections:
            tagged_line = template_section[0]
            section = template_section[1]
            tag, tag_arg = cls.section_tag_parse(tagged_line)
            if not tag_arg:
                tag_arg = '-'
            if tag_arg in cls.template_process_hooks:
                section = cls.template_process_hooks[tag_arg](cls, section, tag, tag_arg)
            if ignore_mark:
                tag_arg = '-'
            if tag_arg not in templates:
                templates[tag_arg] = [[section], tag]
            else:
                templates[tag_arg][0].append(section)
        if all_:
            result = dict([(m, (''.join(t[0]), t[1])) for m, t in templates.items()])
        else:
            result = dict([(m, ''.join(t[0])) for m, t in templates.items()])
        return result

    @classmethod
    def template_list(cls, file_=None, source=None,          # |:clm:|
                      tag=None, is_re=False, all_=False):
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_)
        templates = cls.get_templates(file_, source, tag, is_re, all_=all_)
        if all_:
            templates.update([(k, ('', v)) for k, v in cls.extra_templates])
            result = list(sorted(
                [(k, v[1]) for k, v in templates.items()],
                key=lambda kt: '||'.join((
                    kt[1],
                    (((not (kt[0].startswith('-') or kt[0].startswith('!')))
                      and (kt[0]))
                     or (kt[0][1:]))))))
        else:
            templates.update(filter(
                lambda tdef: (tdef[1] == 'adhoc_template'
                              or tdef[1] == 'adhoc_template_v'),
                cls.extra_templates))
            result = list(sorted(
                templates.keys(),
                key=lambda kt: '||'.join((
                    (((not (kt.startswith('-') or kt.startswith('!')))
                      and (kt)) or (kt[1:]))))))
        return result

    @classmethod
    def col_param_closure(cls):                              # |:clm:|
        mw = [0, "", ""]
        def set_(col):                                       # |:clo:|
            lc = len(col)
            if mw[0] < lc:
                mw[0] = lc
                mw[1] = " " * lc
                mw[2] = "=" * lc
            return col
        def get_():                                          # |:clo:|
            return mw
        return set_, get_

    tt_ide = False
    tt_comment = ''
    tt_prefix = ''
    tt_suffix = ''

    @classmethod
    def template_table(cls, file_=None, source=None,         # |:clm:|
                       tag=None, is_re=False):
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_=True)
        pfx = cls.tt_prefix
        sfx = cls.tt_suffix
        comm = cls.tt_comment
        if comm:
            comm = ''.join((comm, ' '))
            pfx = ''.join((comm, pfx))
        if cls.tt_ide:
            command = ''.join(('python ', file_))
        else:
            command = os.path.basename(file_)
        # Parse table
        table = []
        tpl_arg_name = (lambda t: (((not (t.startswith('-') or t.startswith('!'))) and (t)) or (t[1:])))
        col_param = [cls.col_param_closure() for i in range(3)]
        table.append((col_param[0][0]('Command'), col_param[1][0]('Template'), col_param[2][0]('Type')))
        table.extend([
            (col_param[0][0](''.join((
                pfx,
                command, ' --template ',
                tpl_arg_name(t[0])
                )).rstrip()),
             col_param[1][0](''.join((
                 '# ', t[0]
                 )).rstrip()),
             col_param[2][0](''.join((
                 t[1], sfx
                 )).rstrip()),)
            for t in cls.template_list(file_, source, tag, is_re, all_=True)])
        if cls.tt_ide:
            itable = []
            headers = table.pop(0)
            this_type = None
            last_type = None
            for cols in reversed(table):
                this_type = cols[2].replace('")', '')
                if last_type is not None:
                    if last_type != this_type:
                        itable.append((''.join((comm, ':ide: +#-+')), '', ''))
                        itable.append((''.join((comm, '. ', last_type, '()')), '', ''))
                        itable.append(('', '', ''))
                itable.append((''.join((comm, ':ide: ', cols[1].replace('#', 'AdHoc:'))), '', ''))
                itable.append(cols)
                itable.append(('', '', ''))
                last_type = this_type
            if last_type is not None:
                itable.append((''.join((comm, ':ide: +#-+')), '', ''))
                itable.append((''.join((comm, '. ', last_type, '()')), '', ''))
            table = [headers]
            table.extend(itable)
        # Setup table output
        mw, padding = (col_param[0][1]()[0], col_param[0][1]()[1])
        mw1, padding1 = (col_param[1][1]()[0], col_param[1][1]()[1])
        mw2, padding2 = (col_param[2][1]()[0], col_param[2][1]()[1])
        sep = ' '.join([cp[1]()[2] for cp in col_param])
        make_row_c = lambda row: ''.join((
            ''.join((padding[:int((mw-len(row[0]))/2)], row[0], padding))[:mw],
            ' ', ''.join((padding1[:int((mw1-len(row[1]))/2)],
                          row[1], padding1))[:mw1],
            ' ', ''.join((padding2[:int((mw2-len(row[2]))/2)],
                          row[2], padding2))[:mw2].rstrip()))
        make_row = lambda row: ''.join((''.join((row[0], padding))[:mw],
                                        ' ', ''.join((row[1], padding))[:mw1],
                                        ' ', row[2])).rstrip()
        # Generate table
        output = []
        output.append(sep)
        output.append(make_row_c(table.pop(0)))
        if table:
            output.append(sep)
            output.extend([make_row(row) for row in table])
        output.append(sep)
        return output

    @classmethod
    def get_named_template(cls, name=None, file_=None, source=None, # |:clm:|
                           tag=None, is_re=False, ignore_mark=False):
        if name is None:
            name = '-'
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_=True)
        templates = cls.get_templates(
            file_, source, tag, is_re=is_re, ignore_mark=ignore_mark, all_=True)
        check_name = name
        if check_name not in templates and not name.startswith('-'):
            check_name = ''.join(('-', name))
        if check_name not in templates and not name.startswith('!'):
            check_name = ''.join(('!', name))
        if check_name in templates:
            template_set = templates[check_name]
        else:
            template_set = ['', 'adhoc_template']
        template = template_set[0]
        template_type = template_set[1]
        if check_name.startswith('!'):
            template = cls.dump_(template, template_type)
        return template

    @classmethod
    def extract_templates(cls, file_=None, source=None,      # |:clm:|
                          tag=None, is_re=False, ignore_mark=False,
                          export=False):
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re)
        templates = cls.get_templates(
            file_, source, tag, is_re=is_re, ignore_mark=ignore_mark)
        sv_extract_warn = cls.extract_warn
        cls.extract_warn = True
        for outf, template in sorted(templates.items()):
            if outf.startswith('-'):
                outf = '-'
            if outf == '-' and export:
                continue
            xfile = cls.check_xfile(outf, cls.extract_dir)
            if xfile is not None:
                cls.write_source(xfile, template)
        cls.extract_warn = sv_extract_warn


    def compileFile(self, file_name, for_=None, zipped=True, forced=None): # |:mth:|
        file_name, source = self.std_source_param(file_name, None)
        return source
# @:adhoc_run_time_engine:@
# @:adhoc_remove:@
# @:adhoc_remove:@
# @:adhoc_run_time_engine:@
# @:adhoc_run_time_engine:@
# @:adhoc_remove:@
# @:adhoc_template:@ -

# @:adhoc_run_time:@ The run-time class goes here
# @:adhoc_run_time_engine:@ settings enabled at run-time
# @:adhoc_enable:@
# RtAdHoc.flat = False
# @:adhoc_template:@
RtAdHoc.flat = False
# @:adhoc_template:@ -
# @:adhoc_enable:@
# @:adhoc_run_time_engine:@

#import adhoc                                               # @:adhoc:@
# @:adhoc_template:@

# (progn (forward-line 1) (snip-insert-mode "py.b.sformat" t) (insert "\n"))
try:
    ('{0}').format(0)
    def sformat (fmtspec, *args, **kwargs):
        return fmtspec.format(*args, **kwargs)
except AttributeError:
    try:
        import stringformat
    except ImportError:
        try:
            # @:adhoc_import:@ !stringformat_local
            RtAdHoc.import_('stringformat_local', file_='stringformat_local.py',
                mtime='2014-03-23T03:03:44', mode=int("100644", 8),
                zipped=True, flat=None, source64=
                'H4sIAGGVLlMC/81abW/bRhL+rl+xlSqQtGVGdpO0FSIbQZoABi6NEaeHHhSF'
                'oMWVxJoiVe7Stqr4v9/M7JLcJWXZbVHc+UOkcGdnZ56dd6rHjg6O2CyL4nQx'
                'YoWcH/2ATzrdbvd1dBOmMx4xIXNYZfMsX4VS6q/sYiOXWcpOx+zEf+53Oq9T'
                'Fq/WCV/xVIYyhqVszuSSs/BhPu7F2wv23fHw2EMGBTDMR+xdkuXAg/0az5Ii'
                'DVGUTgdYZ7lkOe90giBMkiBgYzZx3ile4VXCL4m7M2BOnMbSmcKeOVuGApZz'
                'F46GhXWYyxhFc7xRh8FfxOeseuiKARN8rZfwL+eyyFMmfIMGCDo8EXwE670S'
                'BEDgKfxkvqn/g38Jn8sBy+PFUoI6whfrJJZ4xoAdexUlv5vxtWT/DpOCv81z'
                'wMhiUkoJCqL2TlN8dQgxpZMAQXUFAaAS5BxOzrk/y1brOOEu7c4dt+857NG/'
                'HnP6jt7x1XXPXn2z9dyz0XbrHToP7thu6y1no/t779A9++b+4eNgy/19uWML'
                'WyZftlP1cT89/Lqlz4N778A701x6oNA6CWdki2we8yTqeLXWxVVLa1C44uN4'
                'yCHlQoLNthlVbNZ89iB6pXhnk1en4y9T76xUr8fCJF6kyK+knRwdsunZDv17'
                'TABpSdZDEvj8HB2oL4OzUturUHC2zvk8vhuwFZj/KkzYbRzJ5QA8MCtEmEYC'
                'LcAQ77P/OTr0msf2kM0sFmC+Ja1/5n3r7L4XuVlzAhaBCdDwHwTkbOR+nnhf'
                'P/tfv9hHgpISNjKIKI7v0MfEqeV0j73Jl+n04Ovkiz+ZHnh6c4/crGIOVKjS'
                '9Ou3nkuEWjMwnanDQHsWpzcAfMRkGCcgshkbcg5eEwQ3PEe1g6AMDqaXgM2A'
                'Xrbf+PBQhYIOawQDNodjBJMZwil4fsMpEv6SxhBpucKtjBeNY1y0OHBXI2yA'
                'rHAjKeAEYRSjSqH4eDvjgF5028JWrL1miNhDa0EVp5KwitOI39VIkRqxgMeS'
                'L3ju3mCkasfRkgst23z2h9Qn8DYA0uyVsEmWLkDfThV6NTw179kyd9M2Q3rM'
                '+uzkxUuQTkXgn8OVDsCmpN+ZfDGMy1zZD7CA/8K/nU6HjoIVBXQpoxFKxt2u'
                'FgLy3Tkom6fgxHbK5DmkSSQ5l3WuFWRaKhGyS+AUz+OZSsDvIRQc/StMF0W4'
                '4H7JnD5XpjmrSObD99kSU6VrLGhjASNIM8lWBk5hDFGnTkquc659bJal2pmY'
                'MOVxFCsKgAOKbYMqauloBWFjFQ7qIDQwmY3Zyl/kWbEWrhZKBGmx4nk8g7W2'
                'dc2TDJQInIpY2xAQGzsxOrQNrFRayUdEqH9Ntw+I1wldn+R0ccztebQZypbs'
                'lmMsYn2h75Q5nQezq6PR47kDhug2ZHZIPRUxlZk49V01aE0Qx8xJnVr6HvuJ'
                'z8MikRitnMih2i5Gs6JDFuoBnSWqTdalGMDSlkjJtFCa8QTEwbu24pnGUsvY'
                'iGNNPLuXsL2JoOUZrEKq65nHNPSeOX/6pNtYLlmpXreztxrqNoXBE7vVnZBt'
                'm8B/+vDTh1GVoDE/h3kos7wiWYdCYW4VjsDKdfdfsIAaxuCDf65tvs1diCiX'
                'rjOLsrtfwZC8/Uj9CZAtWwHJrEVyNgxFGG4Nz6Mzb2DBhQKTHZZueFhHBvju'
                'GqzJC0BudBQVARSjPbVz+/Z/Sa/T7DYtjYrieT8nB8iufuMzSS0NJG942mX9'
                'h63BkGygdPSDYJbAdQYBfEshjwRB7a2itDq4BedIFSwKGeiuhqbJECVQuQ7D'
                'Wv/QacBF64fwvWRNcbXm8AfPM0SVHk+GU7qxocGFFtCpU6mINIxVmWNweRfC'
                '09bOoa6G3oVCrkN4dLvkaV31gg2Sqjn/vYhzHlmCsldjaFdSN7/x9oQLwscl'
                'jiT/mAKOS1KVgZpWH7Nit4t7a9H2hpjHnH9XCNK1hL6OeZxASaXlVp+T0dHx'
                'VD+bHB2PpmayRfpaAfwfbKu0hGsjq9cZBPbUiHwxfHAdRtjcw1YF8VGJsGFW'
                '8paH11RHGM15rNr3cj/cWxZF5q2UK1AkNXC+YYdjEti2zvzGn3EsbVyd7pHE'
                'q9PEU670b6SRf/iyQR7ltK/YEKVveHULIsQDXRDddQJX7+e/FUJ7HdzSsQlP'
                '2wdNUI2ND2BKIeMUQ8aYUkOrmtgFMDTBmkLppeYURAWYXW2wfsbKofNkeUwF'
                'SuJkN3HtOrp41jUp9ZplkYdNoFA14oDSLhSSYSqDq43kYkzxqS6qdYkctnt6'
                'v6yKMdJfK7YDFiBqdIJlc9f2HcRq4uPHIooXsXQbIcdMcvQ5wciKO7ypRdi+'
                '3fZW3DbdYw8l9YJLsxSm0zpGtq53lTtcyljkejkYCMWXfq4CTB+riUZaNXpC'
                'o95WN1S1hS0F/JrGpd6iNtMmN2yVZLziWhikfohpSUqdi9Gy2PhUlUarCasl'
                'wTRUmY8aG7TaynbvXc7fpFXB6Kf0BEyYkj9rjStdVVfURvqG6G6X8Wxptngr'
                'DmVipKOT6+k28BOE58YKu+LL8AakT+JrjjL51Qpac9lbvzzULE5PT3dIVTjb'
                'cPTi3vHK3eH4+YnSy/d9CAyXUMGwULCSsE1X4KDm+YnTqdpO1RQHIsmkoPGt'
                'o/p/jErB9W2WR4K+qskbfRXVTLceUOCDTt2+BzjtRXviybxuqInMuCNc9dVx'
                'VYlSP1eHw8L2vrGip4C0Yi9ZJwGB9f8Gl4qoOetRy1DTgovypvSmkvz3SsUM'
                'knL+4HSIVgftK909K9qlyVid4O9WqMfeZCuUlkH9RlNGSFZYJmSQHeJ6ZOF3'
                'nn6UoaiGQqtKAwkrIb2BjM3J2hkPwUXaodyoe3IcqhMPNTZwh16nEbYp4vWd'
                'neA4/b7TpNclM32Fys3ep2bbFDPv7+0+B5yaw2nlkSWrA6rF6vjckIDIRhUJ'
                'e/aMnUwNYNdYEBLRMdaRRqkISEACswZMmlS9mlDTPWdkVP5JDIVZmOg3BVbX'
                'Vu/TnJ1vHAtK2FJVEfXOx+oxDjugodIlF8S8hLMky67LN0yPFWHtOVOzHkPo'
                'aiqPnbLjR4W6A1bo8wAOC+eAydNnDGWxl4vw0UlD2WvuUoL1xd72kiILpBtD'
                'tVokai6pbKGAY47m/TlEQPAgV9+1jZV6NhkdT0kJf+I0zft1IbMjqAmvuBUT'
                'KiOoYyw0Cz9n6Y6Cpg3ELEwRNwGRBBx6nmcr8NkUYwvJ/pgVmOW4HntK6BlA'
                'UrgzKF0Vk0roru1oCJYa2bqG+DaNqRe0NcdNvVF6DV5b34gnxo2Az+8p37Qw'
                'Nbm/zjBoTY6nrTOBpi45VYlkw49S7b6CHnuv8LVQa5HZNzraeQtPus3mXTzh'
                'QulSqzvDC7VMwhK8caPtbI8o1Kiv1nITYKkZXxWSt6YYugOAdgLfFKEj1Ncx'
                '2nXzN21k2md8ygve3Iz8n+IfH9JkY7waAyQ2ICU2rvRy6ynuEVcjLQu/ZiQz'
                'Igca1DUlx4lTRfYyQkCqoaXpo0HufSwEXiAKWguh0r99dgOzxxi/RXJWQ7yf'
                'ubM1jg/sXkJfupEl7ffE/p46rWoc7JFljaOZR/dsM2tNX3Cp+2piNGCTqeeH'
                '6zVkS2tq88A44K+ermrgJ59etudQJLl94Ql8QxErkqqa0z2BquUOwnwBEh0c'
                'XN/iN6Oqg96gbCesfgXNTndbVhNzYTQxZeNeTsCAs42JOs0v1lEouRvFM+lS'
                'nxh7ejDrPeY/c5qWlNQoAKexCPIjTTxzkvY2pakxLBT65VzGXl++OT8foHyW'
                'jWKUpk6zHqHWzefYeuVrdBED3O2ZVW64arQuKLG6PHBYWIxT+47paXNQUfbH'
                'CrAJ7p82nYT4ITvi0A5erXEMqgGkuwhB6gldROQiiedNDdd7ZMjztATS+qvh'
                '9R7HSnvj/x4rvUYffY3c/zGgZrtXNnqV2J1Oj5pF8pErjjkMnKAQUG5jjs/S'
                'a74BWiwdroo4keABavhHzwL9LMBXMNWl9KrWE/IkFRxLKddi9OzZIhbShwJp'
                'WVzh71Genfz44mQ4ZO7rfAX38tHXQx/1y7IZMTWfiI3o6BPm8aKAljcr4Gn8'
                'B8euJbjYBAL/E8jmREyx8tWwJVxD7HCA+DyN5fssKhL+PHj53JyRGazw9wJq'
                '9wzf1L18vmOS9TC5EleNmoDqA82WSnEuZV7M4G7M0VX1grGi9pWpCPp5XUXn'
                'Ohnmwvkslc7AFMAb2DR4FFDoIy8+nP/86e1Ht+LuafppCaweSKkpQg6dfBNL'
                'uASAb8GlGpSJBm4NoSfDETbohuRKsgBES/mdfIJo9iZI+TdP3DS10P8JMs1F'
                'nt1tDGJDcgNk18GstPeQaZ1TAQn9IpFy2SwxM2lkzH5hhYaySBYEwB7LYKsq'
                'KiHGfh4aDWf3iMh64xPtbuxUffYJxNc/gFjENzzVUEQZV90IziVZyFAgKEjC'
                'fGPMEKDsoHhZ2XPlPP7FBrEMLrk8N8Nj2kh6PfaR33BoEZA/TkGh/GfVLdQQ'
                'rTEqVs99DBhBGEU5FwJDZ+S1hKr9OVBG6KbCG7DWUwJ4ACf4KEIrIqZighTT'
                'v1QflQVQk4odnepqoh5PflTnhdWvhiJWvSWfs8sBxFsMylDXCtCvwMsQulMD'
                'lqr0V1VTxRIHzTY9TgDjCCoc7CPoZdAVuq8Av9mqjsHB8bGpRBOQ9tgZkfAe'
                'UrUMGZ+WsTYq+nExhDS4dCt1ZDSMN+vH6uUOeIV+2VdN8mugd/jWRA+enWk1'
                '4tXvo3DsjL+TmnHrPZMq8mY4D9VGb/4AWTMzI8HOzKbPQDwguVYvlXRiwlIW'
                'X3jQs3fYwjaR7JTRoCT1qfw9GR4PB+zHAftez+iBokRIo4tZKg4TCO7qRNQS'
                'u1cNv55jvnMLt7sdjrb02u7e31Y/y7gX912vukNnyaFRZVB2JpFjx1faOf7B'
                '+K3X+IWHbWVR7mKs/MGYcSha4oaHOQai7dDHr+aBkWZh0aHa3R2s1GwfrAU0'
                '6f/nqL866ke7mVWUyOpo+OPR8PuujchePP4ROB4E409isQeJvwLEwzD8HRRq'
                'DKyzdgJgS93W3uawW/Umj116K7XXOb7QdZACQuQMQqCYF4mjfjdb/tSHVAiC'
                'VRjj74uVM9fO3fkvH0tTUIUxAAA=')
            # @:adhoc_import:@
            import stringformat_local as stringformat      # @:adhoc:@
        except ImportError:
            printf('error: (adhoc) stringformat missing.'
                   ' Try *easy_install stringformat*.', file=sys.stderr)
            exit(1)
    def sformat (fmtspec, *args, **kwargs):
        return stringformat.FormattableString(fmtspec).format(
            *args, **kwargs)

import base64
import urllib

#import something.non.existent                              # @:adhoc:@
try:
    import namespace_dict
except ImportError:
    # @:adhoc_import:@ !namespace_dict
    RtAdHoc.import_('namespace_dict', file_='namespace_dict.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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')
    # @:adhoc_import:@
    import namespace_dict                                  # @:adhoc:@

# copy of ws_prop_dict.dict_dump
def dict_dump(dict_, wid=0, trunc=0, commstr=None, tag=None, out=None): # ||:fnc:||
    '''Dump a dictionary.'''

    if out is None:
        out = sys.stderr
    if commstr is None:
        commstr = ((('dbg_comm' in globals()) and (globals()['dbg_comm'])) or ('# '))

    dbg_twid = ((('dbg_twid' in globals()) and (globals()['dbg_twid'])) or (9))
    if tag is None:
        tag = ':DBG:'

    max_wid = 0
    for key in dict_.keys():
        _wid = len(key)
        if max_wid < _wid:
            max_wid = _wid

    dbg_fwid = ((('dbg_fwid' in globals()) and (globals()['dbg_fwid'])) or (max_wid))
    if dbg_fwid < max_wid:
        dbg_fwid = max_wid

    printf(sformat('{0}{1}', commstr, '-' * 30), file=out)
    indent = (sformat("{0}{3:^{1}} {4:<{2}s}:  ",
            commstr, dbg_twid, dbg_fwid,
            '', ''))

    for key, value in sorted(dict_.items()):
        value = str(value)
        value = value.replace('\n', '\\n')
        value = value.replace('\r', '\\r')
        value = value.replace('\t', '\\t')
        value = value.replace('\f', '\\f')
        if wid == 0:
            wid = 78 - len(indent) - 1
            if wid < 50:
                wid = 50
        start = 0
        limit = len(value)
        value_lines = []
        while start < limit:
            line = value[start:start+wid]
            space_pos = wid - 1
            if len(line) == wid:
                space_pos = line.rfind(' ')
                if space_pos > 0:
                    line = line[:space_pos + 1]
                else:
                    space_pos = wid - 1
            value_lines.append(line)
            start += space_pos + 1
        if trunc > 0:
            value_lines = value_lines[:trunc]
        value_lines[-1] = sformat('{0}[', value_lines[-1])
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}",
                commstr, dbg_twid, dbg_fwid,
                tag, key, value_lines[0]), file=out)
        for line in value_lines[1:]:
            printf(sformat('{0}{1}',indent, line), file=out)

def dump_attr(obj, wid=0, trunc=0, commstr=None,           # ||:fnc:||
              tag=None, out=None):
    if out is None:
        out = sys.stdout
    dict_dump(
        vars(obj), wid=wid, trunc=trunc, commstr=commstr, tag=tag, out=out)

printe = printf

# (progn (forward-line 1) (snip-insert-mode "py.b.posix" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.os.system.sh" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.prog.path" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.b.line.loop" t) (insert "\n"))

# --------------------------------------------------
# |||:sec:||| CLASSES
# --------------------------------------------------

# (progn (forward-line 1) (snip-insert-mode "py.c.placeholder.template" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.c.key.hash.ordered.dict" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.c.progress" t) (insert "\n"))

# --------------------------------------------------
# |||:sec:||| EXCEPTION
# --------------------------------------------------

class AdHocError(Exception):                               # ||:cls:||
    pass

# --------------------------------------------------
# |||:sec:||| ADHOC
# --------------------------------------------------

# @:adhoc_run_time_section:@ START
import sys
import os
import re

# @:adhoc_uncomment:@
# @:adhoc_template:@ -catch-stdout
try:
    from cStringIO import StringIO as _AdHocBytesIO, StringIO as _AdHocStringIO
except ImportError:
    try:
        from StringIO import StringIO as _AdHocBytesIO, StringIO as _AdHocStringIO
    except ImportError:
        from io import BytesIO as _AdHocBytesIO, StringIO as _AdHocStringIO

# @:adhoc_template:@
# @:adhoc_uncomment:@
# @:adhoc_run_time_section:@ off
if not hasattr(os.path, 'relpath'):
    def relpath(path, start=os.curdir):
        """Return a relative version of a path"""

        if not path:
            raise ValueError("no path specified")

        start_list = os.path.abspath(start).split(os.sep)
        path_list = os.path.abspath(path).split(os.sep)

        # Work out how much of the filepath is shared by start and path.
        i = len(os.path.commonprefix([start_list, path_list]))

        rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:]
        if not rel_list:
            return os.curdir
        return os.path.join(*rel_list)
    os.path.relpath = relpath
    del relpath

AH_CHECK_SOURCE = '''\
not in section
# >:cmd:< arg0 arg1 # comment
# <:tag:> on
in section
# >:cmd:< arg2 arg3 # comment
in section
# <:tag:> off
not in section
# <:tag2:> on
in section
in section
# <:tag2:> off
not in section
'''

# @:adhoc_run_time_section:@ on
# @:adhoc_run_time_class:@
class AdHoc(object):                                     # |||:cls:|||
    # @:adhoc_run_time_section:@ off
    """
    :class:`AdHoc` is mainly used as a namespace, which is partially
    included verbatim as :class:`RtAdHoc` in the generated output.

    It is only instantiated for compiling adhoc output
    (:meth:`compileFile`, :meth:`compile`).

    **Attributes**

    The following class attrbutes determine the operation of AdHoc:

    - :attr:`line_delimiters`
    - :attr:`section_delimiters`
    - :attr:`template_process_hooks`
    - :attr:`extra_templates`
    - :attr:`export_dir`
    - :attr:`extract_dir`
    - :attr:`flat`
    - :attr:`frozen`
    - :attr:`quiet`
    - :attr:`verbose`
    - :attr:`debug`

    Run-time class attributes can be set like this:

    | # |adhoc_run_time|
    | # |adhoc_enable|
    | # RtAdHoc.flat = False
    | # RtAdHoc.frozen = True
    | # |adhoc_enable|

    or like this:

    | # |adhoc_run_time|
    | if 'RtAdHoc' in globals():
    |     RtAdHoc.flat = False
    |     RtAdHoc.frozen = True

    **Low-Level Functions**

    :meth:`adhoc_tag` constructs a delimited tag or tag regular
    expression:

    >>> adhoc_tag = AdHoc.adhoc_tag
    >>> delimiters = ('<:', ':>')

    >>> tag_sym = 'my_tag'
    >>> adhoc_tag(tag_sym, delimiters)
    '<:my_tag:>'

    >>> tag_rx = 'my_[^:]+'
    >>> adhoc_tag(tag_rx, delimiters, is_re=True)
    '\\\\<\\\\:my_[^:]+\\\\:\\\\>'

    :meth:`tag_split` splits a string into tagged line parts and
    untagged parts.

    :meth:`adhoc_parse_line` splits a tagged line into a tag symbol and
    additional arguments:

    >>> adhoc_parse_line = AdHoc.adhoc_parse_line
    >>> tagged_line = 'anything # <:my_tag:>  additonal arguments # end comment'

    >>> adhoc_parse_line(tagged_line, tag_sym, delimiters)
    ('my_tag', 'additonal arguments # end comment')

    >>> adhoc_parse_line(tagged_line, tag_rx, delimiters, is_re=True)
    ('my_tag', 'additonal arguments # end comment')

    >>> adhoc_parse_line(tagged_line, tag_rx, delimiters, is_re=True, strip_comment=True)
    ('my_tag', 'additonal arguments')

    **Low-Level Convenience Functions**

    *Tag Generation*

    :meth:`line_tag`, :meth:`section_tag`

    >>> class ah(AdHoc):
    ...     line_delimiters = ('>:', ':<')
    ...     section_delimiters = ('<:', ':>')

    >>> ah.line_tag('tag-symbol')
    '>:tag-symbol:<'

    >>> ah.line_tag('tag.?rx', True)
    '\\\\>\\\\:tag.?rx\\\\:\\\\<'

    >>> ah.section_tag('tag-symbol')
    '<:tag-symbol:>'

    >>> ah.section_tag('tag.?rx', True)
    '\\\\<\\\\:tag.?rx\\\\:\\\\>'

    *Tagged Line/Section Retrieval*

    :meth:`tag_lines`, :meth:`tag_partition`, :meth:`tag_sections`

    >>> source = AH_CHECK_SOURCE

    >>> line_tag = ah.line_tag('cmd')
    >>> tagged_lines = ah.tag_lines(source, line_tag)
    >>> adhoc_dump_list(tagged_lines, 40)
    #   :DBG:   elt[0]                 : ]'# >:cmd:< arg0 arg1 # comment\\n'[
    #   :DBG:   elt[1]                 : ]'# >:cmd:< arg2 arg3 # comment\\n'[

    >>> is_re = True
    >>> section_tag_rx = ah.section_tag('tag.?', is_re=is_re)
    >>> body, sections = ah.tag_partition(source, section_tag_rx, is_re=is_re)
    >>> adhoc_dump_list(body, 40)
    #   :DBG:   elt[0]                 : ]'not in section\\n# >:cmd:< arg0 arg1 #  ...'[
    #   :DBG:   elt[1]                 : ]'not in section\\n'[
    #   :DBG:   elt[2]                 : ]'not in section\\n'[
    >>> adhoc_dump_list(sections, 40)
    #   :DBG:   elt[0]                 : ]'in section\\n# >:cmd:< arg2 arg3 # comm ...'[
    #   :DBG:   elt[1]                 : ]'in section\\nin section\\n'[

    >>> body, sections = ah.tag_partition(source, section_tag_rx, is_re=is_re, headline=True)
    >>> adhoc_dump_sections(sections, 40)
    #   :DBG:   section[0]             : ]['# <:tag:> on\\n', 'in section\\n# >:cmd:< arg2 arg3 # comm ...'][
    #   :DBG:   section[1]             : ]['# <:tag2:> on\\n', 'in section\\nin section\\n'][

    >>> sections = ah.tag_sections(source, section_tag_rx, is_re=is_re, headline=True)
    >>> adhoc_dump_sections(sections, 40)
    #   :DBG:   section[0]             : ]['# <:tag:> on\\n', 'in section\\n# >:cmd:< arg2 arg3 # comm ...'][
    #   :DBG:   section[1]             : ]['# <:tag2:> on\\n', 'in section\\nin section\\n'][

    *Tagged Line Parsing*

    - :meth:`line_tag_parse`, :meth:`line_tag_strip`
    - :meth:`section_tag_parse`, :meth:`section_tag_strip`

    >>> strclean(ah.line_tag_parse(tagged_lines[0], 'cmd'))
    ('cmd', 'arg0 arg1 # comment')

    >>> strclean(ah.line_tag_strip(tagged_lines[0], 'cmd', strip_comment=True))
    'arg0 arg1'

    >>> strclean(ah.section_tag_parse(sections[1][0], 'tag.?', is_re=True))
    ('tag2', 'on')

    >>> strclean(ah.section_tag_strip(sections[1][0], 'tag.?', is_re=True))
    'on'

    **Tagged Line/Section Transformations**

    - :meth:`transform_lines`, :meth:`transform_sections`
    - :meth:`line_tag_rename`, :meth:`line_tag_remove`
    - :meth:`section_tag_rename`, :meth:`section_tag_remove`
    - :meth:`indent_sections`
    - :meth:`enable_sections`, :meth:`disable_transform`, :meth:`disable_sections`
    - :meth:`remove_sections`

    **IO Functions**

    - :meth:`check_coding`
    - :meth:`decode_source`, :meth:`encode_source`
    - :meth:`read_source`, :meth:`write_source`
    - :meth:`check_xfile`
    - :meth:`pack_file`, :meth:`unpack_file`

    **Run-Time Unpack/Import Interface**

    - :meth:`unpack_`
    - :meth:`import_`, :meth:`module_setup`

    **Export Tools**

    - :meth:`std_source_param`
    - :meth:`export_source`

    **Extract Interface**

    - :meth:`unpack`
    - :meth:`extract`

    **Export Interface**

    - :meth:`export__`, :meth:`export_`, :meth:`export`

    **Dump Interface (Import/Unpack Substitute)**

    - :meth:`dump__`, :meth:`dump_`, :meth:`dump_file`

    **Macro Interface**

    Naive macro expansion would violate the condition
    ``xsource_i === source_i``.

    Here is a simple macro system which preserves the bijectivity
    condition. It is quite useful for conditional templating. (See
    `Use Cases`_ generator scripts).

    *Limitations*

    - Macro expansions are not prefixed with the current indentation
    - Macros cannot be nested

    *Attributes*

    - :attr:`macro_call_delimiters`

      Delimiters for macros, e.g.: ``@|:MACRO_NAME:|>``

    - :attr:`macro_xdef_delimiters`

      Delimiters for macro expansion, e.g.::

          # <|:adhoc_macro_call\x3a|@
          # @|:MACRO_NAME:|>
          # <|:adhoc_macro_call\x3a|@
          # <|:adhoc_macro_expansion\x3a|@
          The macro definition ...
          The macro definition ...
          # <|:adhoc_macro_expansion\x3a|@

    - :attr:`macros`

      Macro definitions.

    *Methods*

    - :meth:`expand_macros`
    - :meth:`has_expanded_macros`
    - :meth:`activate_macros`
    - :meth:`collapse_macros`

    **Template Interface**

    - :meth:`std_template_param`
    - :meth:`get_templates`
    - :meth:`template_list`, :meth:`col_param_closure`, :meth:`template_table`
    - :meth:`get_named_template`
    - :meth:`extract_templates`

    **Template Extraction (uncompiled)**

    - Expand and activate macros for uncompiled source
    - Activate macros on compiled source

    **Compile**

    - Expand macros before compilation

    **Export**

    - Collapse macros on export of compiled source.

    **Compilation Attributes**

    - :attr:`include_path`

    **Compilation Interface**

    - :meth:`setup_tags`
    - :meth:`strquote`
    - :meth:`adhoc_run_time_sections_from_string`
    - :meth:`adhoc_run_time_section_from_file`
    - :meth:`adhoc_get_run_time_section`
    - :meth:`prepare_run_time_section`
    - :meth:`verbatim_`
    - :meth:`include_`
    - :meth:`encode_module_`
    - :meth:`compile_`

    **User API**

    - :meth:`encode_include`
    - :meth:`encode_module`
    - :meth:`compile`
    - :meth:`compileFile`

    .. \\|:here:|
    """
    # @:adhoc_run_time_section:@ on
    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Attributes
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    line_delimiters = ('@:', ':@')
    # @:adhoc_run_time_section:@ off
    '''Tag delimiters for lines.'''
    # @:adhoc_run_time_section:@ on
    section_delimiters = ('@:', ':@')
    # @:adhoc_run_time_section:@ off
    '''Tag delimiters for sections.'''
    # @:adhoc_run_time_section:@ on

    template_process_hooks = {}
    # @:adhoc_run_time_section:@ off
    '''Dictionary of ``template-name, hook-function`` items.

    If the name of a template section matches an item in this
    dictionary, the ``hook-function`` is called::

        section = hook-function(cls, section, tag, template_name)
    '''
    # @:adhoc_run_time_section:@ on
    extra_templates = []
    # @:adhoc_run_time_section:@ off
    '''List of additional templates::

        [(name, type), ...]
    '''
    # @:adhoc_run_time_section:@ on

    export_dir = '__adhoc__'
    # @:adhoc_run_time_section:@ off
    '''Export directory (for :meth:`export`, ``--explode``).'''
    # @:adhoc_run_time_section:@ on
    extract_dir = '.'
    # @:adhoc_run_time_section:@ off
    '''Export directory (for :meth:`extract`, ``--extract``).'''
    # @:adhoc_run_time_section:@ on
    flat = True
    # @:adhoc_run_time_section:@ off
    '''If True, do not export files recursively.'''
    # @:adhoc_run_time_section:@ on
    forced = False
    # @:adhoc_run_time_section:@ off
    '''If True, allow duplicate imports.'''
    # @:adhoc_run_time_section:@ on

    frozen = False
    # @:adhoc_run_time_section:@ off
    '''If True, do not attempt to load modules from external
    sources (\\|:todo:| not implemented).'''
    # @:adhoc_run_time_section:@ on

    quiet = False
    # @:adhoc_run_time_section:@ off
    '''If True, suppress warnings.'''
    # @:adhoc_run_time_section:@ on
    verbose = False
    # @:adhoc_run_time_section:@ off
    '''If True, display messages.'''
    # @:adhoc_run_time_section:@ on
    debug = False
    # @:adhoc_run_time_section:@ off
    '''If True, display debug messages.'''
    # @:adhoc_run_time_section:@ on

    include_path = []
    # @:adhoc_run_time_section:@ off
    '''Search path for include files. Only relevant during compilation.'''
    # @:adhoc_run_time_section:@ on
    export_need_init = {}
    export_have_init = {}
    extract_warn = False

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Low-Level Functions
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    def _adhoc_string_util():
        # @:adhoc_run_time_section:@ off
        '''Define string utilities.

        - static method :meth:`isstring`
        - unicode type :attr:`uc_type`
        - static method :meth:`uc`
        '''
        # @:adhoc_run_time_section:@ on
        def isstring(obj):
            return isinstance(obj, basestring)
        try:
            isstring("")
        except NameError:
            def isstring(obj):
                return isinstance(obj, str) or isinstance(obj, bytes)
        def _uc(string):
            return unicode(string, 'utf-8')
        try:
            _uc("")
        except NameError:
            _uc = lambda x: x
        uc_type = type(_uc(""))
        def uc(value):
            if isstring(value) and not isinstance(value, uc_type):
                return _uc(value)
            return value
        return staticmethod(isstring), uc_type, staticmethod(uc)

    isstring, uc_type, uc = _adhoc_string_util()

    @staticmethod
    def adhoc_tag(symbol_or_re, delimiters, is_re=False):    # |:fnc:|
        # @:adhoc_run_time_section:@ off
        '''Make a tag from symbol_or_re and delimiters.

        :param symbol_or_re: symbol string or regular expresssion.
        :param delimiters: tuple of delimiter strings
          ``(prefix, suffix)``.
        :param is_re: if True, escape the delimiters for regular
          expressions.
        '''
        # @:adhoc_run_time_section:@ on
        ldlm = delimiters[0]
        rdlm = delimiters[1]
        if is_re:
            ldlm = re.escape(ldlm)
            rdlm = re.escape(rdlm)
        return ''.join((ldlm, symbol_or_re, rdlm))

    @classmethod
    def tag_split(cls, string, tag, is_re=False):            # |:fnc:|
        # @:adhoc_run_time_section:@ off
        """Split string with tag line.

        :returns:
          a list of tuples with a flag and a section::

            [(is_tag, section), ... ]

        **Example**

        >>> source = AH_CHECK_SOURCE
        >>> printf(str(source), end='')
        not in section
        # >:cmd:< arg0 arg1 # comment
        # <:tag:> on
        in section
        # >:cmd:< arg2 arg3 # comment
        in section
        # <:tag:> off
        not in section
        # <:tag2:> on
        in section
        in section
        # <:tag2:> off
        not in section

        **Split on literal tag**

        >>> is_re = False
        >>> tag = AdHoc.adhoc_tag('tag', ('<:', ':>'), is_re)
        >>> parts = AdHoc.tag_split(source, tag, is_re)
        >>> adhoc_dump_sections(parts, 40)
        #   :DBG:   section[0]             : ][False, 'not in section\\n# >:cmd:< arg0 arg1 #  ...'][
        #   :DBG:   section[1]             : ][True, '# <:tag:> on\\n'][
        #   :DBG:   section[2]             : ][False, 'in section\\n# >:cmd:< arg2 arg3 # comm ...'][
        #   :DBG:   section[3]             : ][True, '# <:tag:> off\\n'][
        #   :DBG:   section[4]             : ][False, 'not in section\\n# <:tag2:> on\\nin secti ...'][

        **Split on tag regexp**

        >>> is_re = True
        >>> tag = AdHoc.adhoc_tag('tag.?', ('<:', ':>'), is_re)
        >>> parts = AdHoc.tag_split(source, tag, is_re)
        >>> adhoc_dump_sections(parts, 40)
        #   :DBG:   section[0]             : ][False, 'not in section\\n# >:cmd:< arg0 arg1 #  ...'][
        #   :DBG:   section[1]             : ][True, '# <:tag:> on\\n'][
        #   :DBG:   section[2]             : ][False, 'in section\\n# >:cmd:< arg2 arg3 # comm ...'][
        #   :DBG:   section[3]             : ][True, '# <:tag:> off\\n'][
        #   :DBG:   section[4]             : ][False, 'not in section\\n'][
        #   :DBG:   section[5]             : ][True, '# <:tag2:> on\\n'][
        #   :DBG:   section[6]             : ][False, 'in section\\nin section\\n'][
        #   :DBG:   section[7]             : ][True, '# <:tag2:> off\\n'][
        #   :DBG:   section[8]             : ][False, 'not in section\\n'][

        **Assemble section**

        >>> section = []
        >>> in_section = False
        >>> for part in parts:
        ...     if part[0]:
        ...         in_section = not in_section
        ...         continue
        ...     if in_section:
        ...         section.append(part[1])
        >>> section = ''.join(section)
        >>> printf(str(section), end='')
        in section
        # >:cmd:< arg2 arg3 # comment
        in section
        in section
        in section
        """
        # @:adhoc_run_time_section:@ on
        if not is_re:
            tag = re.escape(tag)
        ro = re.compile(''.join(('^[^\n]*(', tag, ')[^\n]*$')), re.M)
        result = []
        last_end = 0
        string = cls.decode_source(string)
        for mo in re.finditer(ro, string):
            start = mo.start(0)
            end = mo.end(0)
            result.append((False, string[last_end:start]))
            result.append((True, string[start:end+1]))
            last_end = end+1
        result.append((False, string[last_end:]))
        return result

    @classmethod
    def adhoc_parse_line(cls, tagged_line, symbol_or_re=None, # |:clm:|
                         delimiters=None, is_re=False, strip_comment=None):
        # @:adhoc_run_time_section:@ off
        """Parse a tagged line into tag-symbol and argument parts.

        :returns: a tuple ``(tag-symbol, tag-arguments)``.

        :param tagged_line: string to be parsed.
        :param symbol_or_re: symbol string or regular expresssion to
          be parsed, default is any sequence of characters except the
          first character of the suffix delimiter.
        :param delimiters: tuple of delimiter strings
          ``(prefix, suffix)``. Default is :attr:`line_delimiters`.
        :param strip_comment: If True, remove trailing ``#`` comment
          from arguments. Default: False.

        >>> tagged_line = ' # @:' 'adhoc_test' ':@   arg1 arg2  # comment'
        >>> AdHoc.adhoc_parse_line(tagged_line)
        ('adhoc_test', 'arg1 arg2  # comment')

        >>> AdHoc.adhoc_parse_line(tagged_line, 'adhoc_.*', is_re=True)
        ('adhoc_test', 'arg1 arg2  # comment')

        >>> AdHoc.adhoc_parse_line(tagged_line, strip_comment=True)
        ('adhoc_test', 'arg1 arg2')

        >>> AdHoc.adhoc_parse_line(tagged_line.replace('@', '<'))
        ('', '# <:adhoc_test:<   arg1 arg2  # comment')

        >>> AdHoc.adhoc_parse_line(tagged_line.replace('@', '|'), delimiters=('|:', ':|'))
        ('adhoc_test', 'arg1 arg2  # comment')
        """
        # @:adhoc_run_time_section:@ on
        if delimiters is None:
            delimiters = cls.line_delimiters
        if symbol_or_re is None:
            dlm = delimiters[1]
            if dlm:
                symbol_or_re = ''.join(('[^', dlm[0], ']+'))
            else:
                symbol_or_re = ''.join(('[^\\s]+'))
            is_re = True
        if not is_re:
            symbol_or_re = re.escape(symbol_or_re)
        tag_rx = cls.adhoc_tag(''.join(('(', symbol_or_re, ')')), delimiters, is_re=True)
        mo = re.search(tag_rx, tagged_line)
        if mo:
            ptag = mo.group(1)
        else:
            ptag = ''
        strip_rx = ''.join(('^.*', tag_rx, '\\s*'))
        tag_arg = re.sub(strip_rx, '', tagged_line).strip()
        if strip_comment:
            tag_arg = re.sub('\\s*#.*', '', tag_arg)
        return (ptag, tag_arg)

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Low-Level Convenience Functions
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def set_delimiters(cls, line_delimiters=None, section_delimiters=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Set line/section delimiters.

        :returns: saved delimiter state suitable for
          :meth:`reset_delimiters`.

        :param line_delimiters: the line delimiters. If None, line
          delimiters are not changed.
        :param section_delimiters: the section delimiters. If None,
          `line_delimiters` is used.

        If both `line_delimiters` and `section_delimiters` are None,
        the delimiter state is returned without any modification to
        the current delimiters.

        >>> AdHoc.set_delimiters()
        (('@:', ':@'), ('@:', ':@'))

        >>> sv = AdHoc.inc_delimiters()
        >>> sv
        (('@:', ':@'), ('@:', ':@'))

        >>> AdHoc.set_delimiters()
        (('@@:', ':@@'), ('@@:', ':@@'))

        >>> AdHoc.reset_delimiters(sv)
        >>> AdHoc.set_delimiters()
        (('@:', ':@'), ('@:', ':@'))

        >>> AdHoc.set_delimiters(('<:', ':>'))
        (('@:', ':@'), ('@:', ':@'))

        >>> AdHoc.set_delimiters()
        (('<:', ':>'), ('<:', ':>'))

        >>> AdHoc.reset_delimiters(sv)
        >>> AdHoc.set_delimiters()
        (('@:', ':@'), ('@:', ':@'))

        '''
        # @:adhoc_run_time_section:@ on
        delimiter_state = (cls.line_delimiters, cls.section_delimiters)
        if line_delimiters is None:
            line_delimiters = delimiter_state[0]
            if section_delimiters is None:
                section_delimiters = delimiter_state[1]
        elif section_delimiters is None:
            section_delimiters = line_delimiters
        cls.line_delimiters, cls.section_delimiters = (
            line_delimiters, section_delimiters)
        return delimiter_state

    @classmethod
    def reset_delimiters(cls, delimiter_state):              # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Reset line/section delimiters from saved state.

        :param delimiter_state: delimiter state as returned by
          :meth:`set_delimiters`.
        '''
        # @:adhoc_run_time_section:@ on
        cls.line_delimiters, cls.section_delimiters = delimiter_state

    @classmethod
    def inc_delimiters(cls):                                 # |:clm:|
    # @:adhoc_run_time_section:@ off
        '''Duplicate outer delimiter characters.

        :returns: saved delimiter state suitable for
          :meth:`reset_delimiters`.

        E.g.::

            "@:", ":@" => "@@:", ":@@"

        See :meth:`set_delimiters` for doctest example.
        '''
        # @:adhoc_run_time_section:@ on

        inc_first = lambda dlm: (((not dlm) and ('')) or (dlm[0] + dlm))
        inc_last = lambda dlm: (((not dlm) and ('')) or (dlm + dlm[-1]))
        outer_delimiters = [(inc_first(dlm[0]), inc_last(dlm[1]))
                            for dlm in (cls.line_delimiters,
                                        cls.section_delimiters)]
        return cls.set_delimiters(*outer_delimiters)

    @classmethod
    def line_tag(cls, symbol_or_re, is_re=False):            # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Make a line tag from symbol or regular expression.

        :returns: unicode string.

        :param symbol_or_re: symbol string or regular expresssion.
        :param is_re: if True, escape the delimiters for regular
          expressions.
        '''
        # @:adhoc_run_time_section:@ on
        return cls.adhoc_tag(symbol_or_re, cls.line_delimiters, is_re)

    @classmethod
    def section_tag(cls, symbol_or_re, is_re=False):         # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Make a section tag from symbol or regular expression.

        :returns: unicode string.

        :param symbol_or_re: symbol string or regular expresssion.
        :param is_re: if True, escape the delimiters for regular
          expressions.
        '''
        # @:adhoc_run_time_section:@ on
        return cls.adhoc_tag(symbol_or_re, cls.section_delimiters, is_re)

    @classmethod
    def tag_lines(cls, string, tag, is_re=False):            # |:clm:|
        # @:adhoc_run_time_section:@ off
        """Get lines matching tag.

        :returns: list of tag lines.

        See :meth:`tag_split`.
        """
        # @:adhoc_run_time_section:@ on
        result = []
        for section in cls.tag_split(string, tag, is_re):
            if section[0]:
                result.append(section[1])
        return result

    @classmethod
    def tag_partition(cls, string, tag, is_re=False, headline=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Split the string into body parts and sections.

        If `headline` is True, the starting tag line is included for
        sections.'''
        # @:adhoc_run_time_section:@ on
        in_section = False
        body_parts = []
        sections = []
        tagged_line = ''
        for section in cls.tag_split(string, tag, is_re):
            if section[0]:
                in_section = not in_section
                tagged_line = section[1]
                continue
            if in_section:
                if headline:
                    sections.append((tagged_line, section[1]))
                else:
                    sections.append(section[1])
            else:
                body_parts.append(section[1])
        return body_parts, sections

    @classmethod
    def tag_sections(cls, string, tag, is_re=False, headline=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Split the string into sections.

        If `headline` is True, the starting tag line is included.

        See :meth:`tag_partition`.
        '''
        # @:adhoc_run_time_section:@ on
        body_parts, sections = cls.tag_partition(string, tag, is_re, headline)
        return sections

    @classmethod
    def line_tag_parse(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        # @:adhoc_run_time_section:@ off
        """Parse a line tag line into tag-symbol and argument parts.

        :returns: a tuple ``(tag-symbol, tag-arguments)``.

        See :meth:`adhoc_parse_line`.
        """
        # @:adhoc_run_time_section:@ on
        return cls.adhoc_parse_line(tagged_line, symbol_or_re, cls.line_delimiters,
                                    is_re, strip_comment=strip_comment)

    @classmethod
    def line_tag_strip(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        # @:adhoc_run_time_section:@ off
        """Remove tag and optionally comment from line tag line.

        :returns: tag arguments.

        See :meth:`adhoc_parse_line`.
        """
        # @:adhoc_run_time_section:@ on
        return cls.line_tag_parse(tagged_line, symbol_or_re, is_re, strip_comment)[1]

    @classmethod
    def section_tag_parse(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        # @:adhoc_run_time_section:@ off
        """Parse a section tag line into tag-symbol and argument parts.

        :returns: a tuple ``(tag-symbol, tag-arguments)``.

        See :meth:`adhoc_parse_line`.
        """
        # @:adhoc_run_time_section:@ on
        return cls.adhoc_parse_line(tagged_line, symbol_or_re, cls.section_delimiters,
                                    is_re, strip_comment=strip_comment)

    @classmethod
    def section_tag_strip(cls, tagged_line, symbol_or_re=None, is_re=False, # |:clm:|
                       strip_comment=None):
        # @:adhoc_run_time_section:@ off
        """Remove tag and optionally comment from section tag line.

        :returns: tag arguments.

        See :meth:`adhoc_parse_line`.
        """
        # @:adhoc_run_time_section:@ on
        return cls.section_tag_parse(tagged_line, symbol_or_re, is_re, strip_comment)[1]

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Tagged Line/Section Transformations
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def transform_lines(cls, transform, string,              # |:clm:|
                        symbol_or_re, is_re=False, delimiters=None):
        # @:adhoc_run_time_section:@ off
        """Split string into line tag lines and other sections; call
        transform callback on each tagged line.

        :returns: transformed string.

        :param transform: callback which receives argument ``tagged-line``.
        """
        # @:adhoc_run_time_section:@ on
        if delimiters is None:
            delimiters = cls.line_delimiters
        result = []
        in_section = False
        for section in cls.tag_split(
            string, cls.adhoc_tag(symbol_or_re, delimiters, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                blob = transform(blob)
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def transform_sections(cls, transform, string,           # |:clm:|
                           symbol_or_re, is_re=False):
        # @:adhoc_run_time_section:@ off
        """Split string into sections and call transform callback on each section.

        :returns: transformed string.

        :param transform: callback which receives and returns
          arguments ``section``, ``headline``.
        """
        # @:adhoc_run_time_section:@ on
        result = []
        in_section = False
        headline = ''
        for section in cls.tag_split(
            string, cls.section_tag(symbol_or_re, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                if in_section:
                    headline = blob
                    continue
            elif in_section:
                blob, headline = transform(blob, headline)
                result.append(headline)
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def line_tag_rename(cls, string, symbol_or_re, renamed, is_re=False, delimiters=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Rename tag-symbol.

        Default tag delimiters are :attr:`line_delimiters`.

        >>> tpl = AdHoc.get_named_template("col-param-closure")

        .. >>> printf(str(AdHoc.line_tag_rename(tpl, "adhoc_run_time_section", "should_be_kept")))
        '''
        # @:adhoc_run_time_section:@ on
        if is_re:
            transform = lambda blob: re.sub(symbol_or_re, renamed, blob)
        else:
            transform = lambda blob: blob.replace(symbol_or_re, renamed)
        return cls.transform_lines(transform, string, symbol_or_re, is_re, delimiters)

    @classmethod
    def line_tag_remove(cls, string, symbol_or_re, is_re=False, delimiters=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Remove tagged lines.

        Default tag delimiters are :attr:`line_delimiters`.

        >>> tpl = AdHoc.get_named_template("col-param-closure")

        .. >>> printf(str(AdHoc.line_tag_remove(tpl, "adhoc_run_time_section")))
        '''
        # @:adhoc_run_time_section:@ on
        transform = lambda blob: ''
        return cls.transform_lines(transform, string, symbol_or_re, is_re, delimiters)

    @classmethod
    def section_tag_rename(cls, string, symbol_or_re, renamed, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Rename tag-symbol of lines tagged with :attr:`section_delimiters`.

        >>> tpl = AdHoc.get_named_template("col-param-closure")
        >>> res = AdHoc.section_tag_rename(tpl, "adhoc_run_time_section", "should_be_kept")
        >>> res = '\\n'.join(res.splitlines()[:4])
        >>> printf(str(res)) #doctest: +ELLIPSIS
            # @:should_be_kept:@ on
            @classmethod
            def col_param_closure(cls):...
                # @:should_be_kept:@ off
        '''
        # @:adhoc_run_time_section:@ on
        if is_re:
            transform = lambda blob: re.sub(symbol_or_re, renamed, blob)
        else:
            transform = lambda blob: blob.replace(symbol_or_re, renamed)
        return cls.transform_lines(transform, string, symbol_or_re, is_re, cls.section_delimiters)

    @classmethod
    def section_tag_remove(cls, string, symbol_or_re, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Remove lines tagged with :attr:`section_delimiters`.

        >>> tpl = AdHoc.get_named_template("col-param-closure")
        >>> res = AdHoc.section_tag_remove(tpl, "adhoc_run_time_section")
        >>> res = '\\n'.join(res.splitlines()[:4])
        >>> printf(str(res)) #doctest: +ELLIPSIS
            @classmethod
            def col_param_closure(cls):...
                ...Closure for setting up maximum width, padding and separator
                for table columns.
        '''
        # @:adhoc_run_time_section:@ on
        transform = lambda blob: ''
        return cls.transform_lines(transform, string, symbol_or_re, is_re, cls.section_delimiters)

    @classmethod
    def indent_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''
        >>> section = """\\
        ... # prefix
        ...   # @:adhoc_indent_check:@ +4
        ...   #line 1
        ...   #  line 2
        ...   #
        ...   # line 3
        ...   # @:adhoc_indent_check:@
        ...   # suffix\\
        ... """

        >>> printf(AdHoc.indent_sections(section, "adhoc_indent_check"))
        # prefix
          # @:adhoc_indent_check:@ +4
              #line 1
              #  line 2
              #
              # line 3
              # @:adhoc_indent_check:@
          # suffix

        >>> printf(AdHoc.indent_sections(section.replace("+4", "-1"),
        ...        "adhoc_indent_check"))
        # prefix
          # @:adhoc_indent_check:@ -1
         #line 1
         #  line 2
         #
         # line 3
          # @:adhoc_indent_check:@
          # suffix

        '''
        # @:adhoc_run_time_section:@ on
        result = []
        in_section = False
        indent = 0
        for section in cls.tag_split(
            string, cls.section_tag(symbol_or_re, is_re), is_re):
            blob = section[1]
            if section[0]:
                in_section = not in_section
                if in_section:
                    tag_arg = cls.section_tag_strip(blob)
                    if tag_arg:
                        indent = int(tag_arg)
                    else:
                        indent = -4
            else:
                if in_section and indent:
                    if indent < 0:
                        rx = re.compile(''.join(('^', ' ' * (-indent))), re.M)
                        blob = rx.sub('', blob)
                    elif indent > 0:
                        rx = re.compile('^', re.M)
                        blob = rx.sub(' ' * indent, blob)
                    indent = 0
            result.append(blob)
        string = ''.join(result)
        return string

    @classmethod
    def enable_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''
        >>> section = """\\
        ... # prefix
        ...   # @:adhoc_enable_check:@
        ...   #line 1
        ...   #  line 2
        ...   #
        ...   # line 3
        ...   # @:adhoc_enable_check:@
        ...   # suffix\\
        ... """
        >>> printf(AdHoc.enable_sections(section, "adhoc_enable_check"))
        # prefix
          # @:adhoc_enable_check:@
          line 1
           line 2
        <BLANKLINE>
          line 3
          # @:adhoc_enable_check:@
          # suffix
        '''
        # @:adhoc_run_time_section:@ on
        enable_ro = re.compile('^([ \t\r]*)(# ?)', re.M)
        enable_sub = '\\1'
        transform = lambda blob, hl: (enable_ro.sub(enable_sub, blob), hl)
        return cls.transform_sections(transform, string, symbol_or_re, is_re)

    adhoc_rx_tab_check = re.compile('^([ ]*\t)', re.M)
    adhoc_rx_disable_simple = re.compile('^', re.M)
    adhoc_rx_min_indent_check = re.compile('^([ ]*)([^ \t\r\n]|$)', re.M)

    @classmethod
    def disable_transform(cls, section, headline=None):      # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Disable section transform callback.'''
        # @:adhoc_run_time_section:@ on
        if not section:
            return (section, headline)

        if cls.adhoc_rx_tab_check.search(section):
            # tabs are evil
            if cls.verbose:
                list(map(sys.stderr.write,
                         ('# dt: evil tabs: ', repr(section), '\n')))
            return (
                cls.adhoc_rx_disable_simple.sub(
                    '# ', section.rstrip()) + '\n',
                headline)

        min_indent = ''
        for mo in cls.adhoc_rx_min_indent_check.finditer(section):
            indent = mo.group(1)
            if indent:
                if (not min_indent or len(min_indent) > len(indent)):
                    min_indent = indent
            elif mo.group(2):
                min_indent = ''
                break
        adhoc_rx_min_indent = re.compile(
            ''.join(('^(', min_indent, '|)([^\n]*)$')), re.M)

        if section.endswith('\n'):
            section = section[:-1]
        dsection = []
        for mo in adhoc_rx_min_indent.finditer(section):
            indent = mo.group(1)
            rest = mo.group(2)
            if not indent and not rest:
                #leave blank lines blank
                dsection.append('\n')
            else:
                dsection.extend((indent, '# ', rest, '\n'))
        return (''.join(dsection), headline)

    @classmethod
    def disable_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''
        >>> section = """\\
        ... prefix
        ...   @:adhoc_disable_check:@
        ...   line 1
        ...     line 2
        ...
        ...   line 3
        ...   @:adhoc_disable_check:@
        ...   suffix\\
        ... """
        >>> printf(AdHoc.disable_sections(section, "adhoc_disable_check"))
        prefix
          @:adhoc_disable_check:@
          # line 1
          #   line 2
        <BLANKLINE>
          # line 3
          @:adhoc_disable_check:@
          suffix
        '''
        # @:adhoc_run_time_section:@ on
        return cls.transform_sections(
            cls.disable_transform, string, symbol_or_re, is_re)

    @classmethod
    def remove_sections(cls, string, symbol_or_re, is_re=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Remove sections.'''
        # @:adhoc_run_time_section:@ on
        ah_retained, ah_removed = cls.tag_partition(
            string, cls.section_tag(symbol_or_re, is_re), is_re)
        return ''.join(ah_retained)

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| IO Functions
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @staticmethod
    def check_coding(source):                                # |:fnc:|
        # @:adhoc_run_time_section:@ off
        '''Determine coding for source.

        :returns: coding type for string.

        :param source: source string/unicode.

        If the ``source`` string contains a coding specification
        within the first two lines, the specified coding is used,
        otherwise, ``UTF-8`` is returned.
        '''
        # @:adhoc_run_time_section:@ on
        if source:
            eol_seen = 0
            for c in source:
                if isinstance(c, int):
                    lt_ = lambda a, b: a < b
                    chr_ = lambda a: chr(a)
                else:
                    lt_ = lambda a, b: True
                    chr_ = lambda a: a
                break
            check = []
            for c in source:
                if lt_(c, 127):
                    check.append(chr_(c))
                if c == '\n':
                    eol_seen += 1
                    if eol_seen == 2:
                        break
            check = ''.join(check)
            mo = re.search('-[*]-.*coding:\\s*([^;\\s]+).*-[*]-', check)
        else:
            mo = None
        if mo:
            coding = mo.group(1)
        else:
            coding = 'utf-8'
        return coding

    @classmethod
    def decode_source(cls, source):                          # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Decode source to unicode.

        :param source: source string (may already be unicode).

        If the ``source`` string contains a coding specification
        within the first two lines, the specified coding is used,
        otherwise, ``UTF-8`` is applied.
        '''
        # @:adhoc_run_time_section:@ on
        if not source:
            return cls.uc('')
        if not isinstance(source, cls.uc_type) and hasattr(source, 'decode'):
            source = source.decode(cls.check_coding(source))
        return source

    @classmethod
    def encode_source(cls, source):                          # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Encode source from unicode.

        :param source: source string (may already be encoded).

        If the ``source`` string contains a coding specification
        within the first two lines, the specified coding is used,
        otherwise, ``UTF-8`` is applied.
        '''
        # @:adhoc_run_time_section:@ on
        if not source:
            return ''.encode('utf-8')
        if isinstance(source, cls.uc_type) and hasattr(source, 'encode'):
            source = source.encode(cls.check_coding(source))
        return source

    @classmethod
    def read_source(cls, file_, decode=True):                # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Read source from file.

        :returns: unicode string.

        :param file_: If None, empty or ``-``, sys.stdin is used,
          otherwise the file is read from ``file_`` and decoded with
          :meth:`decode_source`.
        '''
        # @:adhoc_run_time_section:@ on
        source = None
        if not file_ or file_ == '-':
            # Python3 has a buffer attribute for binary input.
            if hasattr(sys.stdin, 'buffer'):
                source = sys.stdin.buffer.read()
            else:
                source = sys.stdin.read()
        else:
            try:
                sf = open(file_, 'rb')
                source = sf.read()
                sf.close()
            except IOError:
                for module in sys.modules.values():
                    if (module
                        and hasattr(module, '__file__')
                        and module.__file__ == file_):
                        if (hasattr(module, '__adhoc__')
                            and hasattr(module.__adhoc__, 'source')):
                            source = module.__adhoc__.source
                            break
        if source is None:
            raise IOError('source not found for `' + str(file_) + '`')
        if decode:
            return cls.decode_source(source)
        return source

    @classmethod
    def write_source(cls, file_, source, mtime=None, mode=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Write source to file.

        :param file_: If None, empty or ``-``, sys.stdout is used,
          otherwise the file is written to ``file_`` after encoding
          with :meth:`encode_source`.
        '''
        # @:adhoc_run_time_section:@ on
        esource = cls.encode_source(source)
        if not file_ or file_ == '-':
            # @:adhoc_run_time_section:@ off
            # For Python2, sys.stdout is effectively binary, so source
            # can be pre-encoded.
            #
            # With Python3 sys.stdout does automatic encoding (which
            # is unwanted).
            # Normal sys.stdout has a buffer member which allows
            # binary output, but not during doctest.
            # @:adhoc_run_time_section:@ on
            if hasattr(sys.stdout, 'buffer'):
                sys.stdout.buffer.write(esource)
            else:
                try:
                    sys.stdout.write(esource)
                except TypeError:
                    sys.stdout.write(source)
        else:
            sf = open(file_, 'wb')
            sf.write(esource)
            sf.close()
            if mode is not None:
                os.chmod(file_, mode)
            if mtime is not None:
                import datetime
                if cls.isstring(mtime):
                    try:
                        date, ms = mtime.split('.')
                    except ValueError:
                        date = mtime
                        ms = 0
                    mtime = cls.strptime(date, '%Y-%m-%dT%H:%M:%S')
                    mtime += datetime.timedelta(microseconds=int(ms))
                if isinstance(mtime, datetime.datetime):
                    # @:adhoc_run_time_section:@ off
                    # import calendar
                    # if mtime.utcoffset() is not None:
                    #     mtime = mtime - mtime.utcoffset()
                    # millis = int(calendar.timegm(mtime.timetuple()) * 1000 +
                    #                mtime.microsecond / 1000)
                    # ts = float(millis) / 1000
                    # @:adhoc_run_time_section:@ on
                    ts = int(mtime.strftime("%s"))
                else:
                    ts = mtime
                os.utime(file_, (ts, ts))

    @classmethod
    def check_xfile(cls, file_, xdir=None):                  # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Prepare extraction of a file.

        :returns: None, if the file already exists. Otherwise, the
          file directory is created and the absolute path name of the
          file is returned.

        :param file_: filename.
        :param xdir: extraction directory. If it is `None`,
          :attr:`extract_dir` is used.

        If ``file_`` is `None`, empty or ``-``, the filename ``-`` is
        returned.

        If ``file_`` starts with a slash ``/``, ``xdir`` is ignored,
        otherwise, ``xdir`` is prepended to ``file_``.
        '''
        # @:adhoc_run_time_section:@ on
        if xdir is None:
            xdir = cls.extract_dir
        if not file_:
            file_ = '-'
        if file_ == '-':
            return file_
        file_ = os.path.expanduser(file_)
        if os.path.isabs(file_):
            xfile = file_
        else:
            xfile = os.path.join(xdir, file_)
        xfile = os.path.abspath(xfile)
        if os.path.exists(xfile):
            # do not overwrite files
            if (cls.extract_warn or (cls.verbose)) and not cls.quiet:
                list(map(sys.stderr.write, (
                    "# xf: ", cls.__name__, ": warning file `", file_,
                    "` exists. skipping ...\n")))
            return None
        xdir = os.path.dirname(xfile)
        if not os.path.exists(xdir):
            os.makedirs(xdir)
        return xfile

    @classmethod
    def pack_file(cls, source, zipped=True):                 # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Optionally gzip a file and base64-encode it.

        :returns: base64-encoded unicode string.

        :param source: string to be packed.
        :param zipped: if True, gzip ``source`` before
          base64-encoding. (Default: True).
        '''
        # @:adhoc_run_time_section:@ on
        import base64, gzip
        if zipped:
            sio = _AdHocBytesIO()
            gzf = gzip.GzipFile('', 'wb', 9, sio)
            gzf.write(cls.encode_source(source))
            gzf.close()
            source = sio.getvalue()
            sio.close()
        else:
            source = cls.encode_source(source)
        source = base64.b64encode(source)
        source = source.decode('ascii')
        return source

    @classmethod
    def unpack_file(cls, source64, zipped=True, decode=True): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Base64-decode a file and optionally ungzip it.

        :returns: unicode string if ``decode`` is True.

        :param source64: base64 encoded unicode string to be unpacked.
        :param zipped: if True, ungzip ``source`` after
          base64-decoding. (Default: True).
        '''
        # @:adhoc_run_time_section:@ on
        import base64, gzip
        # @:adhoc_run_time_section:@ off
        if cls.debug:
            printf(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]{5:>7d}[ ]{6!s}[ {7}",
                dbg_comm, dbg_twid, dbg_fwid,
                ':DBG:', 'source64', len(source64), source64[:80],
                'b64decode ...'))
        # @:adhoc_run_time_section:@ on
        source = source64.encode('ascii')
        source = base64.b64decode(source)
        if zipped:
            # @:adhoc_run_time_section:@ off
            if cls.debug:
                printf(sformat(
                    "{0}{3:^{1}} {4:<{2}s}: ]{5:>7d}[ ]{6!s}[ {7}",
                    dbg_comm, dbg_twid, dbg_fwid,
                    ':DBG:', 'source (zip)', len(source), repr(source)[:80],
                    'unzipping ...'))
            # @:adhoc_run_time_section:@ on
            sio = _AdHocBytesIO(source)
            gzf = gzip.GzipFile('', 'rb', 9, sio)
            source = gzf.read()
            gzf.close()
            sio.close()
        if decode:
            source = cls.decode_source(source)
        # @:adhoc_run_time_section:@ off
        if cls.debug:
            printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5:>7d}[ ]{6!s}[",
                    dbg_comm, dbg_twid, dbg_fwid,
                    ':DBG:', 'source', len(source), repr(source)[:80]))

        # @:adhoc_run_time_section:@ on
        return source

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Run-Time Unpack/Import Interface
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def unpack_(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                mode=None, zipped=True, flat=None, source64=None):
        # @:adhoc_run_time_section:@ off
        """Unpack adhoc'ed file, if it does not exist."""
        # @:adhoc_run_time_section:@ on
        xfile = cls.check_xfile(file_, cls.extract_dir)
        if xfile is None:
            return
        if cls.verbose:
            list(map(sys.stderr.write,
                     ("# xf: ", cls.__name__, ": unpacking `", file_, "`\n")))
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        cls.write_source(xfile, source, mtime, mode)

    @classmethod
    def strptime(cls, date_string, format_):                 # |:clm:|
        # @:adhoc_run_time_section:@ off
        """Python 2.4 compatible"""
        # @:adhoc_run_time_section:@ on
        import datetime
        if hasattr(datetime.datetime, 'strptime'):
            strptime_ = datetime.datetime.strptime
        else:
            import time
            strptime_ = lambda date_string, format_: (
                datetime.datetime(*(time.strptime(date_string, format_)[0:6])))
        return strptime_(date_string, format_)

    @classmethod
    def import_(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                mode=None, zipped=True, flat=None, source64=None):
        # @:adhoc_run_time_section:@ off
        """Import adhoc'ed module."""
        # @:adhoc_run_time_section:@ on
        import datetime
        import time

        module = cls.module_setup(mod_name)

        if mtime is None:
            mtime = datetime.datetime.fromtimestamp(0)
        else:
            # mtime=2011-11-23T18:04:26[.218506], zipped=True, flat=None, source64=
            try:
                date, ms = mtime.split('.')
            except ValueError:
                date = mtime
                ms = 0
            mtime = cls.strptime(date, '%Y-%m-%dT%H:%M:%S')
            mtime += datetime.timedelta(microseconds=int(ms))

        source = cls.unpack_file(source64, zipped=zipped, decode=False)

        # @:adhoc_run_time_section:@ off
        # |:todo:| add to parent module
        # @:adhoc_run_time_section:@ on
        mod_parts = mod_name.split('.')
        mod_child = mod_parts[-1]
        parent = '.'.join(mod_parts[:-1])
        # @:adhoc_run_time_section:@ off
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':DBG:', 'parent', parent))

        # @:adhoc_run_time_section:@ on
        old_mtime = module.__adhoc__.mtime
        module = cls.module_setup(mod_name, file_, mtime, source, mode)
        if len(parent) > 0:
            setattr(sys.modules[parent], mod_child, module)

        if module.__adhoc__.mtime != old_mtime:
            # @:adhoc_run_time_section:@ off
            printf(sformat('{0}Executing source', dbg_comm))
            # @:adhoc_run_time_section:@ on
            source = cls.encode_source(module.__adhoc__.source)
            exec(source, module.__dict__)
        # @:adhoc_run_time_section:@ off

        msg = (((mod_name in sys.modules) and ('YES')) or ('NO'))
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       mod_name + ' imported', msg))

        module_name = module.__name__
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       'module_name', module_name))
        dump_attr(module, wid=80, trunc=5)
        # @:adhoc_run_time_section:@ on

    @classmethod
    def module_setup(cls, module=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                     source=None, mode=None):
        # @:adhoc_run_time_section:@ off
        '''Setup module for `AdHoc`.
        \\|:todo:| various modes are possible:
        - always use newest version (development) (currently implemented)
        - always use adhoc\'ed version (freeze) (not implemented)
        '''
        # @:adhoc_run_time_section:@ on
        m = 'ms: '
        class Attr:                                          # |:cls:|
            pass

        import types, datetime, os
        if not isinstance(module, types.ModuleType):
            mod_name = module
            if mod_name is None:
                mod_name = __name__
            try:
                if mod_name not in sys.modules:
                    # @:adhoc_run_time_section:@ off
                    if cls.verbose:
                        printe(sformat('{0}{1}__import__({2})',
                                       dbg_comm, m, mod_name))
                    # @:adhoc_run_time_section:@ on
                    __import__(mod_name)
                module = sys.modules[mod_name]
            except (ImportError, KeyError):
                # @:adhoc_run_time_section:@ off
                if cls.verbose:
                    printe(sformat('{0}{1}imp.new_module({2})',
                                   dbg_comm, m, mod_name))
                # @:adhoc_run_time_section:@ on
                import imp
                module = imp.new_module(mod_name)
                sys.modules[mod_name] = module
        else:
            mod_name = module.__name__

        if mtime is None:
            if (file_ is not None
                or source is not None):
                # the info is marked as outdated
                mtime = datetime.datetime.fromtimestamp(1)
            else:
                # the info is marked as very outdated
                mtime = datetime.datetime.fromtimestamp(0)

        if not hasattr(module, '__adhoc__'):
            adhoc = Attr()
            setattr(module, '__adhoc__', adhoc)
            setattr(adhoc, '__module__', module)

            mtime_set = None
            mode_set = mode
            if hasattr(module, '__file__'):
                module_file = module.__file__
                if module_file.endswith('.pyc'):
                    module_file = module_file[:-1]
                if os.access(module_file, os.R_OK):
                    stat = os.stat(module_file)
                    mtime_set = datetime.datetime.fromtimestamp(
                        stat.st_mtime)
                    mode_set = stat.st_mode
            if mtime_set is None:
                # the info is marked as very outdated
                mtime_set = datetime.datetime.fromtimestamp(0)
            adhoc.mtime = mtime_set
            adhoc.mode = mode_set
        else:
            adhoc = module.__adhoc__

        if (mtime > adhoc.mtime
            or not hasattr(module, '__file__')):
            if file_ is not None:
                setattr(module, '__file__', file_)
                if os.access(file_, os.R_OK):             # |:api_fi:|
                    stat = os.stat(file_)
                    adhoc.mtime = datetime.datetime.fromtimestamp(
                        stat.st_mtime)
                    adhoc.mode = stat.st_mode
                    if adhoc.mtime > mtime:
                        # the file on disk is newer than the adhoc'ed source
                        try:
                            delattr(adhoc, 'source')
                        except AttributeError:
                            pass
                        source = None

        if (mtime > adhoc.mtime
            or not hasattr(adhoc, 'source')):
            if source is not None:
                adhoc.source = source
                adhoc.mtime = mtime
                adhoc.mode = mode

        if not hasattr(adhoc, 'source'):
            try:
                file_ = module.__file__
                file_, source = cls.std_source_param(file_, source)
                adhoc.source = source
            except (AttributeError, IOError):
                # @:adhoc_run_time_section:@ off
                # if hasattr(module, '__path__'): # |:debug:|
                #     list(map(sys.stderr.write,
                #         ('module path: ', module.__path__, '\n')))
                # else:
                #     sys.stderr.write('no module.__path__\n')
                #     list(map(sys.stderr.write,
                #         [''.join((attr, str(value), "\n")) for attr, value in
                #          filter(lambda i: i[0] != '__builtins__',
                #                 sorted(vars(module).items()))]))
                if cls.verbose:
                    (t, e, tb) = sys.exc_info()
                    import traceback
                    printe(''.join(traceback.format_tb(tb)), end='')
                    printe(sformat('{0}: {1}', t.__name__, e))
                    del(tb)
                # @:adhoc_run_time_section:@ on
                pass

        return module

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Export Tools
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def std_source_param(cls, file_=None, source=None): # |:clm:||:api_fi:|
        # @:adhoc_run_time_section:@ off
        '''Setup standard source parameters.

        :returns: tuple ``( file_, source )``

        :param file_: If None, `__file__` is used. If it ends with
          ``.pyc``, it is transformed to ``.py``.
        :param source: If None, the result of :meth:`read_source` is
          used.
        '''
        # @:adhoc_run_time_section:@ on
        if file_ is None:
            file_ = __file__
        if file_.endswith('.pyc'):
            file_ = file_[:-1]
        if source is None:
            source = cls.read_source(file_)
        return (file_, source)

    @classmethod
    def export_source(cls, string, no_remove=False, no_disable=False): # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''
        ============================ =========================
        check for |adhoc_remove|     sections and remove them!
        check for |adhoc_import|     sections and remove them!
        check for |adhoc_unpack|     sections and remove them!
        check for |adhoc_template_v| sections and remove them!
        check for |adhoc_disable|    sections and enable them!
        check for |adhoc_enable|     sections and disable them!
        check for |adhoc_remove_|    section markers and rename them!
        ============================ =========================
        '''
        # @:adhoc_run_time_section:@ on
        string = cls.collapse_macros(string)
        if not no_remove:
            string = cls.remove_sections(string, 'adhoc_remove')
        string = cls.remove_sections(string, 'adhoc_import')
        string = cls.remove_sections(string, 'adhoc_unpack')
        string = cls.remove_sections(string, 'adhoc_template_v')
        if not no_disable:
            string = cls.enable_sections(string, 'adhoc_disable')
            string = cls.disable_sections(string, 'adhoc_enable')
        if not no_remove:
            string = cls.section_tag_rename(string, 'adhoc_remove_', 'adhoc_remove')
        return string

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Extract Interface
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def unpack(cls, file_=None, source=None):                # |:clm:|
        # @:adhoc_run_time_section:@ off
        """Unpack all adhoc'ed files in |adhoc_unpack| sections."""
        # @:adhoc_run_time_section:@ on
        file_, source = cls.std_source_param(file_, source)
        source_sections, unpack_sections = cls.tag_partition(
            source, cls.section_tag('adhoc_unpack'))
        sv_extract_warn = cls.extract_warn
        cls.extract_warn = True
        unpack_call = ''.join((cls.__name__, '.unpack_'))
        for unpack_section in unpack_sections:
            unpack_section = re.sub('^\\s+', '', unpack_section)
            unpack_section = re.sub(
                '^[^(]*(?s)', unpack_call, unpack_section)
            try:
                #RtAdHoc = cls # unpack_call takes care of this
                exec(unpack_section.lstrip(), globals(), locals())
            except IndentationError:
                sys.stderr.write("!!! IndentationError !!!\n")
                # @:adhoc_run_time_section:@ off
                sys.stderr.write(''.join((unpack_section, "\n")))
                # @:adhoc_run_time_section:@ on
        cls.extract_warn = sv_extract_warn

    @classmethod
    def extract(cls, file_=None, source=None):               # |:clm:|
        # @:adhoc_run_time_section:@ off
        """Unpack all adhoc'ed files in |adhoc_unpack| sections and
        extract all templates."""
        # @:adhoc_run_time_section:@ on
        cls.unpack(file_, source)
        cls.extract_templates(file_, source, export=True)

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Export Interface
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def export__(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
                 mode=None, zipped=True, flat=None, source64=None):
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        # @:adhoc_run_time_section:@ off
        if cls.debug:
            sys.stderr.write(
                ''.join(("# xp: ", cls.__name__, ".export__ for `",
                         file_, "`\n")))
        # @:adhoc_run_time_section:@ on
        if file_ is None:
            return
        file_base = os.path.basename(file_)
        if file_base.startswith('__init__.py'):
            is_init = True
        else:
            is_init = False

        parts = mod_name.split('.')
        base = parts.pop()
        if parts:
            module_dir = os.path.join(*parts)
            cls.export_need_init[module_dir] = True
        else:
            module_dir = ''
        if is_init:
            module_dir = os.path.join(module_dir, base)
            cls.export_have_init[module_dir] = True
        module_file = os.path.join(module_dir, file_base)

        cls.export_(source, module_file, mtime, mode, flat)

    @classmethod
    def export_(cls, source, file_, mtime, mode, flat=None): # |:clm:|
        cflat = cls.flat
        if flat is None:
            flat = cflat
        cls.flat = flat
        if not flat:
            # extract to export directory
            sv_extract_dir = cls.extract_dir
            cls.extract_dir = cls.export_dir
            cls.extract(file_, source)
            cls.extract_dir = sv_extract_dir

            source_sections, import_sections = cls.tag_partition(
                source, cls.section_tag('adhoc_import'))
            source = cls.export_source(''.join(source_sections))
            export_call = ''.join((cls.__name__, '.export__'))

            xfile = cls.check_xfile(file_, cls.export_dir)
            if xfile is not None:
                cls.write_source(xfile, source, mtime, mode)
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: ", cls.__name__, ".export_ for `", file_,
                              "` using `", export_call,"`\n")))

            for import_section in import_sections:
                # this calls RtAdHoc.export__
                import_section = re.sub('^\\s+', '', import_section)
                import_section = re.sub(
                    '^[^(]*(?s)', export_call, import_section)
                try:
                    #RtAdHoc = cls # export_call takes care of this
                    exec(import_section, globals(), locals())
                except IndentationError:
                    sys.stderr.write("!!! IndentationError !!!\n")
                    # @:adhoc_run_time_section:@ off
                    sys.stderr.write(''.join((import_section, "\n")))
                    # @:adhoc_run_time_section:@ on
        else:
            xfile = cls.check_xfile(file_, cls.export_dir)
            if xfile is not None:
                cls.write_source(xfile, source, mtime, mode)
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: ", cls.__name__, ".export_ for `", file_,
                              "` using `", export_call,"`\n")))
        cls.flat = cflat

    # @:adhoc_run_time_section:@ off
    default_engine = False

    # @:adhoc_run_time_section:@ on
    @classmethod
    def export(cls, file_=None, source=None):                # |:clm:|
        file_, source = cls.std_source_param(file_, source)
        # @:adhoc_run_time_section:@ off
        # |:todo:| this chaos needs cleanup (cls.import_/cls.export__)
        # @:adhoc_run_time_section:@ on
        sv_import = cls.import_
        cls.import_ = cls.export__

        file_ = os.path.basename(file_)
        # @:adhoc_run_time_section:@ off
        if cls.verbose:
            list(map(sys.stderr.write,
                     ("# xp: ", cls.__name__, ".export for `", file_, "`\n")))
        # @:adhoc_run_time_section:@ on
        cls.export_(source, file_, None, None, False)
        sv_extract_dir = cls.extract_dir
        cls.extract_dir = cls.export_dir
        engine_tag = cls.section_tag('adhoc_run_time_engine')
        engine_source = cls.export_source(
            source, no_remove=True, no_disable=True)
        engine_source = cls.get_named_template(
            None, file_, engine_source, tag=engine_tag, ignore_mark=True)
        # @:adhoc_run_time_section:@ off
        if cls.default_engine and not engine_source:
            state = cls.set_delimiters(('@:', ':@'))
            ah = cls()
            engine_source = ah.prepare_run_time_section()
            engine_source = cls.get_named_template(
                None, file_, engine_source, tag=engine_tag, ignore_mark=True)
            cls.reset_delimiters(state)
        # @:adhoc_run_time_section:@ on
        if engine_source:
            efile = cls.check_xfile('rt_adhoc.py')
            if efile is not None:
                cls.write_source(efile, engine_source)
        cls.extract_dir = sv_extract_dir
        for init_dir in cls.export_need_init:
            if not cls.export_have_init[init_dir]:
                if cls.verbose:
                    list(map(sys.stderr.write,
                             ("# xp: create __init__.py in `", init_dir, "`\n")))
                inf = open(os.path.join(
                    cls.export_dir, init_dir, '__init__.py'), 'w')
                inf.write('')
                inf.close()
        cls.import_ = sv_import

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Dump Interface (Import/Unpack Substitute)
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def dump__(cls, mod_name=None, file_=None, mtime=None, # |:clm:||:api_fi:|
               mode=None, zipped=True, flat=None, source64=None):
        if cls.verbose:
            list(map(sys.stderr.write,
                     ("# xf: ", cls.__name__, ": dumping `", file_, "`\n")))
        source = cls.unpack_file(source64, zipped=zipped, decode=False)
        return source

    @classmethod
    def dump_(cls, dump_section, dump_type=None):            # |:clm:|
        if dump_type is None:
            dump_type = 'adhoc_import'
        if not dump_section:
            return ''
        dump_call = ''.join(('unpacked = ', cls.__name__, '.dump__'))
        dump_section = re.sub('^\\s+', '', dump_section)
        dump_section = re.sub(
            '^[^(]*(?s)', dump_call, dump_section)
        dump_dict = {'unpacked': ''}
        try:
            #RtAdHoc = cls # dump_call takes care of this
            exec(dump_section.lstrip(), globals(), dump_dict)
        except IndentationError:
            sys.stderr.write("!!! IndentationError !!!\n")
            # @:adhoc_run_time_section:@ off
            sys.stderr.write(''.join((dump_section, "\n")))
            # @:adhoc_run_time_section:@ on
        return dump_dict['unpacked']

    @classmethod
    def dump_file(cls, match, file_=None, source=None, tag=None, # |:clm:|
                  is_re=False):
        file_, source = cls.std_source_param(file_, source)
        if tag is None:
            tag = cls.section_tag('(adhoc_import|adhoc_update)', is_re=True)
            is_re = True
        source_sections, dump_sections = cls.tag_partition(
            source, tag, is_re, headline=True)
        dump_call = ''.join((cls.__name__, '.dump_'))
        for dump_section in dump_sections:
            tagged_line = dump_section[0]
            dump_section = dump_section[1]
            tag_arg = cls.section_tag_strip(tagged_line)
            check_match = match
            if tag_arg != match and not match.startswith('-'):
                check_match = ''.join(('-', match))
            if tag_arg != match and not match.startswith('!'):
                check_match = ''.join(('!', match))
            if tag_arg != match:
                continue
            dump_section = re.sub('^\\s+', '', dump_section)
            dump_section = re.sub(
                '^[^(]*(?s)', dump_call, dump_section)
            try:
                #RtAdHoc = cls # dump_call takes care of this
                exec(dump_section.lstrip(), globals(), locals())
            except IndentationError:
                sys.stderr.write("!!! IndentationError !!!\n")
                # @:adhoc_run_time_section:@ off
                sys.stderr.write(''.join((dump_section, "\n")))
                # @:adhoc_run_time_section:@ on

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Macros
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    macro_call_delimiters = ('@|:', ':|>')
    # @:adhoc_run_time_section:@ off
    """Macro delimiters"""
    # @:adhoc_run_time_section:@ on
    macro_xdef_delimiters = ('<|:', ':|@')
    # @:adhoc_run_time_section:@ off
    """Macro expansion delimiters"""
    # @:adhoc_run_time_section:@ on
    macros = {}
    # @:adhoc_run_time_section:@ off
    """Macros"""
    # @:adhoc_run_time_section:@ on

    @classmethod
    def expand_macros(cls, source, macro_call_dlm=None, macro_xdef_dlm=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        """
        >>> AdHoc.macros['uc_descr_end'] = (
        ...     '# o:' 'adhoc_template:>\\n'
        ...     '# <:' 'adhoc_uncomment:>\\n'
        ...     )

        >>> macro_source = '# ' + AdHoc.adhoc_tag('uc_descr_end', AdHoc.macro_call_delimiters) + '\\n'
        >>> ign = sys.stdout.write(macro_source) #doctest: +ELLIPSIS
        # @|:uc_descr_end...:|>

        >>> ign = sys.stdout.write(AdHoc.expand_macros(macro_source)) #doctest: +ELLIPSIS
        # <|:adhoc_macro_call...:|@
        # @|:uc_descr_end...:|>
        # <|:adhoc_macro_call...:|@
        # <|:adhoc_macro_expansion...:|@
        # o:adhoc_template...:>
        # <:adhoc_uncomment...:>
        # <|:adhoc_macro_expansion...:|@

        """
        # @:adhoc_run_time_section:@ on
        if macro_call_dlm is None:
            macro_call_dlm = cls.macro_call_delimiters
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        import re
        for macro_name, macro_expansion in cls.macros.items():
            macro_tag = cls.adhoc_tag(macro_name, macro_call_dlm, False)
            macro_tag_rx = cls.adhoc_tag(macro_name, macro_call_dlm, True)
            macro_call = ''.join(('# ', macro_tag, '\n'))
            macro_call_rx = ''.join(('^[^\n]*', macro_tag_rx, '[^\n]*\n'))
            mc_tag = ''.join(('# ', cls.adhoc_tag('adhoc_macro_call', macro_xdef_dlm, False), "\n"))
            mx_tag = ''.join(('# ', cls.adhoc_tag('adhoc_macro_expansion', macro_xdef_dlm, False), "\n"))
            xdef = ''.join((
                mc_tag,
                macro_call,
                mc_tag,
                mx_tag,
                macro_expansion,
                mx_tag,
                ))
            rx = re.compile(macro_call_rx, re.M)
            source = rx.sub(xdef, source)
        return source

    @classmethod
    def has_expanded_macros(cls, source, macro_xdef_dlm=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        """
        """
        # @:adhoc_run_time_section:@ on
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        mx_tag = cls.adhoc_tag('adhoc_macro_expansion', macro_xdef_dlm, False)
        me_count = len(cls.tag_lines(source, mx_tag))
        return me_count > 0

    @classmethod
    def activate_macros(cls, source, macro_call_dlm=None, macro_xdef_dlm=None): # |:clm:|
        # @:adhoc_run_time_section:@ off
        """
        """
        # @:adhoc_run_time_section:@ on
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        if not cls.has_expanded_macros(source, macro_xdef_dlm):
            source = cls.expand_macros(source, macro_call_dlm, macro_xdef_dlm)
        sv = cls.set_delimiters (macro_xdef_dlm)
        source = cls.remove_sections(source, 'adhoc_macro_call')
        source = cls.section_tag_remove(source, 'adhoc_macro_expansion')
        cls.reset_delimiters(sv)
        return source

    @classmethod
    def collapse_macros(cls, source, macro_xdef_dlm=None):   # |:clm:|
        # @:adhoc_run_time_section:@ off
        """
        """
        # @:adhoc_run_time_section:@ on
        if macro_xdef_dlm is None:
            macro_xdef_dlm = cls.macro_xdef_delimiters
        if cls.has_expanded_macros(source, macro_xdef_dlm):
            sv = cls.set_delimiters (macro_xdef_dlm)
            source = cls.section_tag_remove(source, 'adhoc_macro_call')
            source = cls.remove_sections(source, 'adhoc_macro_expansion')
            cls.reset_delimiters(sv)
        return source

    # @:adhoc_run_time_section:@ off
    # --------------------------------------------------
    # ||:sec:|| Template Interface
    # --------------------------------------------------

    # @:adhoc_run_time_section:@ on
    @classmethod
    def std_template_param(cls, file_=None, source=None,     # |:clm:|
                           tag=None, is_re=False, all_=False):
        # @:adhoc_run_time_section:@ off
        '''Setup standard template parameters.

        :param tag: If None, section tag `adhoc_template(_v)?` is
          used.

        See :meth:`std_source_param` for `file_` and `source`.
        '''
        # @:adhoc_run_time_section:@ on
        file_, source = cls.std_source_param(file_, source)
        if tag is None:
            is_re=True
            if all_:
                tag = cls.section_tag('adhoc_(template(_v)?|import|unpack)', is_re=is_re)
            else:
                tag = cls.section_tag('adhoc_template(_v)?', is_re=is_re)
        source = cls.activate_macros(source)
        return (file_, source, tag, is_re)

    @classmethod
    def get_templates(cls, file_=None, source=None,          # |:clm:|
                      tag=None, is_re=False,
                      ignore_mark=False, all_=False):
        # @:adhoc_run_time_section:@ off
        '''Extract templates matching section tag.

        :param ignore_mark: If True, all templates are mapped to
          standard output name ``-``.
        :param tag: If None, `adhoc_template` is used.
        '''
        # @:adhoc_run_time_section:@ on
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_)
        source = cls.enable_sections(source, 'adhoc_uncomment')
        source = cls.indent_sections(source, 'adhoc_indent')
        source_sections, template_sections = cls.tag_partition(
            source, tag, is_re=is_re, headline=True)
        templates = {}
        for template_section in template_sections:
            tagged_line = template_section[0]
            section = template_section[1]
            tag, tag_arg = cls.section_tag_parse(tagged_line)
            if not tag_arg:
                tag_arg = '-'
            if tag_arg in cls.template_process_hooks:
                section = cls.template_process_hooks[tag_arg](cls, section, tag, tag_arg)
            if ignore_mark:
                tag_arg = '-'
            if tag_arg not in templates:
                templates[tag_arg] = [[section], tag]
            else:
                templates[tag_arg][0].append(section)
        if all_:
            result = dict([(m, (''.join(t[0]), t[1])) for m, t in templates.items()])
        else:
            result = dict([(m, ''.join(t[0])) for m, t in templates.items()])
        return result

    @classmethod
    def template_list(cls, file_=None, source=None,          # |:clm:|
                      tag=None, is_re=False, all_=False):
        # @:adhoc_run_time_section:@ off
        """Sorted list of templates.

        See :meth:`std_template_param` for `file_`, `source`, `tag`, `is_re`.

        .. @:adhoc_disable:@

        # >>> for tpl in AdHoc.template_list():
        # ...     printf(tpl)
        # -
        # README.txt
        # -adhoc_init
        # -catch-stdout
        # -col-param-closure
        # doc/USE_CASES.txt
        # doc/index.rst
        # -max-width-class
        # -rst-to-ascii
        # -test

        # >>> for tpl in AdHoc.template_list(all_=True):
        # ...     printf(strclean(tpl))
        # ('-', 'adhoc_template')
        # ('README.txt', 'adhoc_template')
        # ('-adhoc_init', 'adhoc_template')
        # ('-catch-stdout', 'adhoc_template')
        # ('-col-param-closure', 'adhoc_template')
        # ('doc/USE_CASES.txt', 'adhoc_template')
        # ('doc/index.rst', 'adhoc_template')
        # ('-max-width-class', 'adhoc_template')
        # ('-rst-to-ascii', 'adhoc_template')
        # ('-test', 'adhoc_template')

        .. @:adhoc_disable:@
        """
        # @:adhoc_run_time_section:@ on
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_)
        templates = cls.get_templates(file_, source, tag, is_re, all_=all_)
        if all_:
            templates.update([(k, ('', v)) for k, v in cls.extra_templates])
            result = list(sorted(
                [(k, v[1]) for k, v in templates.items()],
                key=lambda kt: '||'.join((
                    kt[1],
                    (((not (kt[0].startswith('-') or kt[0].startswith('!')))
                      and (kt[0]))
                     or (kt[0][1:]))))))
        else:
            templates.update(filter(
                lambda tdef: (tdef[1] == 'adhoc_template'
                              or tdef[1] == 'adhoc_template_v'),
                cls.extra_templates))
            result = list(sorted(
                templates.keys(),
                key=lambda kt: '||'.join((
                    (((not (kt.startswith('-') or kt.startswith('!')))
                      and (kt)) or (kt[1:]))))))
        return result

    # @:adhoc_run_time_section:@ off
    # @:adhoc_template:@ -col-param-closure
    # @:adhoc_run_time_section:@ on
    @classmethod
    def col_param_closure(cls):                              # |:clm:|
        # @:adhoc_run_time_section:@ off
        '''Closure for setting up maximum width, padding and separator
        for table columns.

        :returns: a setter and a getter function for calculating the
          maximum width of a list of strings (e.g. a table column).

        >>> set_, get_ = AdHoc.col_param_closure()
        >>> i = set_("string")
        >>> get_()
        [6, '      ', '======']

        >>> i = set_("str")
        >>> get_()
        [6, '      ', '======']

        >>> i = set_("longer string")
        >>> get_()
        [13, '             ', '=============']

        >>> table_in = """\\
        ... Column1 Column2
        ... some text text
        ... some-more-text text text
        ... something text
        ... less"""

        A splitter and column parameters depending on column count:

        >>> col_count = 2
        >>> splitter = lambda line: line.split(' ', col_count-1)
        >>> col_params = [AdHoc.col_param_closure() for i in range(col_count)]

        Generic table processor:

        >>> process_cols = lambda cols: [
        ...     col_params[indx][0](col) for indx, col in enumerate(cols)]
        >>> table = [process_cols(cols) for cols in
        ...          [splitter(line) for line in table_in.splitlines()]]

        Generic table output parameters/functions:

        >>> mws = [cp[1]()[0] for cp in col_params]
        >>> sep = ' '.join([cp[1]()[2] for cp in col_params])
        >>> paddings = [cp[1]()[1] for cp in col_params]
        >>> pad_cols_c = lambda cols: [
        ...     (((paddings[indx] is None) and (col))
        ...      or ((paddings[indx][:int((mws[indx]-len(col))/2)]
        ...           + col + paddings[indx])[:mws[indx]]))
        ...     for indx, col in enumerate(cols)]
        >>> pad_cols = lambda cols: [
        ...     (((paddings[indx] is None) and (col))
        ...      or ((col + paddings[indx])[:mws[indx]]))
        ...     for indx, col in enumerate(cols)]

        Generic table output generator:

        >>> output = []
        >>> if table:
        ...     output.append(sep)
        ...     output.append(' '.join(pad_cols_c(table.pop(0))).rstrip())
        ...     if table: output.append(sep)
        ...     output.extend([' '.join(pad_cols(cols)).rstrip()
        ...                    for cols in table])
        ...     output.append(sep)

        >>> i = sys.stdout.write("\\n".join(output))
        ============== =========
           Column1      Column2
        ============== =========
        some           text text
        some-more-text text text
        something      text
        less
        ============== =========
        '''
        # @:adhoc_run_time_section:@ on
        mw = [0, "", ""]
        def set_(col):                                       # |:clo:|
            lc = len(col)
            if mw[0] < lc:
                mw[0] = lc
                mw[1] = " " * lc
                mw[2] = "=" * lc
            return col
        def get_():                                          # |:clo:|
            return mw
        return set_, get_
    # @:adhoc_run_time_section:@ off
    # @:adhoc_template:@ -col-param-closure
    # @:adhoc_run_time_section:@ on

    tt_ide = False
    tt_comment = ''
    tt_prefix = ''
    tt_suffix = ''

    @classmethod
    def template_table(cls, file_=None, source=None,         # |:clm:|
                       tag=None, is_re=False):
        # @:adhoc_run_time_section:@ off
        '''Table of template commands.

        See :meth:`std_template_param` for `file_`, `source`, `tag`, `is_re`.
        '''
        # @:adhoc_run_time_section:@ on
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_=True)
        pfx = cls.tt_prefix
        sfx = cls.tt_suffix
        comm = cls.tt_comment
        if comm:
            comm = ''.join((comm, ' '))
            pfx = ''.join((comm, pfx))
        if cls.tt_ide:
            command = ''.join(('python ', file_))
        else:
            command = os.path.basename(file_)
        # Parse table
        table = []
        tpl_arg_name = (lambda t: (((not (t.startswith('-') or t.startswith('!'))) and (t)) or (t[1:])))
        col_param = [cls.col_param_closure() for i in range(3)]
        table.append((col_param[0][0]('Command'), col_param[1][0]('Template'), col_param[2][0]('Type')))
        table.extend([
            (col_param[0][0](''.join((
                pfx,
                command, ' --template ',
                tpl_arg_name(t[0])
                )).rstrip()),
             col_param[1][0](''.join((
                 '# ', t[0]
                 )).rstrip()),
             col_param[2][0](''.join((
                 t[1], sfx
                 )).rstrip()),)
            for t in cls.template_list(file_, source, tag, is_re, all_=True)])
        if cls.tt_ide:
            itable = []
            headers = table.pop(0)
            this_type = None
            last_type = None
            for cols in reversed(table):
                this_type = cols[2].replace('")', '')
                if last_type is not None:
                    if last_type != this_type:
                        itable.append((''.join((comm, ':ide: +#-+')), '', ''))
                        itable.append((''.join((comm, '. ', last_type, '()')), '', ''))
                        itable.append(('', '', ''))
                itable.append((''.join((comm, ':ide: ', cols[1].replace('#', 'AdHoc:'))), '', ''))
                itable.append(cols)
                itable.append(('', '', ''))
                last_type = this_type
            if last_type is not None:
                itable.append((''.join((comm, ':ide: +#-+')), '', ''))
                itable.append((''.join((comm, '. ', last_type, '()')), '', ''))
            table = [headers]
            table.extend(itable)
        # Setup table output
        mw, padding = (col_param[0][1]()[0], col_param[0][1]()[1])
        mw1, padding1 = (col_param[1][1]()[0], col_param[1][1]()[1])
        mw2, padding2 = (col_param[2][1]()[0], col_param[2][1]()[1])
        sep = ' '.join([cp[1]()[2] for cp in col_param])
        make_row_c = lambda row: ''.join((
            ''.join((padding[:int((mw-len(row[0]))/2)], row[0], padding))[:mw],
            ' ', ''.join((padding1[:int((mw1-len(row[1]))/2)],
                          row[1], padding1))[:mw1],
            ' ', ''.join((padding2[:int((mw2-len(row[2]))/2)],
                          row[2], padding2))[:mw2].rstrip()))
        make_row = lambda row: ''.join((''.join((row[0], padding))[:mw],
                                        ' ', ''.join((row[1], padding))[:mw1],
                                        ' ', row[2])).rstrip()
        # Generate table
        output = []
        output.append(sep)
        output.append(make_row_c(table.pop(0)))
        if table:
            output.append(sep)
            output.extend([make_row(row) for row in table])
        output.append(sep)
        return output

    @classmethod
    def get_named_template(cls, name=None, file_=None, source=None, # |:clm:|
                           tag=None, is_re=False, ignore_mark=False):
        # @:adhoc_run_time_section:@ off
        '''Extract templates matching section tag and name.

        :param name: Template name. If None, standard output name ``-`` is used.
        :param tag: If None, `adhoc_template(_v)?` is used.
        :param ignore_mark: If True, all templates are mapped to
          standard output name ``-``.

        If a named template cannot be found and `name` does not start
        with ``-``, the template name `-name` is tried.

        >>> ign = main("adhoc.py --template adhoc_test.sub".split())
        # -*- coding: utf-8 -*-
        <BLANKLINE>
        ADHOC_TEST_SUB_IMPORTED = True

        '''
        # @:adhoc_run_time_section:@ on
        if name is None:
            name = '-'
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re, all_=True)
        templates = cls.get_templates(
            file_, source, tag, is_re=is_re, ignore_mark=ignore_mark, all_=True)
        check_name = name
        if check_name not in templates and not name.startswith('-'):
            check_name = ''.join(('-', name))
        if check_name not in templates and not name.startswith('!'):
            check_name = ''.join(('!', name))
        if check_name in templates:
            template_set = templates[check_name]
        else:
            template_set = ['', 'adhoc_template']
        template = template_set[0]
        template_type = template_set[1]
        if check_name.startswith('!'):
            template = cls.dump_(template, template_type)
        return template

    @classmethod
    def extract_templates(cls, file_=None, source=None,      # |:clm:|
                          tag=None, is_re=False, ignore_mark=False,
                          export=False):
        # @:adhoc_run_time_section:@ off
        '''Extract template.

        # @:adhoc_template_check:@ -mark
        A template ...
        # @:adhoc_template_check:@

        # @:adhoc_template_check:@ -other
        Another interleaved
        # @:adhoc_template_check:@

        # @:adhoc_template_check:@ -mark
        continued
        # @:adhoc_template_check:@

        >>> AdHoc.extract_templates(
        ...     tag=AdHoc.section_tag("adhoc_template_check"))
                A template ...
                continued
                Another interleaved

        >>> rt_section = AdHoc.get_templates(
        ...     __file__, None,
        ...     tag=AdHoc.section_tag("adhoc_run_time_section"),
        ...     ignore_mark=True)
        >>> rt_section = ''.join(rt_section.values())

        .. >>> printf(rt_section)
        '''
        # @:adhoc_run_time_section:@ on
        file_, source, tag, is_re = cls.std_template_param(
            file_, source, tag, is_re)
        templates = cls.get_templates(
            file_, source, tag, is_re=is_re, ignore_mark=ignore_mark)
        sv_extract_warn = cls.extract_warn
        cls.extract_warn = True
        for outf, template in sorted(templates.items()):
            if outf.startswith('-'):
                outf = '-'
            if outf == '-' and export:
                continue
            xfile = cls.check_xfile(outf, cls.extract_dir)
            if xfile is not None:
                cls.write_source(xfile, template)
        cls.extract_warn = sv_extract_warn

    # @:adhoc_run_time_section:@ off

    # --------------------------------------------------
    # ||:sec:|| COMPILER DATA
    # --------------------------------------------------

    # tags are generated from symbols on init
    run_time_flag = None                      # line
    import_flag = None                        # line
    include_flag = None                       # line
    verbatim_flag = None                      # line
    compiled_flag = None                      # line
    run_time_class_flag = None                # line

    rt_engine_section_tag = None              # section
    indent_section_tag = None                 # section
    uncomment_section_tag = None              # section
    enable_section_tag = None                 # section
    disable_section_tag = None                # section
    remove_section_tag = None                 # section
    import_section_tag = None                 # section
    unpack_section_tag = None                 # section
    template_v_section_tag = None             # section
    template_section_tag = None               # section
    run_time_section_tag = None               # section

    run_time_section = None

    run_time_flag_symbol = 'adhoc_run_time'   # line
    import_flag_symbol = 'adhoc'              # line
    include_flag_symbol = 'adhoc_include'     # line
    verbatim_flag_symbol = 'adhoc_verbatim'   # line
    compiled_flag_symbol = 'adhoc_compiled'   # line
    run_time_class_symbol = 'adhoc_run_time_class' # line

    rt_engine_section_symbol = 'adhoc_run_time_engine' # section
    indent_section_symbol = 'adhoc_indent'             # section
    uncomment_section_symbol = 'adhoc_uncomment'       # section
    enable_section_symbol = 'adhoc_enable'             # section
    disable_section_symbol = 'adhoc_disable'           # section
    remove_section_symbol = 'adhoc_remove'             # section
    import_section_symbol = 'adhoc_import'             # section
    unpack_section_symbol = 'adhoc_unpack'             # section
    template_v_section_symbol = 'adhoc_template_v'     # section
    template_section_symbol = 'adhoc_template'         # section
    run_time_section_symbol = 'adhoc_run_time_section' # section

    run_time_class_prefix = 'Rt'
    import_function = 'AdHoc.import_'
    modules = {}
    compiling = []

    file_include_template = (                             # |:api_fi:|
        "{ind}"
        "# {stg}\n{ind}"
        "{rtp}{ahc}("
        "{mod},"
        " file_={fnm},\n{ina}"
        " mtime={mtm},"
        " mode={fmd},\n{ina}"
        " zipped={zip},"
        " flat={flt},"
        " source64=\n"
        "{src}"
        ")\n{ind}"
        "# {etg}\n"
        )

    # --------------------------------------------------
    # ||:sec:|| Setup
    # --------------------------------------------------

    def __init__(self):                                      # |:mth:|
        self.modules = {}
        self.compiling = []
        self.setup_tags()
        self.run_time_section = self.prepare_run_time_section().rstrip() + '\n'

    @classmethod
    def setup_tags(cls):                                     # |:mth:|
        cls.run_time_flag = cls.line_tag(cls.run_time_flag_symbol)
        cls.import_flag = cls.line_tag(cls.import_flag_symbol)
        cls.verbatim_flag = cls.line_tag(cls.verbatim_flag_symbol)
        cls.include_flag = cls.line_tag(cls.include_flag_symbol)
        cls.compiled_flag = cls.line_tag(cls.compiled_flag_symbol)
        cls.run_time_class_flag = cls.line_tag(cls.run_time_class_symbol)

        cls.rt_engine_section_tag = cls.section_tag(cls.rt_engine_section_symbol)
        cls.indent_section_tag = cls.section_tag(cls.indent_section_symbol)
        cls.uncomment_section_tag = cls.section_tag(cls.uncomment_section_symbol)
        cls.enable_section_tag = cls.section_tag(cls.enable_section_symbol)
        cls.disable_section_tag = cls.section_tag(cls.disable_section_symbol)
        cls.remove_section_tag = cls.section_tag(cls.remove_section_symbol)
        cls.import_section_tag = cls.section_tag(cls.import_section_symbol)
        cls.unpack_section_tag = cls.section_tag(cls.unpack_section_symbol)
        cls.template_v_section_tag = cls.section_tag(cls.template_v_section_symbol)
        cls.template_section_tag = cls.section_tag(cls.template_section_symbol)
        cls.run_time_section_tag = cls.section_tag(
            cls.run_time_section_symbol)

    # --------------------------------------------------
    # ||:sec:|| Tools
    # --------------------------------------------------

    @staticmethod
    def strquote(source, indent=(' ' * 4)):                  # |:fnc:|
        source = source.replace("'", "\\'")
        length = 78 - 2 - 4 - len(indent)
        if length < 50:
            length = 50
        output_parts = []
        indx = 0
        limit = len(source)
        while indx < limit:
            output_parts.extend((
                indent, "    '", source[indx:indx+length], "'\n"))
            indx += length
        return ''.join(output_parts)

    # --------------------------------------------------
    # ||:sec:|| Run-Time Section
    # --------------------------------------------------

    @classmethod
    def adhoc_run_time_sections_from_string(cls, string, symbol): # |:clm:|
        tag = sformat('(#[ \t\r]*)?{0}', cls.section_tag(symbol, is_re=True))
        def_sections = cls.tag_sections(string, tag, is_re=True)
        return def_sections

    @classmethod
    def adhoc_run_time_section_from_file(cls, file_, symbol): # |:clm:|
        if file_.endswith('.pyc'):
            file_ = file_[:-1]
        string = cls.read_source(file_)
        def_sections = cls.adhoc_run_time_sections_from_string(
            string, symbol)
        return def_sections

    @classmethod
    def adhoc_get_run_time_section(                          # |:clm:|
        cls, symbol, prolog='', epilog=''):
        import datetime

        adhoc_module_places = []

        # try __file__
        adhoc_module_places.append(__file__)
        def_sections = cls.adhoc_run_time_section_from_file(
            __file__, symbol)
        if len(def_sections) == 0:
            # try adhoc.__file__
            try:
                import adhoc
                adhoc_module_places.append(adhoc.__file__)
                def_sections = cls.adhoc_run_time_section_from_file(
                    adhoc.__file__, symbol)
            except:
                pass
        if len(def_sections) == 0:
            # try adhoc.__adhoc__.source
            try:
                adhoc_module_places.append('adhoc.__adhoc__.source')
                def_sections = cls.adhoc_run_time_sections_from_string(
                    adhoc.__adhoc__.source, symbol)
            except:
                pass

        if len(def_sections) == 0:
            adhoc_dump_list(def_sections)
            raise AdHocError(sformat('{0} not found in {1}',
                    cls.section_tag(symbol),
                    ', '.join(adhoc_module_places)))

        def_ = ''.join((
                sformat('# {0}\n', cls.remove_section_tag),
                sformat('# {0}\n', cls.rt_engine_section_tag),
                sformat('# -*- coding: utf-8 -*-\n'),
                sformat('# {0} {1}\n', cls.compiled_flag,
                                     datetime.datetime.now(),
                                     # |:todo:| add input filename
                                     ),
                prolog,
                ''.join(def_sections),
                epilog,
                sformat('# {0}\n', cls.rt_engine_section_tag),
                sformat('# {0}\n', cls.remove_section_tag),
                ))
        return def_

    @classmethod
    def prepare_run_time_section(cls):                       # |:mth:|
        rts = cls.adhoc_get_run_time_section(
            cls.run_time_section_symbol)
        rtc_sections = cls.tag_split(
            rts, cls.run_time_class_flag)
        transform = []
        done = False
        use_next = False
        for section in rtc_sections:
            blob = section[1]
            if section[0]:
                use_next = blob
                continue
            if use_next:
                if not done:
                    mo = re.search('class[ \t\r]+', blob)
                    if mo:
                        blob = (blob[:mo.end(0)]
                              + cls.run_time_class_prefix
                              + blob[mo.end(0):])
                        done = True
                    else:
                        #transform.append(use_next)
                        pass
                use_next = False
            transform.append(blob)
        transform.append(sformat('# {0}\n', cls.remove_section_tag))
        transform.append(sformat('# {0}\n', cls.rt_engine_section_tag))
        transform.append(sformat('# {0}\n', cls.rt_engine_section_tag))
        transform.append(sformat('# {0}\n', cls.remove_section_tag))
        rts = ''.join(transform)
        if not done:
            raise AdHocError(
                sformat('run-time class(tag) `{0}` not found in:\n{1}',
                        cls.run_time_class_flag, rts))
        return rts

    # --------------------------------------------------
    # ||:sec:|| Internal Includer (verbatim)
    # --------------------------------------------------

    def verbatim_(self, string, name=None):                  # |:mth:|
        '''Entry point for verbatim inclusion.

        :returns: string with verbatim included files.

        :param string: input string, with |adhoc_verbatim| flags.
        :param name: ignored. (API compatibility with
          :meth:`AdHoc.compile_`).

        .. note:: double commented flags, e.g. ``##``
           |adhoc_verbatim|, are ignored.

        .. \\|:here:|

        >>> section = """\\
        ... some
        ...     @:""" """adhoc_verbatim:@ {flags} my_verbatim{from_}
        ... text\\
        ... """

        >>> adhoc = AdHoc()

        **Non-existent File**

        >>> sv_quiet = AdHoc.quiet
        >>> AdHoc.quiet = True
        >>> source = adhoc.verbatim_(sformat(section, flags="-2#", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -2# my_verbatim
        text
        >>> AdHoc.quiet = sv_quiet

        **Empty File**

        >>> source = adhoc.verbatim_(sformat(section, flags="", from_=" from /dev/null"))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim...  my_verbatim from /dev/null
            # @:adhoc_remove...
            # @:adhoc_indent... -4
            # @:adhoc_template_v... my_verbatim
            # @:adhoc_template_v...
            # @:adhoc_indent...
            # @:adhoc_remove...
        text

        **Empty file, with negative indent, commented**

        >>> source = adhoc.verbatim_(sformat(section, flags="-2#", from_=" from /dev/null"))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -2# my_verbatim from /dev/null
          # @:adhoc_remove...
          # @:adhoc_uncomment...
          # @:adhoc_indent... -2
          # @:adhoc_template_v... my_verbatim
          # @:adhoc_template_v...
          # @:adhoc_indent...
          # @:adhoc_uncomment...
          # @:adhoc_remove...
        text

        **Empty file, with overflowing negative indent, commented**

        >>> source = adhoc.verbatim_(sformat(section, flags="-8#", from_=" from /dev/null"))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -8# my_verbatim from /dev/null
        # @:adhoc_remove...
        # @:adhoc_uncomment...
        # @:adhoc_template_v... my_verbatim
        # @:adhoc_template_v...
        # @:adhoc_uncomment...
        # @:adhoc_remove...
        text

        **Existing file, without newline at end of file, commented.**

        >>> mvf = open("my_verbatim", "w")
        >>> ign = mvf.write("no end of line")
        >>> mvf.close()
        >>> source = adhoc.verbatim_(sformat(section, flags="-4#", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -4# my_verbatim
        # @:adhoc_remove...
        # @:adhoc_uncomment...
        # @:adhoc_template_v... my_verbatim
        # no end of line
        # @:adhoc_template_v...
        # @:adhoc_uncomment...
        # @:adhoc_remove...
        text

        **Existing file, with extra newline at end of file, commented.**

        >>> mvf = open("my_verbatim", "w")
        >>> ign = mvf.write("extra end of line\\n\\n")
        >>> mvf.close()
        >>> source = adhoc.verbatim_(sformat(section, flags="-4#", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -4# my_verbatim
        # @:adhoc_remove...
        # @:adhoc_uncomment...
        # @:adhoc_template_v... my_verbatim
        # extra end of line
        <BLANKLINE>
        # @:adhoc_template_v...
        # @:adhoc_uncomment...
        # @:adhoc_remove...
        text

        **Existing file, without newline at end of file, not commented.**

        >>> mvf = open("my_verbatim", "w")
        >>> ign = mvf.write("no end of line")
        >>> mvf.close()
        >>> source = adhoc.verbatim_(sformat(section, flags="-4", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... -4 my_verbatim
        # @:adhoc_remove...
        # @:adhoc_template_v... my_verbatim
        no end of line
        # @:adhoc_template_v...
        # @:adhoc_remove...
        text

        **Existing file, with extra newline at end of file, not commented.**

        >>> mvf = open("my_verbatim", "w")
        >>> ign = mvf.write("extra end of line\\n\\n")
        >>> mvf.close()
        >>> source = adhoc.verbatim_(sformat(section, flags="", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... my_verbatim
            # @:adhoc_remove...
            # @:adhoc_indent:@ -4
            # @:adhoc_template_v... my_verbatim
            extra end of line
        <BLANKLINE>
            # @:adhoc_template_v...
            # @:adhoc_indent:@
            # @:adhoc_remove...
        text

        **Existing file, but override with source /dev/null.**

        >>> source = adhoc.verbatim_(sformat(section, flags="/dev/null as", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... /dev/null as my_verbatim
            # @:adhoc_remove...
            # @:adhoc_indent... -4
            # @:adhoc_template_v... my_verbatim
            # @:adhoc_template_v...
            # @:adhoc_indent...
            # @:adhoc_remove...
        text

        **Existing file, override with non-existing source /not-here/.**

        >>> if os.path.exists("not-here"):
        ...     os.unlink("not-here")
        >>> source = adhoc.verbatim_(sformat(section, flags="not-here as", from_=""))
        >>> printf(source) #doctest: +ELLIPSIS
        some
            @:adhoc_verbatim... not-here as my_verbatim
            # @:adhoc_remove...
            # @:adhoc_indent... -4
            # @:adhoc_template_v... my_verbatim
            extra end of line
        <BLANKLINE>
            # @:adhoc_template_v...
            # @:adhoc_indent...
            # @:adhoc_remove...
        text

        >>> os.unlink("my_verbatim")
        '''
        m = 'is: '

        import datetime

        # # check for @: adhoc_compiled :@
        # adhoc_compiled_lines = self.tag_lines(
        #     string, self.line_tag('adhoc_compiled'))
        # if len(adhoc_compiled_lines) > 0:
        #     sys.stderr.write(sformat(
        #         '{0}{1}' 'warning: {2} already AdHoc\'ed `{3}`\n',
        #         dbg_comm, m, name, adhoc_compiled_lines[0].rstrip()))
        #     return string

        # handle @: adhoc_verbatim :@
        result = []
        verbatim_cmd_parts = self.tag_split(string, self.verbatim_flag)
        for part in verbatim_cmd_parts:
            verbatim_def = part[1]
            result.append(verbatim_def)
            if part[0]:
                # skip commented verbatim includes
                if re.match('\\s*#\\s*#', verbatim_def):
                    if self.verbose:
                        printe(sformat(
                            '{0}{1}Skipping disabled verbatim `{2}`',
                            dbg_comm, m, verbatim_def.rstrip()))
                    continue

                indent = ''
                mo = re.match('\\s*', verbatim_def)
                if mo:
                    indent = mo.group(0)

                verbatim_def = self.line_tag_strip(
                    verbatim_def, self.verbatim_flag_symbol)
                verbatim_specs = []
                for verbatim_spec in re.split('\\s*,\\s*', verbatim_def):
                    verbatim_spec1 = re.split('\\s+from\\s+', verbatim_spec)
                    verbatim_spec2 = re.split('\\s+as\\s+', verbatim_spec)
                    default = None
                    source = None
                    output = None
                    flags = None
                    if len(verbatim_spec1) > 1:
                        output = verbatim_spec1[0]
                        default = verbatim_spec1[1]
                        fields = re.split('\\s+', output, 1)
                        if len(fields) > 1:
                            flags = fields[0]
                            output = fields[1]
                        else:
                            flags = ''
                        source = output
                    if len(verbatim_spec2) > 1:
                        source = verbatim_spec2[0]
                        output = verbatim_spec2[1]
                        fields = re.split('\\s+', source, 1)
                        if len(fields) > 1:
                            flags = fields[0]
                            source = fields[1]
                        else:
                            flags = ''
                        default = output
                    if flags is None:
                        source = verbatim_spec
                        fields = re.split('\\s+', source, 1)
                        if len(fields) > 1:
                            flags = fields[0]
                            source = fields[1]
                        else:
                            flags = ''
                            source = fields[0]
                        default = source
                        output = source
                    verbatim_specs.append([flags, source, default, output])

                for verbatim_spec in verbatim_specs:
                    vflags = verbatim_spec.pop(0)
                    ifile = verbatim_spec.pop()
                    found = False
                    for lfile in verbatim_spec:
                        lfile = os.path.expanduser(lfile)
                        blfile = lfile
                        for include_dir in self.include_path:
                            if not os.path.exists(lfile):
                                if not (os.path.isabs(blfile)):
                                    lfile = os.path.join(include_dir, blfile)
                                    continue
                            break
                        if os.path.exists(lfile):
                            stat = os.stat(lfile)
                            mtime = datetime.datetime.fromtimestamp(
                                stat.st_mtime)
                            mode = stat.st_mode

                            exp_source = self.read_source(lfile)
                            source_len = len(exp_source)

                            start_tags = []
                            end_tags = []
                            prefix = []
                            tag_prefix = ['# ']

                            mo = re.search('[-+]?[0-9]+', vflags)
                            if mo:
                                uindent = int(mo.group(0))
                            else:
                                uindent = 0

                            tindent = (len(indent) + uindent)
                            if tindent < 0:
                                tindent = 0
                            if tindent:
                                tag = self.indent_section_tag
                                start_tags.insert(
                                    0, ''.join((tag, ' ', str(-tindent))))
                                end_tags.append(tag)
                                prefix.insert(0, ' ' * tindent)
                                tag_prefix.insert(0, ' ' * tindent)

                            if '#' in vflags:
                                tag = self.uncomment_section_tag
                                start_tags.insert(0, tag)
                                end_tags.append(tag)
                                exp_source, hl = self.disable_transform(exp_source)

                            tag = self.remove_section_tag
                            start_tags.insert(0, tag)
                            end_tags.append(tag)

                            tag = self.section_tag('adhoc_template_v')
                            start_tags.append(''.join((tag, ' ', ifile)))
                            end_tags.insert(0,tag)

                            prefix = ''.join(prefix)
                            tag_prefix = ''.join(tag_prefix)
                            if prefix and exp_source:
                                if exp_source.endswith('\n'):
                                    exp_source = exp_source[:-1]
                                exp_source = re.sub('^(?m)', prefix, exp_source)
                            if exp_source and not exp_source.endswith('\n'):
                                exp_source = ''.join((exp_source, '\n'))

                            output = []
                            output.extend([''.join((
                                tag_prefix, tag, '\n')) for tag in start_tags])
                            output.append(exp_source)
                            output.extend([''.join((
                                tag_prefix, tag, '\n')) for tag in end_tags])
                            result.append(''.join(output))
                            found = True

                            # |:debug:|
                            if self.verbose:
                                printe(sformat(
                                    "{0}{3:^{1}} {4:<{2}s}: ]len: {5:>6d}"
                                    " exp: {6:>6d} ]{9}[",
                                    dbg_comm, dbg_twid, dbg_fwid, ':INF:',
                                    'source stats', source_len, len(exp_source),
                                    0, 0, ifile))
                            # |:debug:|
                            break
                    if not found and not self.quiet:
                        list(map(sys.stderr.write,
                                 ("# if: ", self.__class__.__name__,
                                  ": warning verbatim file `", ifile,
                                  "` not found from `",
                                  ', '.join(verbatim_spec), "`\n")))
        #adhoc_dump_list(result)
        return ''.join(result)

    # --------------------------------------------------
    # ||:sec:|| Internal Includer (packed)
    # --------------------------------------------------

    def include_(self, string, name=None, zipped=True, flat=None): # |:mth:|
        '''Entry point for inclusion.

        :returns: string with packed included files.

        :param string: input string, with |adhoc_include| flags.
        :param name: ignored. (API compatibility with
          :meth:`AdHoc.compile_`).
        :param zipped: if True, :mod:`gzip` included files.

        .. note:: double commented flags, e.g. ``##``
           |adhoc_include|, are ignored.

        .. \\|:here:|

        >>> section = """\\
        ... some
        ... @:""" """adhoc_include:@ Makefile
        ... text\\
        ... """

        .. @:adhoc_disable:@

        # >>> adhoc = AdHoc()
        # >>> source = adhoc.include_(section)
        # >>> printf(source) #doctest: +ELLIPSIS
        # some
        # @:adhoc_include... Makefile
        # # @:adhoc_unpack...
        # RtAdHoc.unpack_(None, file_='Makefile',
        #     mtime='...', mode=...,
        #     zipped=True, flat=None, source64=
        # ...
        # # @:adhoc_unpack...
        # text

        .. @:adhoc_disable:@
        '''
        m = 'is: '

        import datetime

        # # check for @: adhoc_compiled :@
        # adhoc_compiled_lines = self.tag_lines(
        #     string, self.line_tag('adhoc_compiled'))
        # if len(adhoc_compiled_lines) > 0:
        #     sys.stderr.write(sformat(
        #         '{0}{1}' 'warning: {2} already AdHoc\'ed `{3}`\n',
        #         dbg_comm, m, name, adhoc_compiled_lines[0].rstrip()))
        #     return string

        # handle @: adhoc_include :@
        result = []
        include_cmd_sections = self.tag_split(string, self.include_flag)
        for section in include_cmd_sections:
            include_def = section[1]
            result.append(include_def)
            if section[0]:
                # skip commented includes
                if re.match('\\s*#\\s*#', include_def):
                    if self.verbose:
                        printe(sformat(
                            '{0}{1}Skipping disabled include `{2}`',
                            dbg_comm, m, include_def.rstrip()))
                    continue

                indent = ''
                mo = re.match('\\s*', include_def)
                if mo:
                    indent = mo.group(0)

                include_def = self.line_tag_strip(
                    include_def, self.include_flag_symbol)
                include_specs = []
                for include_spec in re.split('\\s*,\\s*', include_def):
                    include_spec1 = re.split('\\s+from\\s+', include_spec)
                    include_spec2 = re.split('\\s+as\\s+', include_spec)
                    default = None
                    source = None
                    output = None
                    if len(include_spec1) > 1:
                        output = include_spec1[0]
                        default = include_spec1[1]
                        source = output
                    if len(include_spec2) > 1:
                        source = include_spec2[0]
                        output = include_spec2[1]
                        default = output
                    if source is None:
                        source = include_spec
                        output = source
                        default = source
                    include_specs.append([source, default, output])

                for include_spec in include_specs:
                    ifile = include_spec.pop()
                    found = False
                    for lfile in include_spec:
                        lfile = os.path.expanduser(lfile)
                        blfile = lfile
                        for include_dir in self.include_path:
                            if not os.path.exists(lfile):
                                if not (os.path.isabs(blfile)):
                                    lfile = os.path.join(include_dir, blfile)
                                    continue
                            break
                        if os.path.exists(lfile):
                            stat = os.stat(lfile)
                            mtime = datetime.datetime.fromtimestamp(
                                stat.st_mtime)
                            mode = stat.st_mode

                            exp_source = self.read_source(lfile, decode=False)
                            source64 = self.pack_file(exp_source, zipped)
                            output = self.strquote(source64, indent)
                            file_include_args = dict([    # |:api_fi:|
                                ('ind', indent),
                                ('ina', ''.join((indent, "   "))),
                                ('stg', ''.join((self.unpack_section_tag, ' !', ifile))),
                                ('etg', self.unpack_section_tag),
                                ('rtp', self.run_time_class_prefix),
                                ('ahc', 'AdHoc.unpack_'),
                                ('mod', 'None'),
                                ('fnm', repr(str(ifile))),
                                ('mtm', (((mtime is not None)
                                          and repr(mtime.isoformat()))
                                         or repr(mtime))),
                                ('fmd', (mode is not None and sformat('int("{0:o}", 8)', mode)) or mode),
                                ('zip', zipped),
                                ('flt', flat),
                                ('src', output.rstrip()),
                            ])
                            output = sformat(
                                self.file_include_template,
                                **file_include_args
                                )
                            result.append(output)
                            found = True
                            # |:debug:|
                            if self.verbose:
                                source_len = len(exp_source)
                                exp_source_len = len(exp_source)
                                source64_len = len(source64)
                                printe(sformat(
                                    "{0}{3:^{1}} {4:<{2}s}: ]len: {5:>6d}"
                                    " exp: {6:>6d} b64: {8:>6d}[ ]{9}[",
                                    dbg_comm, dbg_twid, dbg_fwid, ':INF:',
                                    'source stats', source_len, exp_source_len,
                                    0, source64_len, ifile))
                            # |:debug:|
                            break
                    if not found and not self.quiet:
                        list(map(sys.stderr.write,
                                 ("# if: ", self.__class__.__name__,
                                  ": warning include file `",
                                  ifile, "` not found from `",
                                  ', '.join(include_spec), "`\n")))
        #adhoc_dump_list(result)
        return ''.join(result)

    # --------------------------------------------------
    # ||:sec:|| Internal Compiler
    # --------------------------------------------------

    def encode_module_(                                      # |:mth:|
        self, module, for_=None, indent='', zipped=True, flat=None, forced=None):
        m = 'gm: '

        if for_ is None:
            for_ = self.import_function

        if forced is None:
            forced = self.forced

        module = self.module_setup(module)
        module_name = module.__name__

        # no multiple occurences
        if (not forced
            and (module_name in self.modules
                 or module_name in self.compiling)):
            if self.verbose:
                 # |:check:| what, if the previous import was never
                 # executed?
                sys.stderr.write(sformat(
                        '{0}{1}`{2}` already seen. skipping ...\n',
                        dbg_comm, m, module_name))
            return ''

        self.compiling.append(module_name)

        result = []
        # |:todo:| parent modules
        parts = module_name.split('.')
        parent_modules = parts[:-1]
        if self.verbose and len(parent_modules) > 0:
            sys.stderr.write(sformat(
                    '{0}{1}Handle parent module(s) `{2}`\n',
                    dbg_comm, m, parent_modules))
        for parent_module in parent_modules:
            result.append(self.encode_module_(
                parent_module, for_, indent, zipped, flat, forced))

        if (module_name in self.modules):
            if self.verbose:
                sys.stderr.write(sformat(
                    '{0}{1}{1} already seen after parent import\n',
                    dbg_comm, m, module_name))
            return ''.join(result)

        if hasattr(module, '__file__'):
            module_file = module.__file__
            if module_file.endswith('.pyc'):
                module_file = module_file[:-1]
        else:
            module_file = None

        if hasattr(module.__adhoc__, 'source'):
            source = module.__adhoc__.source
        else:
            if not self.quiet:
                printf(sformat(
                    '{0}{1}|' 'warning: `{2}` does not have any source code.',
                    dbg_comm, m, module_name), file=sys.stderr)
            source = ''
            return ''.join(result)

        # recursive!
        exp_source = self.compile_(source, module_file, for_, zipped, forced)
        source64 = self.pack_file(exp_source, zipped)
        output = self.strquote(source64, indent)

        mtime = module.__adhoc__.mtime
        mode = module.__adhoc__.mode
        # |:todo:| make Rt prefix configurable
        file_include_args = dict([                        # |:api_fi:|
            ('ind', indent),
            ('ina', ''.join((indent, "   "))),
            ('stg', ''.join((self.import_section_tag, ' !', module_name))),
            ('etg', self.import_section_tag),
            ('rtp', self.run_time_class_prefix),
            ('ahc', for_),
            ('mod', repr(module.__name__)),
            ('fnm', (((module_file is not None)
                      and repr(str(os.path.relpath(module_file))))
                     or module_file)),
            ('mtm', (((mtime is not None)
                      and repr(mtime.isoformat()))
                     or repr(mtime))),
            ('fmd', (mode is not None and sformat('int("{0:o}", 8)', mode)) or mode),
            ('zip', zipped),
            ('src', output.rstrip()),
            ('flt', flat),
            ])
        output = sformat(
            self.file_include_template,
            **file_include_args
            )
        result.append(output)

        # |:debug:|
        if self.verbose:
            source_len = len(source)
            exp_source_len = len(exp_source)
            source64_len = len(source64)
            printe(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]len: {5:>6d} exp: {6:>6d}"
                " b64: {8:>6d}[ ]{9}[",
                dbg_comm, dbg_twid, dbg_fwid, ':INF:',
                'source stats', source_len, exp_source_len, 0,
                source64_len, module_file))
        # |:debug:|
        return ''.join(result)

    def compile_(self, string, name=None, for_=None,         # |:mth:|
                 zipped=True, forced=None):
        '''Entry point for compilation.

        :returns: string with fully compiled adhoc source. Includes
          run-time class, imports, packed includes, verbatim includes,
          enabled/disabled sections.

        :param string: input string, with |adhoc| flags.
        :param name: for messages.
        :param for_: :class:`RtAdHoc` method call.
        :param zipped: if True, :mod:`gzip` included files.

        .. note:: for |adhoc|, commented lines, e.g.
           ``# import module # @:``\\ ``adhoc:@``, are ignored.

        .. \\|:here:|
        '''
        m = 'cs: '
        if name is None:
            name = repr(string[:50])
        # check for @: adhoc_compiled :@
        string = self.expand_macros(string)
        adhoc_compiled_lines = self.tag_lines(
            string, self.line_tag('adhoc_compiled'))
        if len(adhoc_compiled_lines) > 0:
            if not self.quiet:
                list(map(sys.stderr.write,
                         ('# ', m,  'warning: ', name, ' already AdHoc\'ed `',
                          adhoc_compiled_lines[0].rstrip(), '`\n',)))
            return string

        # check for @: adhoc_self :@ (should not be taken from any templates)
        adhoc_self_tag = self.line_tag('adhoc_self')
        adhoc_self_lines = self.tag_lines(
            string, adhoc_self_tag)
        if len(adhoc_self_lines) > 0:
            for line in adhoc_self_lines:
                line = re.sub(''.join(('^.*', adhoc_self_tag)), '', line)
                line = line.strip()
                selfs = line.split()
                if self.verbose:
                    printe(sformat(
                        '{0}{1}|' ':INF:| {2} found self: `{3}`',
                        dbg_comm, m, name, ', '.join(selfs)))
                self.compiling.extend(selfs)

        # check for @: adhoc_remove :@
        string = self.section_tag_rename(string, 'adhoc_remove', 'adhoc_remove_')

        # check for @: adhoc_verbatim :@ (templates can define the run-time flag, includes, imports)
        string = self.verbatim_(string, name)

        # search for @: adhoc_run_time :@ and put run-time section there!
        result = []
        ah_run_time_sections = self.tag_split(
            string, self.line_tag(self.run_time_flag_symbol))
        good = False
        for section in ah_run_time_sections:
            config_def = section[1]
            if not good and section[0]:
                # ignore double commented tagged lines
                if not re.match('\\s*#\\s*#', config_def):
                    config_def = sformat('{0}{1}',
                        config_def, self.run_time_section)
                    good = True
            result.append(config_def)
        string = ''.join(result)

        # check for @: adhoc_include :@
        string = self.include_(string, name, zipped)

        # handle @: adhoc :@ imports
        result = []
        import_cmd_sections = self.tag_split(string, self.import_flag)
        if not good and len(import_cmd_sections) > 1:
            adhoc_dump_sections(import_cmd_sections)
            raise AdHocError(sformat('{0} not found',
                    self.line_tag(self.run_time_flag_symbol)))
        for section in import_cmd_sections:
            import_def = section[1]
            if section[0]:
                # skip commented imports
                if re.match('\\s*#', import_def):
                    if self.verbose:
                        printe(sformat(
                            '{0}{1}Skipping disabled `{2}`',
                            dbg_comm, m, import_def.rstrip()))
                    result.append(import_def)
                    continue
                import_args = self.line_tag_strip(import_def, self.import_flag_symbol)
                module = ''
                mo = re.match(
                    '(\\s*)from\\s+([a-zA-Z_][.0-9a-zA-Z_]*)\\s+'
                    'import', import_def)
                if mo:
                    indent = mo.group(1)
                    module = mo.group(2)
                else:
                    mo = re.match(
                        '([ \t\r]*)import[ \t\r]+([a-zA-Z_][.0-9a-zA-Z_]*)',
                        import_def)
                    if mo:
                        indent = mo.group(1)
                        module = mo.group(2)
                if len(module) > 0:
                    module_flat = ((('flat' in import_args.lower().split()) and (True)) or (None))
                    module_flat = ((('full' in import_args.lower().split()) and (False)) or (module_flat))
                    module_forced = ((('force' in import_args.lower().split()) and (True)) or (forced))
                    source = self.encode_module_(module, for_, indent, zipped, module_flat, module_forced)
                    import_def = sformat('{0}{1}',source, import_def)
                else:
                    if self.verbose:
                        list(map(sys.stderr.write,
                                 ('# ', m, 'warning: no import found! `',
                                  import_def.rstrip(), '`\n')))
            result.append(import_def)
        string = ''.join(result)

        # These are last, to avoid enabling/disabling the wrong imports etc.

        # check for @: adhoc_enable :@
        string = self.enable_sections(string, 'adhoc_enable')
        # check for @: adhoc_disable :@
        string = self.disable_sections(string, 'adhoc_disable')

        #adhoc_dump_list(result)
        return string

    # --------------------------------------------------
    # ||:sec:|| User API
    # --------------------------------------------------

    def encode_include(                                      # |:mth:|
        self, file_, as_=None, indent='', zipped=True):
        m = 'if: '

    def encode_module(                                       # |:mth:|
        self, module, for_=None, indent='', zipped=True, flat=None, forced=None):
        if hasattr(module, __name__):
            name = module.__name__
        else:
            name = module
        if self.verbose:
            sys.stderr.write(sformat(
                '{0}--------------------------------------------------\n',
                dbg_comm))
            sys.stderr.write(sformat(
                '{0}Get module `{1}`\n',
                dbg_comm, name))
            sys.stderr.write(sformat(
                '{0}--------------------------------------------------\n',
                dbg_comm))
        return self.encode_module_(module, for_, indent, zipped, flat, forced)

    def compile(self, string, name=None, for_=None,          # |:mth:|
                zipped=True, forced=None):
        '''Compile a string into adhoc output.'''
        if self.verbose:
            if name is None:
                name = repr(string[:50])
            sys.stderr.write(sformat(
                    '{0}--------------------------------------------------\n',
                    dbg_comm))
            sys.stderr.write(sformat(
                    '{0}Compiling string `{1}`\n',
                    dbg_comm, name))
            sys.stderr.write(sformat(
                    '{0}--------------------------------------------------\n',
                    dbg_comm))
        return self.compile_(string, name, for_, zipped, forced)
    # @:adhoc_run_time_section:@ on

    def compileFile(self, file_name, for_=None, zipped=True, forced=None): # |:mth:|
        # @:adhoc_run_time_section:@ off
        """Compile a file into adhoc output.

        Since a module that has RtAdHoc defined is already adhoc'ed,
        the run-time RtAdHoc method returns the file source as is.
        """
        # @:adhoc_run_time_section:@ on
        # @:adhoc_run_time_section:@ off
        if self.verbose:
            sys.stderr.write(sformat(
                '{0}--------------------------------------------------\n',
                dbg_comm))
            sys.stderr.write(
                sformat('{0}Compiling {1}\n',dbg_comm, file_name))
            sys.stderr.write(sformat(
                '{0}--------------------------------------------------\n',
                dbg_comm))
        # @:adhoc_run_time_section:@ on
        file_name, source = self.std_source_param(file_name, None)
        # @:adhoc_run_time_section:@ off
        source = self.compile_(source, file_name, for_, zipped, forced)
        # @:adhoc_run_time_section:@ on
        return source
    # @:adhoc_run_time_section:@ END

# (progn (forward-line -1) (insert "\n") (snip-insert-mode "py.s.class" t) (backward-symbol-tag 2 "fillme" "::"))

# --------------------------------------------------
# |||:sec:||| FUNCTIONS
# --------------------------------------------------

# (progn (forward-line 1) (snip-insert-mode "py.f.hl" t) (insert "\n"))
hlr = None
def hlcr(title=None, tag='|||' ':CHP:|||', rule_width=50, **kwargs): # ||:fnc:||
    comm = ((('dbg_comm' in globals()) and (globals()['dbg_comm'])) or ('# '))
    dstr = []
    dstr.append(''.join((comm, '-' * rule_width)))
    if title:
        dstr.append(sformat('{0}{2:^{1}} {3!s}',
                comm, ((('dbg_twid' in globals()) and (globals()['dbg_twid'])) or (9)),
                tag, title))
        dstr.append(''.join((comm, '-' * rule_width)))
    return '\n'.join(dstr)

def hlsr(title=None, tag='||' ':SEC:||', rule_width=35, **kwargs): # |:fnc:|
    return hlcr(title, tag, rule_width)

def hlssr(title=None, tag='|' ':INF:|', rule_width=20, **kwargs): # |:fnc:|
    return hlcr(title, tag, rule_width)

def hlc(*args, **kwargs):                                    # |:fnc:|
    for line in hlcr(*args, **kwargs).splitlines():
        printf(line, **kwargs)

def hls(*args, **kwargs):                                    # |:fnc:|
    for line in hlsr(*args, **kwargs).splitlines():
        printf(line, **kwargs)

def hlss(*args, **kwargs):                                   # |:fnc:|
    for line in hlssr(*args, **kwargs).splitlines():
        printf(line, **kwargs)

def hl(*args, **kwargs):                                     # |:fnc:|
    for line in hlr(*args, **kwargs).splitlines():
        printf(line, **kwargs)

def hl_lvl(level=0):                                         # |:fnc:|
    global hlr
    if level == 0:
        hlr = hlssr
    elif level == 1:
        hlr = hlsr
    else:
        hlr = hlcr

hl_lvl(0)

# (progn (forward-line 1) (snip-insert-mode "py.f.single.quote" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.f.remove.match" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.f.printenv" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.f.uname-s" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.f.printe" t) (insert "\n"))
def printe(*args, **kwargs):                               # ||:fnc:||
    kwargs['file'] = kwargs.get('file', sys.stderr)
    printf(*args, **kwargs)

# (progn (forward-line 1) (snip-insert-mode "py.f.dbg.squeeze" t) (insert "\n"))
# (progn (forward-line 1) (snip-insert-mode "py.f.dbg.indent" t) (insert "\n"))

# (progn (forward-line -1) (insert "\n") (snip-insert-mode "py.s.func" t) (backward-symbol-tag 2 "fillme" "::"))

# --------------------------------------------------
# |||:sec:||| UTILTIES
# --------------------------------------------------

def adhoc_dump_list(list_, max_wid=None):                  # ||:fnc:||
    if max_wid is None:
        max_wid = 78
    for indx, elt in enumerate(list_):
        elt = str(elt)
        if len(elt) > max_wid:
            elt = elt[:max_wid-3] + ' ...'
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':DBG:', sformat('elt[{0}]', indx), repr(elt)))

def adhoc_dump_sections(sections, max_wid=None):           # ||:fnc:||
    if max_wid is None:
        max_wid = 78
    for indx, section in enumerate(sections):
        cut_section = list(section)
        if len(cut_section[1]) > max_wid:
            cut_section[1] = cut_section[1][:max_wid-3] + ' ...'
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':DBG:', sformat('section[{0}]', indx), strclean(cut_section)))

# @:adhoc_uncomment:@
# @:adhoc_template:@ -catch-stdout
def catch_stdout():                                        # ||:fnc:||
    """Install a string IO as `sys.stdout`.

    :returns: a state variable that is needed by
      :func:`restore_stdout` to retrieve the output as string.
    """
    output_sio = _AdHocStringIO()
    sv_stdout = sys.stdout
    sys.stdout = output_sio
    return (sv_stdout, output_sio)

def restore_stdout(state):                                 # ||:fnc:||
    """Restore capturing `sys.stdout` and get captured output.

    :returns: captured output as string.

    :param state: state variable obtained from :func:`catch_stdout`.
    """
    sys.stdout, output_sio = state
    output = output_sio.getvalue()
    output_sio.close()
    return output
# @:adhoc_template:@
# @:adhoc_uncomment:@

# @:adhoc_uncomment:@
# @:adhoc_template:@ -max-width-class
class mw_(object):
    mw = 0
    def __call__(self, col):
        if self.mw < len(col):
            self.mw = len(col)
        return col
class mwg_(object):
    def __init__(self, mwo):
        self.mwo = mwo
    def __call__(self):
        return self.mwo.mw
# mws = [mw_(), mw_()]
# mwg = [mwg_(mwo) for mwo in mws]
# @:adhoc_template:@
# @:adhoc_uncomment:@

# @:adhoc_template:@ -rst-to-ascii
RST_HEADER = '''\
.. -*- mode: rst; coding: utf-8 -*-
.. role:: mod(strong)
.. role:: func(strong)
.. role:: class(strong)
.. role:: attr(strong)
.. role:: meth(strong)

'''

RST_FOOTER = '''
.. :ide: COMPILE: render reST as HTML
.. . (let* ((fp (buffer-file-name)) (fn (file-name-nondirectory fp))) (save-match-data (if (string-match-t "[.][^.]*$" fn) (setq fn (replace-match "" nil t fn)))) (let ((args (concat " " fp " | ws_rst2html.py --traceback --cloak-email-addresses | tee " fn ".html "))) (save-buffer) (compile (concat "PATH=\\".:$PATH\\"; cat " args))))

.. 
.. Local Variables:
.. mode: rst
.. snip-mode: rst
.. truncate-lines: t
.. symbol-tag-symbol-regexp: "[-0-9A-Za-z_#]\\\\([-0-9A-Za-z_. ]*[-0-9A-Za-z_]\\\\|\\\\)"
.. symbol-tag-auto-comment-mode: nil
.. symbol-tag-srx-is-safe-with-nil-delimiters: nil
.. End:
'''

def rst_to_ascii(string, header_footer=False):             # ||:fnc:||
    '''Convert ReST documentation to ASCII.'''
    string = re.sub(
        '^\\s*[.][.]\\s*(note|warning|attention)::(?im)', '\\1:', string)
    string = re.sub(
        '^\\s*[.][.]\\s*automodule::[^\\n]*\\n(\\s[^\\n]+\\n)*\\n(?m)',
        '', string + '\n\n')
    string = re.sub('^\\s*[.][.]([^.][^\\n]*|)\\n(?m)', '', string)
    string = re.sub('\\\\\\*', '*', string)
    string = re.sub('^(\\s*)\\|(\\s|$)(?m)', '\\1', string)
    if header_footer:
        string = ''.join((RST_HEADER, string, RST_FOOTER))
    string = re.sub('\\n\\n\\n+', '\\n\\n', string)
    return string
# @:adhoc_template:@

# --------------------------------------------------
# |||:sec:||| SYMBOL-TAG TOOLS
# --------------------------------------------------

def compile_(files=None):                                  # ||:fnc:||
    '''Compile files or standard input.'''
    if files is None:
        files = []
    if len(files) == 0:
        files.append('-')
    compiled_files = []
    for file_ in files:
        sys_path = sys.path
        file_dir = os.path.abspath(os.path.dirname(file_))
        sys.path.insert(0, file_dir)
        ah = AdHoc()
        compiled = ah.compileFile(file_)
        compiled_files.append(compiled)
        sys.path = sys_path
    return ''.join(map(lambda c:
                       (((c.endswith('\n')) and (c)) or (''.join((c, '\n')))),
                       compiled_files))

# --------------------------------------------------
# |||:sec:||| TEST
# --------------------------------------------------

doc_index_rst_tag_symbols = ('adhoc_index_only',)

def tpl_hook_doc_index_rst(cls, section, tag, tag_arg):    # ||:fnc:||
    tag_sym_rx = '|'.join([re.escape(tag_sym) for tag_sym in doc_index_rst_tag_symbols])
    return cls.section_tag_remove(section, tag_sym_rx, is_re=True)

def tpl_hook_readme(cls, section, tag, tag_arg):           # ||:fnc:||
    section = section.replace('@@contents@@', 'contents::')
    tag_sym_rx = '|'.join([re.escape(tag_sym) for tag_sym in doc_index_rst_tag_symbols])
    return cls.remove_sections(section, tag_sym_rx, is_re=True)

def adhoc_rst_to_ascii(string):                            # ||:fnc:||
    '''Transform ReST documentation to ASCII.'''
    string = rst_to_ascii(string)
    string = string.replace('|@:|\\\\? ', '@:')
    string = string.replace('\\\\? |:@|', ':@')
    string = string.replace('|@:|', '`@:`')
    string = string.replace('|:@|', '`:@`')
    string = re.sub('^:[|]_?(adhoc[^|]*)_?[|]([^:]*):(?m)', '@:\\1:@\\2', string)
    string = re.sub('[|]_?(adhoc[^|]*)_?[|]', '@:\\1:@', string)
    return string

def inc_template_marker(cls, as_template=False):           # ||:fnc:||
    sv = AdHoc.inc_delimiters()
    template_tag = ''.join((
        '# ', AdHoc.section_tag('adhoc_template_v'),
        ' ', as_template, '\n'))
    AdHoc.reset_delimiters(sv)
    return template_tag

def get_readme(file_=None, source=None, as_template=False, transform=True): # ||:fnc:||
    file_, source = AdHoc.std_source_param(file_, source)

    template_name = 'doc/index.rst'
    tpl_hooks = AdHoc.template_process_hooks
    AdHoc.template_process_hooks = {template_name: tpl_hook_readme}
    template = AdHoc.get_named_template(template_name, file_, source)
    AdHoc.template_process_hooks = tpl_hooks

    template = template + '\n\n' + __doc__ + '\n'
    template = AdHoc.remove_sections(template, 'adhoc_index_only')

    if transform:
        template = adhoc_rst_to_ascii(template).strip() + '\n'
    if as_template:
        template_tag = inc_template_marker(AdHoc, as_template)
        output = []
        output.append(template_tag)
        output.append(RST_HEADER)
        output.append(template)
        output.append(RST_FOOTER)
        output.append(template_tag)
        template = ''.join(output)
    return template

# @:adhoc_import:@ !use_case_000_
RtAdHoc.import_('use_case_000_', file_='use_case_000_.py',
    mtime='2014-03-23T03:03:44', mode=int("100644", 8),
    zipped=True, flat=None, source64=
    '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'
    'QZa8Dfj5AAA=')
# @:adhoc_import:@
import use_case_000_ as use_case                           # @:adhoc:@

def get_use_cases(as_template=None):                       # ||:fnc:||
    output = []
    if as_template is not None:
        template_tag = inc_template_marker(AdHoc, as_template)
    else:
        template_tag = ''
    output.append(template_tag)
    import use_case_000_ as use_case
    state = catch_stdout()
    use_case.main('script --docu'.split())
    output.append(restore_stdout(state))
    # @:adhoc_import:@ !use_case_001_templates_
    RtAdHoc.import_('use_case_001_templates_', file_='use_case_001_templates_.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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'
        'W2N38gk96heTFtJegToY/TeLp/7gptoAAA==')
    # @:adhoc_import:@
    import use_case_001_templates_ as use_case             # @:adhoc:@
    state = catch_stdout()
    use_case.main('script --docu'.split())
    output.append(restore_stdout(state))
    # @:adhoc_import:@ !use_case_002_include_
    RtAdHoc.import_('use_case_002_include_', file_='use_case_002_include_.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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')
    # @:adhoc_import:@
    import use_case_002_include_ as use_case               # @:adhoc:@
    state = catch_stdout()
    use_case.main('script --docu'.split())
    output.append(restore_stdout(state))
    # @:adhoc_import:@ !use_case_003_import_
    RtAdHoc.import_('use_case_003_import_', file_='use_case_003_import_.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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'
        '5wAA')
    # @:adhoc_import:@
    import use_case_003_import_ as use_case                # @:adhoc:@
    state = catch_stdout()
    use_case.main('script --docu'.split())
    output.append(restore_stdout(state))
    # @:adhoc_import:@ !use_case_005_nested_
    RtAdHoc.import_('use_case_005_nested_', file_='use_case_005_nested_.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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'
        'x4KPV5zxAAA=')
    # @:adhoc_import:@
    import use_case_005_nested_ as use_case                # @:adhoc:@
    state = catch_stdout()
    use_case.main('script --docu'.split())
    output.append(restore_stdout(state))
    output.append(template_tag)
    output = ''.join(output)
    return output

# --------------------------------------------------
# |||:sec:||| TEST
# --------------------------------------------------

def adhoc_run_time_module():         # ||:fnc:|| |:todo:| experimental
    import imp
    if 'adhoc.rt' in sys.modules:
        return

    file_ = __file__
    source = None
    exec_ = False
    if file_.endswith('.pyc'):
        file_ = file_[:-1]
    if 'adhoc' in sys.modules:
        adhoc = sys.modules['adhoc']
    else:
        adhoc = imp.new_module('adhoc')
        setattr(adhoc, '__file__', file_)
        sys.modules['adhoc'] = adhoc
        exec_ = True

    if not hasattr(adhoc, '__adhoc__'):
        __adhoc__ = {}
        adhoc.__adhoc__ = __adhoc__

    if 'source' not in adhoc.__adhoc__:
        adhoc.__adhoc__['source'] = AdHoc.read_source(file_)
    if exec_:
        source = AdHoc.encode_source(adhoc.__adhoc__['source'])
        exec(source, adhoc)

    RT = imp.new_module('adhoc.rt')
    setattr(adhoc, 'rt', RT)

# @:adhoc_import:@ !adhoc_test
RtAdHoc.import_('adhoc_test', file_='adhoc_test/__init__.py',
    mtime='2014-03-23T03:03:44', mode=int("100644", 8),
    zipped=True, flat=None, source64=
    'H4sIAGGVLlMC/1NW0NXSVUjOT8nMS7dSKC1J07UAiXBxObp4+DvHh7gGh8R7+gb4B4W4uijY'
    'KoQUlaZyAQBLQbhtNAAAAA==')
# @:adhoc_import:@
# @:adhoc_import:@ !adhoc_test.sub
RtAdHoc.import_('adhoc_test.sub', file_='adhoc_test/sub/__init__.py',
    mtime='2014-03-23T03:03:44', mode=int("100644", 8),
    zipped=True, flat=None, source64=
    'H4sIAGGVLlMC/1NW0NXSVUjOT8nMS7dSKC1J07UAiXBxObp4+DvHh7gGh8QHhzrFe/oG+AeF'
    'uLoo2CqEFJWmcgEAQobQsjgAAAA=')
# @:adhoc_import:@
import adhoc_test.sub                                # @:adhoc:@ force

def adhoc_check_modules():                                 # ||:fnc:||

    hl_lvl(0)
    hlc('adhoc_check_modules')

    printf(sformat('{0}--------------------------------------------------',
                   dbg_comm))
    msg = ((('adhoc_test' in sys.modules) and ('SEEN')) or ('NOT SEEN'))
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'PRE  sub import', 'adhoc_test ' + msg))
    msg = ((('adhoc_test' in sys.modules) and ('SEEN')) or ('NOT SEEN'))
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'POST sub import', 'adhoc_test ' + msg))

    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'dir(adhoc_test.sub)', dir(adhoc_test.sub)))
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'adhoc_test.sub.__file__', adhoc_test.sub.__file__))
    if 'adhoc_test' in sys.modules:
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       'dir(adhoc_test)[auto]', dir(adhoc_test)))

    printf(sformat('{0}--------------------------------------------------',
                   dbg_comm))
    import adhoc_test                                      # @:adhoc:@
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'dir(adhoc_test)', dir(adhoc_test)))
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'adhoc_test.__file__', adhoc_test.__file__))
    if hasattr(adhoc_test, '__path__'):
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       'adhoc_test.__path__', adhoc_test.__path__))

def adhoc_check_module_setup():                            # ||:fnc:||
    '''

    >>> state = catch_stdout()
    >>> adhoc_check_module_setup()
    >>> contents = restore_stdout(state)
    >>> contents = re.sub('(mtime.*\\])[^[]*(\\[)', r'\\1\\2', contents)
    >>> contents = re.sub(' at 0x([0-9a-f]+)', '', contents)
    >>> contents = re.sub(r'adhoc\\.pyc', 'adhoc.py', contents)
    >>> contents = '\\n'.join([l.strip() for l in contents.splitlines()])

    .. >>> ign = open('adhoc_check_module_setup.t', 'w').write(
    .. ...     re.sub('^(?m)', '    ', contents)
    .. ...     .replace('\\\\', '\\\\\\\\') + '\\n')

    .. @:adhoc_expected:@ adhoc_check_module_setup.e

    >>> printf(contents, end='') #doctest: +ELLIPSIS
    # --------------------------------------------------
    # |||:CHP:||| adhoc_check_module_setup
    # --------------------------------------------------
    # -----------------------------------
    # ||:SEC:|| no:module:found
    # -----------------------------------
    #   :DBG:   module                 : ]['__adhoc__', '__doc__', '__name__'...][
    # ------------------------------
    #   :DBG:   __adhoc__              : ]...
    #   :DBG:   __doc__                : ]None[
    ...
    # --------------------
    #  |:INF:|  no:module:found.__adhoc__
    # --------------------
    #   :DBG:   __adhoc__              : ]...
    # ------------------------------
    #   :DBG:   __module__             : ]<module 'no:module:found' (built-in)>[
    #   :DBG:   mode                   : ]...[
    #   :DBG:   mtime                  : ][
    # -----------------------------------
    # ||:SEC:|| adhoc_test.sub
    # -----------------------------------
    #   :DBG:   module                 : ]['ADHOC_TEST_SUB_IMPORTED',...
    # ------------------------------
    #   :DBG:   ADHOC_TEST_SUB_IMPORTED: ]True[
    #   :DBG:   __adhoc__              : ]...
    ...
    #   :DBG:   __doc__                : ]None[
    #   :DBG:   __file__               : ]...adhoc_test/sub/__init__.py...[
    ...
    # --------------------
    #  |:INF:|  adhoc_test.sub.__adhoc__
    # --------------------
    #   :DBG:   __adhoc__              : ]...
    # ------------------------------
    #   :DBG:   __module__             : ]<module 'adhoc_test.sub' from...
    ...
    #   :DBG:   source                 : ]...# -*- coding: utf-8 -*-\\n\\nADHOC_TEST_SUB_IMPORTED = True\\n...[
    # -----------------------------------
    # ||:SEC:|| adhoc
    # -----------------------------------
    #   :DBG:   adhoc                  : ]...
    # ------------------------------
    #   :DBG:   AH_CHECK_SOURCE          : ]...
    ...
    #   :DBG:   AdHoc                    : ]<class 'adhoc.AdHoc'>[
    #   :DBG:   AdHocError               : ]...adhoc.AdHocError...[
    ...
    #   :DBG:   RST_HEADER               : ]...
    ...
    #   :DBG:   __adhoc__                : ]...
    ...
    #   :DBG:   __file__                 : ].../adhoc.py...[
    #   :DBG:   __name__                 : ]adhoc[
    ...
    #   :DBG:   _nativestr               : ]<function _nativestr>[
    #   :DBG:   _quiet                   : ]False[
    #   :DBG:   _uc                      : ]<function ...>[
    #   :DBG:   _utf8str                 : ]<function _utf8str>[
    #   :DBG:   _verbose                 : ]False[
    #   :DBG:   adhoc_check_encode_module: ]<function adhoc_check_encode_module>[
    #   :DBG:   adhoc_check_module_setup : ]<function adhoc_check_module_setup>[
    #   :DBG:   adhoc_check_modules      : ]<function adhoc_check_modules>[
    #   :DBG:   adhoc_check_packing      : ]<function adhoc_check_packing>[
    #   :DBG:   adhoc_dump_list          : ]<function adhoc_dump_list>[
    #   :DBG:   adhoc_dump_sections      : ]<function adhoc_dump_sections>[
    #   :DBG:   adhoc_rst_to_ascii       : ]<function adhoc_rst_to_ascii>[
    #   :DBG:   adhoc_run_time_module    : ]<function adhoc_run_time_module>[
    #   :DBG:   adhoc_test               : ]<module 'adhoc_test' from '...adhoc_test/__init__.py...'>[
    #   :DBG:   base64                   : ]<module 'base64' from '.../base64.py...'>[
    #   :DBG:   catch_stdout             : ]<function catch_stdout>[
    #   :DBG:   compile_                 : ]<function compile_>[
    #   :DBG:   dbg_comm                 : ]# [
    #   :DBG:   dbg_fwid                 : ]23[
    #   :DBG:   dbg_twid                 : ]9[
    #   :DBG:   dict_dump                : ]<function dict_dump>[
    #   :DBG:   ditems                   : ]<function <lambda>>[
    #   :DBG:   dkeys                    : ]<function <lambda>>[
    #   :DBG:   doc_index_rst_tag_symbols: ]('adhoc_index_only',)[
    #   :DBG:   dump_attr                : ]<function dump_attr>[
    #   :DBG:   dvalues                  : ]<function <lambda>>[
    #   :DBG:   file_encoding_is_clean   : ]True[
    #   :DBG:   get_readme               : ]<function get_readme>[
    #   :DBG:   get_use_cases            : ]<function get_use_cases>[
    #   :DBG:   hl                       : ]<function hl>[
    #   :DBG:   hl_lvl                   : ]<function hl_lvl>[
    #   :DBG:   hlc                      : ]<function hlc>[
    #   :DBG:   hlcr                     : ]<function hlcr>[
    #   :DBG:   hlr                      : ]<function hlssr>[
    #   :DBG:   hls                      : ]<function hls>[
    #   :DBG:   hlsr                     : ]<function hlsr>[
    #   :DBG:   hlss                     : ]<function hlss>[
    #   :DBG:   hlssr                    : ]<function hlssr>[
    #   :DBG:   inc_template_marker      : ]<function inc_template_marker>[
    #   :DBG:   isstring                 : ]<function isstring>[
    #   :DBG:   main                     : ]<function main>[
    #   :DBG:   mw_                      : ]<class 'adhoc.mw_'>[
    #   :DBG:   mwg_                     : ]<class 'adhoc.mwg_'>[
    #   :DBG:   namespace_dict           : ]<module 'namespace_dict' from '...namespace_dict.py...'>[
    #   :DBG:   nativestr                : ]<function nativestr>[
    #   :DBG:   os                       : ]<module 'os' from '.../os.py...'>[
    #   :DBG:   printe                   : ]<function printe>[
    #   :DBG:   printf                   : ]<...function print...>[
    #   :DBG:   re                       : ]<module 're' from '.../re.py...'>[
    #   :DBG:   restore_stdout           : ]<function restore_stdout>[
    #   :DBG:   rst_to_ascii             : ]<function rst_to_ascii>[
    #   :DBG:   run                      : ]<function run>[
    #   :DBG:   setdefaultencoding       : ]<function setdefaultencoding>[
    #   :DBG:   sformat                  : ]<function sformat>[
    ...
    #   :DBG:   sys                      : ]<module 'sys' (built-in)>[
    #   :DBG:   tpl_hook_doc_index_rst   : ]<function tpl_hook_doc_index_rst>[
    #   :DBG:   tpl_hook_readme          : ]<function tpl_hook_readme>[
    #   :DBG:   uc                       : ]<function uc>[
    #   :DBG:   uc_type                  : ]<...>[
    #   :DBG:   urllib                   : ]<module 'urllib' from '.../urllib...'>[
    #   :DBG:   utf8str                  : ]<function utf8str>[
    # --------------------
    #  |:INF:|  adhoc.__adhoc__
    # --------------------
    #   :DBG:   __adhoc__              : ]...
    # ------------------------------
    #   :DBG:   __module__             : ]<module 'adhoc' from '.../adhoc.py...'>[
    #   :DBG:   mode                   : ]...[
    #   :DBG:   mtime                  : ][
    #   :DBG:   source                 : ]#!...python...\\n# -*- coding: utf-8 -*-\\n# Copyright (C)...
    ...

    .. @:adhoc_expected:@ adhoc_check_module_setup.e
    .. \\|:here:|
    '''
# :ide-menu: Emacs IDE Menu - Buffer @BUFFER@
# . M-x `eIDE-menu' ()(eIDE-menu "z")

# also remove __builtins__, _AdHocStringIO ...
# (progn
# (goto-char point-min) (replace-string "/home/ws/project/ws-util/adhoc" "..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string "/home/ws/project/ws-util/lib/python" "..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string "/home/ws/project/ws-util" "..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string ".pyc" ".py" nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string ".py" ".py..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string ".../urllib.py..." ".../urllib..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string "/usr/lib/python2.7" "..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string-regexp "#   :DBG:   __adhoc__\\( *\\): \\].*" "#   :DBG:   __adhoc__\\1: ]..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string-regexp "#   :DBG:   adhoc\\( *\\): \\].*" "#   :DBG:   adhoc\\1: ]..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string-regexp "#   :DBG:   module                 : ..'ADHOC_TEST_SUB_IMPORTED',.*" "#   :DBG:   module                 : ]['ADHOC_TEST_SUB_IMPORTED',..." nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string "<function _uc>" "<function ...>" nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min) (replace-string "<type 'unicode'>" "<...>" nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))
# (goto-char point-min)
# (goto-char point-min)
# (goto-char point-min)
# )
    wid = 100
    trunc = 10
    hl_lvl(0)
    hlc('adhoc_check_module_setup')

    mod_name = 'no:module:found'
    hls(mod_name)
    module = AdHoc.module_setup('no:module:found')
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'module', str(dir(module))[:wid]))
    dump_attr(module, wid=wid, trunc=trunc)

    hl(sformat('{0}.__adhoc__',mod_name))
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   '__adhoc__', str(dir(module.__adhoc__))[:wid]))
    dump_attr(module.__adhoc__, wid=wid, trunc=trunc)

    hls('adhoc_test.sub')
    import adhoc_test.sub                                  # @:adhoc:@
    module = AdHoc.module_setup('adhoc_test.sub')
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'module', str(dir(module))[:wid]))
    dump_attr(module, wid=wid, trunc=trunc)

    hl('adhoc_test.sub.__adhoc__')
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   '__adhoc__', str(dir(module.__adhoc__))[:wid]))
    dump_attr(module.__adhoc__, wid=wid, trunc=trunc)

    try:
        import adhoc
        hls('adhoc')
        module = AdHoc.module_setup('adhoc')
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       'adhoc', str(dir(module))[:wid]))
        dump_attr(module, wid=wid, trunc=trunc)

        hl('adhoc.__adhoc__')
        printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                       dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                       '__adhoc__', str(dir(module.__adhoc__))[:wid]))
        dump_attr(module.__adhoc__, wid=wid, trunc=trunc)
    except ImportError:
        pass

def adhoc_check_encode_module():                           # ||:fnc:||

    wid = 100
    trunc = 10
    hl_lvl(0)
    hlc('adhoc_check_encode_module')

    module = AdHoc.module_setup('no:module:found')

    hl('IMPORT SPEC')
    ahc = AdHoc()
    import_spec = '\n'.join(ahc.run_time_section.splitlines()[:5])
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'ahc.run_time_section', import_spec))

    for_=None

    module_name = 'no:module:found'
    #hl(sformat('GET MODULE {0}',module_name))
    module_import = ahc.encode_module(module_name, for_)
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'module_import',
                   '\n'.join(module_import.splitlines()[:5])))

    module_name = 'ws_sql_tools'
    #hl(sformat('GET MODULE {0}',module_name))
    module_import = ahc.encode_module(module_name, for_)
    printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                   dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
                   'module_import',
                   '\n'.join(module_import.splitlines()[:5])))

    hl('EXECUTE')
    exec(module_import)

def adhoc_check_packing():                                 # ||:fnc:||
    """
    >>> source = AdHoc.read_source(__file__)
    >>> AdHoc.write_source('write-check', source)
    >>> rsource = AdHoc.read_source('write-check')
    >>> os.unlink('write-check')
    >>> (source == rsource)
    True
    >>> psource = AdHoc.pack_file(source, zipped=False)
    >>> usource = AdHoc.unpack_file(psource, zipped=False)
    >>> (source == usource)
    True
    >>> psource = AdHoc.pack_file(source, zipped=True)
    >>> usource = AdHoc.unpack_file(psource, zipped=True)
    >>> (source == usource)
    True
    """

def run(parameters, pass_opts):                            # ||:fnc:||
    """Application runner, when called as __main__."""

    # (progn (forward-line 1) (snip-insert-mode "py.bf.sql.ws" t) (insert "\n"))
    # (progn (forward-line 1) (snip-insert-mode "py.bf.file.arg.loop" t) (insert "\n"))

    # @: adhoc_enable:@
    if not (parameters.compile or parameters.decompile):
        parameters.compile = True
    # @: adhoc_enable:@

    if not parameters.args:
        parameters.args = '-'
    if _debug:
        printe(sformat(
            "{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
            dbg_comm, dbg_twid, dbg_fwid, ':DBG:', 'parameters.args', parameters.args))

    # |:here:|
    if parameters.compile:
        output = parameters.output
        if _verbose:
            printe(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':INF:', 'output', output))
        if output is None:
            output = '-'
        compiled = compile_(parameters.args)
        if _debug:
            printe(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':DBG:', 'compiled', compiled))
        AdHoc.write_source(output, compiled)
        return

    if parameters.decompile:
        AdHoc.default_engine = True
        export_dir = parameters.output
        if export_dir is not None:
            AdHoc.export_dir = export_dir
        if _verbose:
            printe(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
                dbg_comm, dbg_twid, dbg_fwid, ':INF:', 'export_dir', export_dir))
        for file_ in parameters.args:
            AdHoc.export(file_)
        return

    # |:here:|
    # @:adhoc_disable:@ -development_tests
    # myfile = __file__
    # if myfile.endswith('.pyc'):
    #     myfile = myfile[:-1]
    # myself = AdHoc.read_source(myfile)

    # if False:
    #     adhoc_check_modules()       # |:debug:|
    #     adhoc_check_module_setup()  # |:debug:|

    #     # import ws_sql_tools
    #     # ws_sql_tools.dbg_fwid = dbg_fwid
    #     ws_sql_tools.check_file()

    #     import_cmd_sections = AdHoc.tag_lines(
    #         myself, AdHoc.line_tag('adhoc'))
    #     printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
    #                    dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
    #                    'import_cmd_sections', import_cmd_sections))

    #     import_cmd_sections = AdHoc.tag_split(
    #         myself, AdHoc.line_tag('adhoc'))
    #     adhoc_dump_sections(import_cmd_sections)

    #     pass
    # # |:here:|
    # @:adhoc_disable:@

    # @:adhoc_disable:@ -more_development_tests
    # # @:adhoc_remove_:@
    # ah_retained, ah_removed = AdHoc.tag_partition(
    #     myself, AdHoc.section_tag('adhoc_remove'))
    # hl('REMOVED')
    # adhoc_dump_list(ah_removed)
    # hl('RETAINED')
    # adhoc_dump_list(ah_retained)
    # # @:adhoc_remove_:@

    # # |:debug:| def/class
    # ah = AdHoc()
    # ah_run_time_section = ah.prepare_run_time_section()
    # printf(sformat("{0}{3:^{1}} {4:<{2}s}: ]{5!s}[",
    #                dbg_comm, dbg_twid, dbg_fwid, ':DBG:',
    #                'ah_run_time_section', ah_run_time_section))

    # # adhoc_check_modules()       # |:debug:|
    # # adhoc_check_module_setup()  # |:debug:|
    # # adhoc_check_encode_module() # |:debug:|

    # # |:debug:| compiler
    # ah = AdHoc()
    # compiled = ah.compile(myself, 'myself')
    # printf(compiled, end='')
    # @:adhoc_disable:@

    # |:here:|
    return

# --------------------------------------------------
# |||:sec:||| MAIN
# --------------------------------------------------

_quiet = False
_verbose = False
_debug = False

# (progn (forward-line 1) (snip-insert-mode "py.f.setdefaultencoding" t) (insert "\n"))
file_encoding_is_clean = True
def setdefaultencoding(encoding=None, quiet=False):
    if file_encoding_is_clean:
        return
    if encoding is None:
        encoding='utf-8'
    try:
        isinstance('', basestring)
        if not hasattr(sys, '_setdefaultencoding'):
            if not quiet:
                printf('''\
Add this to /etc/python2.x/sitecustomize.py,
or put it in local sitecustomize.py and adjust PYTHONPATH=".:${PYTHONPATH}"::

    try:
        import sys
        setattr(sys, '_setdefaultencoding', getattr(sys, 'setdefaultencoding'))
    except AttributeError:
        pass

Running with reload(sys) hack ...
''', file=sys.stderr)
            reload(sys)
            setattr(sys, '_setdefaultencoding',
                    getattr(sys, 'setdefaultencoding'))
        sys._setdefaultencoding(encoding)
    except NameError:
        # python3 already has utf-8 default encoding ;-)
        pass

def main(argv):                                            # ||:fnc:||
    global _quiet, _debug, _verbose
    global RtAdHoc, AdHoc
    global adhoc_rst_to_ascii

    _parameters = None
    _pass_opts = []
    try:
        # try system library first
        import argparse
    except ImportError:
        # use canned version
        try:
            # @:adhoc_import:@ !argparse_local
            RtAdHoc.import_('argparse_local', file_='argparse_local.py',
                mtime='2014-03-23T03:03:44', mode=int("100644", 8),
                zipped=True, flat=None, source64=
                'H4sIAGGVLlMC/+19/XPbypHg7/wrsPK5QNgk1363V3elhC+nfc9JvLuxXbaz'
                'VxVZy4JISEJMAVwCtKyX5H+/6Y+Z6fkCSdl+m2zl3W0sApienp6enp6e/niU'
                'ne36m3Z7mr3rq09Vk/3LLPvnqr8pt6vslx0+ml3S7/97fVvW69myvf1+Nhqd'
                'nJz80N7els1quq6bKtuU265urrN1fbktt/ej0fubustu29VuXWXqr7LJ2k0P'
                'X1XTuuk29bZaZcsBCJnqtD8djTL13zS7UZ+tqy67bPsbAFS3TblWQFfZpu1q'
                '/XN7vbutmr7jRput6n6pWt3U1zfr+6xurtrtbdnXn6ps15XXVXZbdfCvbtDt'
                'Npt223eIS7XtEIdsVXebsl/eZH2rvric8ksYYpVdtet1ewd4wyCzrr7drDX0'
                '6nOJvxBKt7vtFAZ9dQ2Ar7btrXpejRwSwHjutnVfQc9Vtq263bqHbsvsql5X'
                'p0wOQiCbw4Dx79kZj/wNvhnjV/DfquqW2xrJNc8VBgjWIKGwgt+MQgYo5IXo'
                'YVauVgtNVAs01wDyiSJgX34qt3N4pn426utunj9Vf/b3m2qunk5Mu5tqvZnn'
                'ihG4PQzssgLC3FargzqeTtfttYK9qq5KRZl5d9/Nun7V7nruzxDk14pc79WT'
                'cX6XFz4KMGigZ3Z3U20rpAHQprtpd+sVoARz0FcN4wRjUsRm1PAfQK4b29cz'
                'hdcMZ26cP+7y7DEAHOMbTazC+3q5brtKgUAu4nWybJu+VKsDUbKctdldrutl'
                'tlyXXVd1Zk24k55NpxmCUgAy9VStoE2rOldwttGFNsvOsCNDHM2u5WWrFoii'
                'xl03QUyc2Shgzm/aFfD7rlOLWM3ipt3s1mVvQUEr5tK7Wq3Ycgks2CEue1fv'
                'DMbRhLCY6KL/uvnUfiQUFOk+VVtiaJwwYm4DxaGAIkuLEunyj9WyZxT7fltf'
                '7tTam/kEfrHdtoa+1edlhSPItmUN47+892eCwHbAXs4wtoCaggDgOurVEirv'
                'NJVm2Qv6gju4u1G8auBoMSlWLgsPBXpZ7q5v+ghKQOvqFrh6ZSCVnQtAC0Mz'
                'fr2IYOhn2ZVCr1VcBXOoFmDdIBbqdZe1V7ieOl7Ry22lmGF1GIMpdu/LZklQ'
                'TI8wGAW7XpZrJbg3wPgrhbDDFLjiDdtAc49RobGYTaSunsbLsqtoReGAmFnN'
                'DLw3fWvWVRiZ3rtqrSaY5h5wA0p0in0axXfr+mOV5Z0iVbXot7sqzxT4vNxs'
                'qma1UFza9bkikzMQ6mJoKLPst+2d2oy3E8T2Ggm8tcy9U/3d1j+VOELV2p99'
                'GsMEti+WIvgVUeS2vDeQ1Ozh3AK1YXlqwkfxNKT9rRKrv8attQcU35Z3P9qN'
                'J3z5vvrcu09N/xrxH0nCd85nMHf2hx6IWh7LGwNADQYG4SJ+pRstsJGgtGJY'
                'yaEe3XC6tjvg+5k7SJA+AJl3IjuAgbEjRWPDz/pqvRaiwABrWsRwqbSf60qO'
                'BBgOGAH2M9X6s9r/FPADqahYq7O6kGIAtR53vaUJj0ksNiQSdqam/Ezh2oI0'
                'MzOgNpxeaHsoiBTl6lUFSh5qRACYOlspjaGGZTk+W3ctDJEVpCit0rRUnbTN'
                '+n4keuJ9Uk06C/amVDINuAbQP3vzEpje4Qcjqutu1PW1GpkAB5pKDPdZAdrv'
                'aLRYqAXZqeeLhVIP8uez72bPc/VUiQ18co4EzF2eyifuUxT1/kMQgc4LLRf1'
                'b4cWfuvorOuPBmgqPglYVL97BRTdlEuDCckQ/ev1qxeL128Xv3v99oV59Ob9'
                'y9evzv5N/35z9vbdi7emrxe/O3v56kf74N3v37x5++LdO/37Dy/evhYgL0aj'
                'kZoUpaSrmdrcw1wv4A/9sO3wUdvpB7DnqgdKePMDpTPiE/WvfgQL6G5bbvC5'
                '/jEaoY5+XfXwJONP9U/4cjRSStbpiDaEfkSKQQYUwrmjN49oe7lXKkuT/TL7'
                'bvZPsOmq80R9Wa/r/j4bq7byoER6gtpSlpX6+n8WBAZxwS8ZkXcVIgEdWzRg'
                'U6N9KIGN/UDxp/pDDkFBVcrBw0ZBXynBwWDGShPelpfraqImAFZJNf91ue4q'
                'Hg38x4ebudowu958X3jvZwBvbJ/WVxqghSS+5ndjCabfbRt+r5gHcFzAzg69'
                'jdXyZ5T4u5uyA0UQXkyyfIFfLhZ5AZu4/w6JCS8VWM22IAjmc/1rPs9HI70A'
                '4NWv8pFkaHj0JB+JVQNPnuYjWiTw42w2m+Ujs0zgET5Z/P7V2xc/vP7Nq5d/'
                'ePHj4uztb94tzt6/x/eLXbOtlu11U/9UoRLRKSweZfOh/9T73/fEkFe7Rqs8'
                'SgazjN/bfkS61OJMq9G/bddKjI5JwDKRldg8u1RspxQJqYCh+FeH9U9K8CoQ'
                'arFutosFaxegrOlHWvWnycLzNjEz7kBarp9a1vgB4AMvj2Hm5rAfTDLxpyJl'
                'YXqxJwDcXZSwr7a3qApVNe53StsrCeXpWjHa2rZgYbX4eKfIvcBtRx1TW2wC'
                '1g5FAq2za31XDWpVL3sYJ5NmZBaRHq+SDesrsWZA40Xoaprhb3o/W+CzxcJq'
                '9goJrY+qfejCvIBVrF4CvaDpbKHkGR+r3PUkIMxIdx0DSnCkLQoHHBHyU7ne'
                'VS5YpMUhgNWJef54C4fmsQBWBGtYfTd+3BX4oaGEWonq/8/+qI66YwFbtbbU'
                'FNh4BGXILLQIdz0tSiTdKvR9QANgzi+0gKmabqf0fxwIDgr3zIkkFjdXAk1B'
                'RbkSfPeqbaoC9gT441ScPhLfE1wpzhKgQWIFC1o9+bXVLmH3j3zDy9zRDYI1'
                'brU0PKxUjZLtCNQ1uqF8MVonqrKaM4jmr5V+h2sGWR51N0UMwgD+EKqa1v2U'
                'kqeOnaxNk7QgPZbFCx7Z8OiMUDxVNanxxZaoOgD3vEQnDotn3N915HHdrBRs'
                '1VadkaGX+XeRj27Lzwsgx0JbR+bf/VPks7t61d/MkUnYJkRbNevvwCfmoIDf'
                'yl0UH4S8hVJGqwRBZ0qY1Oo4qtSrWdV8qrdtc57/8Prffv+7V+/yi8Jpw3rE'
                '+F+re9QjJtm/A3fi30Ua/P95NgofT+fZdyN5+FarFOgLRjn1j/fGJzEi7T7y'
                'WgT0Vk2CZ14bjTAR1nu53G231OGKEHjmfUDbR/icTtiI0LpqrrGHZz70bdv2'
                'i65aMqb08B39JnYkyZFAym8pwfldqbN1T4JD4dQvb9DqrDYnuAXYqDPJeJt/'
                '6J7mflfrtrleXG6r8mO6WQP/D5qygjkf/o+/4mGi6CDq0jqVS/0wWLiICYQv'
                'zqOT+HSe4K/o1KqvnwthoQTPof1M9/YDChkcZGKtv1f8ovbDl/RrVYEpDo2U'
                '1bq9y54pxTGG7dRgy1qc5iYj2cWNgi/77Gl6AvYL1e9ECfNypUSPFk5ySWO/'
                '9gA+t83Dzwgc2d4lBcwH3I/6gv8KP8FtnLQgZxDULa5xf17MieeWb0iIuIqM'
                'epk4Iv3KQVaJVDDbhGI1HLye47ErOkGX0atTfAuPF6oTYZjROhio7BMye2sV'
                'DIcdIgBfjp/Al26f8DnSQnWMutS5+HKwD0/ufwk1eJUUI28mWJlRgG5Q2Scj'
                'jpZjd+oYXN1u+nsfD+jYjCvsXWuVud9duVqxvYuYK9Jf0zbTaJ8OV/LgzdkQ'
                'hFbsgzh1gk3EJ5f7QdDero388ZPucXf6oUHV2W2mhIVSoCVW3j6+7iK4CdgB'
                '+ZB9BcGmICzqcp011R3cM0wc4gJNtHFxFJkeYka1XeRGqkzsrCrs1ZsLqaOD'
                '4Rzea+Fk2DYpeBlPYmd9KBmLhnv3KH79O1Jss8tdvcbBHbYrWdtJr1a3Rofx'
                '15NyGtVyxnLnHVIIoiO20H01xNKQSCOE5URJ0kNUC6FPwNjg9kOObN9smHH4'
                's+RtBfSRKzmgPxgCWOp4/PCn6BKWNFr1IitUvghXZkAg+MnkIUP8Ofxz4aGC'
                'Jx/GBf+e2EuZ622726h/N9vqqv7s75kKVTo2ebgGx2rY5IZBHzwQDQa3CWcc'
                '5kqKhkIdudjSsxluJgHO/h5bwxFQHdfgJneJqpy7u8GJ274zTMF4srpsP3DF'
                'sYUJ+78LasyoXwSbabe7pHfWnAHWyYVWAhbmg24cjD/St5YoXv8GShHsd7vN'
                'quzpvkedBOrb3S1KvIyOBIkx2gODajM+V7/GvHPjhi0Q8nZsJqJpHoJ8GtU1'
                'Y9wUOb4ANom3kTNt8j8HyyK1ZSOZ+LoK7MoHc3zJAvGc/rhIsH3n8L3cUtCy'
                'ZtiG30dEh7OImAH2bC/8FmwuU3H/d9DmMjpA3WW1LzwNSrHv2uBDjcoBEp7/'
                'Zordx3jow318vSlirfGGEWxAG/g2LxTnwb++nQ11BbvjW8WYZ2eD2ygbAgMr'
                'Xc7WwnP4LMmB7BTQw2xKeMkGiir4PV2bb4O9xVFSpJw9aFdwRSw9i1tv+J06'
                'b49zhHma5YU0D8kNBSzT9VVdraB/uodNbjxhV/Sadx2lWoLhdAwWmbm10fhd'
                'N61xAOrAQG4dgMgaV34q6zXdHJne/7jretfSU60ldoAZ0h3QjC49jWn+GPEr'
                '0EXrEHQtrq63UoDsslwv0QeK+hrA1J+u9vpIxAi5brOue4Ef3hAKBJ3P7WfO'
                'dQAiIMYUvDxAqrm7PnWkF8tpdLUYZPTOqMWg/2H87OEh7QPxyIS6uDoFKB2D'
                'ZoHvR71Rwkk/qlx0C3c+xV6kmYq+H1saP5X46ZVcxBlS312cd3avPkfjsdPN'
                'BR4uL4Lh4bU17HYEEKUgfFr3OXhjtRmIYte6q7RTY72Utszp/l1eAQa9gkWS'
                'Gif8wp6L7HsB2dPzeCZgP9BLARzwAPcNrJ4stGqwp1u/2FbX1WfYG7b5h/Hs'
                'ya8+FE///OEc/rhQf7x7mo8i7JWcmvhkMEf5rfZOou6NqE4WTtBolUI7FshP'
                'LErxfve2N8iF7dkYaPjI4FMolcB2vLedwQPbmQ5jEwnbL9/t4BSS03ZThTMI'
                'ex2ovfgWh4QOf2R3iB935H/YLBRK8nX6rbNNpq0sEhhol+CQIFh8mj2PNkmL'
                'pggwGnEamK9rdKdDWoYB/jR7zksQGvkrcEiZRsJqwant25YX4HVR7IWQpv0D'
                '6aCbaMxwWPuJ/HQuiPA0AZsJNzxnD6PJAzitO392ga4v9Oe5oM5pnKSsvNI6'
                'iyxKRKJFk2J30277CfuPq52API1TWldsMw+FPKog2S/n2bPZ//5f2ZO9nGaM'
                'loqA6vNxCqKariRRjSjbQ0vVixUyuHdeKLimtS9xij0soEamj+sst7Ro1JAS'
                'fICqnvn4QUgHXQ0jvV8KofhE6HuYBvQE1dkOTOYZqHtqR2rviOGOUMy8eRfT'
                'HtfjeOezu6igwegw4rlTk1z8Fa3hDuTk8wOIdnEsmwQMV3wzTnNnFhZUSiyg'
                'MZ4+R50rrgwYbVQdtq2465zDEIs4lCV8sMwjHjqPOzzkw0UDteBzXOT06yjY'
                'rmHF6FunI89YiM+BOvWSPUhqIFR9ZT311YiptWmLP3V/qPY6PoUNqELw/E9/'
                'cew5ui8Gd4CXBFrwITCL4whgFj+Psfls4WChpH7UYcJ6SURuhFo10GZXHXBB'
                'o/gKPTwBHZK3MSSK9EmuO8fGpwrQBWiEseanSW3GnhkPbxdMFNjKkmdDccdH'
                'XWyr/9xBUOGg7kQEQXMozvmwmsQfESUuQM/Is/M82WRYGkcAKngD4PTHNANZ'
                'fpE/YA/4KmMef90xjw8fc5EnWayGIW0hMGKs2fz5BPi+ON0Lvkbgf86lfFsq'
                'dQliBuA2QoSrgWHAN/3pXctzrKwngu+rZncLbm/V2NqKfQvObqNEJMWpaPsy'
                'mpVuyy1EtaGoBV0yuA6/hfipPysxpjApewgVo4uLEN4obqbRlzPxyyQzRq0O'
                'u+5EAhwTdKa2sHGNJ0dF1ZRmQJ9u2o36dBRVnhxwqBseDpJUSY9UHAFMk7q9'
                'zmJGXOzZWg73mrA2JOJdWxE4heo7BIazqrq+SGhdaJ4BixoJrwkiRoacdgdu'
                'MRH1w8yeEavD8pQN0njSQEljTNPn0+f07CJPrxUeJn7//FS1iA1F37swYuyN'
                'nbqACfiKDniJOaMo3W2nzi/lPcCkaE8i0kYT4nJbLj9WfXfAnuhMrNmkvflW'
                '5ErMGfT7Wseurtqqa/I+60uFUUmet9oTSi2s0wgIiJTDwxdEMXtGOXd1NnSb'
                'qw5bp6OBqeFIYwf/Q3AHnLujkIbwAos5/jziTKD9UedyZcyUsKq24/jGDuO3'
                '85ReaQy52EOljAg1dig1kb1E1+ktzK06Da3b9qONWtarFySG1jmANnY1jxJ6'
                'Co/eNEL3Z1o46Kp00KrWozp/3F3AoPAS65uvzEcsazP0wDKZA5pqCS4v23ut'
                'kI+CHVrHA5GotuFA77c73+yHCJzXp7g7n9u9+kLigQeakh28tTxEFz/cLtFX'
                'VUQugi+HtLLjBTEiB39oextNKjywBpwLZ/jLdVU2mToNeHvu7a7fYZiwUt/X'
                'uw4yS3hnj3aD9q9tfv7hfCx0OIz/5xcXhXjBOIMxGC5NtzkEPWS00ivF9Nv8'
                'w/OcPVrSjTIdKoH9HNpKrZUnZrFAZ9i6gOb7G38Yj8//488XT4oPRT7cIfzD'
                '97wOlfkYicHd6hP/eInPgmPkoJePvlfLMURIvT4NLkMYn+S925denHgmkcFv'
                'dTwKSbx6vabRkWORRcCYB+iCHK7IE6frlJ/OIxvexKlGWCjRkLRXHuWRWJeX'
                '1dpxF3A85esm5eCh0Ptu2Mkj4YBfuL3FqR53z2ckdBMX22nC5zr7zm8PnnHo'
                'njzscBReOz7KblolGNebX/DJC6QvxK+YDC8gmiGhS2N9IkfxrSJ0s+h3m8Az'
                'TjpyOtjHLi3NuMgplEw1CqocABqQzdakcBdDQcdOZzibUvHKXeuLXlSrwfDg'
                'dIw2ZDlFDxoeL4IjBzt90mWZHm4kKIeUTSfg4hHaRQdI0YDkcGYw1IO+3ZwN'
                'DMJdHJFzLqYbqCtOvCF2U8cT1xx1HVQuPC8JilkGx2g8WMLGaAFOkOHJBtle'
                '2ZQFCZ/B0K1owVKaKFh93iiuI5+kmHEIW2gDKTVBVwk2sRqAEyFailFSEZIk'
                'H0sa09zZ3sCgVwTOE5xuRn73/PRiz3Hb6dOZSOqU76LEHLRbliosT7TOL/I/'
                'mSMLmAbpRqjx3FSs5OF5nqlvO/iW3LFOB8gE76NcgX4yzT1mzjLWXdZOa85g'
                'oRjnrlqvR1/VDdPBLyLF4x6YRgmBXF7N9TpwGHG2aOF6RpfnqX3Y8fxMus4e'
                'aIXgpFsTw+D8YGGCA6K2iLF31cYj4cajAQkmDF6jr3gu5uPlJHYiPuw0THPM'
                '9yhRyhX7MD7sNCxPwpPkOTh+Bj7u/PvFZ1+bY2tho+OPcM/yRNEhp2ePyPo2'
                'yARmB2sjZFi5KMzg9HdRB3N+l750Nxkm3AauzON3y5sWL5SSwOgDGDAuBPXv'
                'mB6RjzX9LSjNAC/iGOV/etz9BaiaT5hEAn4xsBINBI9Csdi2sVIR1gpk/ZN/'
                '0objbqcTEYwJ5iTDz4tkoBSn0NjP7/y9gVuAv4BBxRekhGtEbuo4+0O4Aq5Q'
                'NT/sF4o+nFFK6EQ9Nu0k0sIQfUsJK7nLiDCdCyQFUVt1joEpE4oMwM3g/2az'
                '2UXQwXf7kLbpSdKUMOCPhW5Sm6RgY7qTQRCULWUANwAxRFWfi4llcKHjJMMK'
                'X9j7Jtl/kVrhWvYxrMLr34GRylZj1oRUehPqA5ilMNAVrRiqC6MWTbKkTUMn'
                '8MjQS6DrxwQlFBf0/By+vRi+OFpVa+fr4/vSeXYkFEy4Q1lO8iKqB1j05s7P'
                'MDuKGQ7eM+UsqfNin/DH7Q6mdmKddmEb4B2ArYnQsYF5cREcLdz3CpwAHlcy'
                'gW3wFEC7rZ5WMv4qcIJPkhpygmkCJwboyzaze+fCfTHyvBZM1p+I5wKk4htY'
                'a4lwxugxwEViHGGE+7par2yjSE9hqKBzPrSGxAnZwiS15Dk0TI1AMS6ZNnoa'
                'A6c3qSbD2Az+Zyy7krugMf4FGBnr37fDDHofe11iEC9P1JztF0cEcMGkdNV/'
                '7qz1Y65dttwEO5LVE2yrj2jWajDSmWkG8tuNnV82XQ081klpRGpAzCsJXWFG'
                'XjjCiuCrupFn67+JhDXHcZQfLGU8YtG8IE0bZMyHJUQrCG924PbEzkiQTnA8'
                'ME1HToyYFEibqihpLEx/C7NyqOwRVyCS2JbMg9kfH8T6mCdUH17xeIwJfp2M'
                'TX8LJD5QqHAMohQq7kWSPnHn+ro2abW0Oqom32DwtjASKPwWrNdm5/q0MHF0'
                '/IuDw68y44mnzzNN0E/cBoC0IN8vbnCaWQJ0RSIkM5UlUD0newt5bJ4Z76TU'
                '9yObbo3MZw3m8ON2NnWa4cXgpMZ4GfcpOjjoxMUpOwi3yvJ/tCnlYi2KCEx9'
                '/mTmQKepiZnxyO7lNYyABEPR8fCg1ShUtiRFfKGBatv4hU5tLtI1NpSunMIL'
                'MbE3StpttusofYedAxNm5UYYFCKRIxukKFugFhM2ozonVWaBpNbo7vqWEu+A'
                'EZomPchbzBnfOZ8zpJJclpiYvu735m0zDSe6Uz8vhf5Ap11MM6XbTgvVuQYs'
                'UVBkCJM76uwxbo9RE4QJWFRSSePd5XsPtNDAUOrx2Omo6GCFR4A5Zhp9Sc7f'
                'zeVQ9yiDTm/zcKThTmayIO9nTHWOYfcWXQegdMpaCP+XEjNnzoApzOkkFFzq'
                'AWdHTyVANdjSZYKf+NRi+jLg2Jv2TqIaQRQ32jeUbpdTVPMqYqx03mrYFndc'
                'hUCtRS9/uQICWTurjpZGJVcPQmuqasUlHKCFvfQwbILkhfhqcHZptxZBU8GE'
                'PNPtELB8Q/axur9rt9KzlX2PNFltanW6Ilp3lBQfXTVtJlabpt4UCmBK/Cv3'
                'YHYT4WA7zbydECsYgNUBADpVD9iVUH/oZpPH5WzKgqjpbpd1qeURSS/eYGXf'
                'KLa5zoBViESCWaDFjWIT0m+oWgJP6VjeWEypoIqBtbu9hJzlV37hB0NiLDSj'
                '8R15sQOd+mo1y/753mStx4k1U30H+c8vK/MpOSswRzjASH7r79lhU4HOXmOe'
                'XNYV62a53q0iBuJp9iob2zowhe5RiToxmDE6F+gSPiXOXhGBlf8qtwB+qrYt'
                'sKocWBdr9CTSCPn7AQg8FbDkUjkG1CuTBx/vbeurK6XnQprgy6q/q6pGVhug'
                'XAdYauc57Zll76XN5NIiZqLNwo5P3YSKjNhtVv/HvUwYZ12hBrf+YZDOisDV'
                'rtmYvqdSIfprfS3XGkXApKbQzkiRhAYg+rC0FJuIiH54ode0zIbeyiQCHoUJ'
                'KGAGGwdcz8VR3nM1Ej44RUqzaEawwoSlv6jHgoacdiK+QWa6gmoiIJzA7khl'
                'lvKrdVviH5BQc119xiIjpbvgOce5roWAtCmXsJF2/uW21R2zl1eob7ibuUYA'
                'a1x1JEec6eXbM5SyzCIkqPSx0RFMIOPbOxAYL6+MxdXtsbzCIg9xMoKFWIGp'
                'GktEvbuUGzWPm20tixEhXdXsQI0MoWxqhuUqO+gCqqe7VFqblrUg5T1Rih40'
                'vtQ3LnTAENud8cFg3ryFJCbl+q6877DqlWXvPuBufzut8RQN5S4UXiWsvqvd'
                '2i2mJAk1iuld7kLAAx5zrsi8zEatS52s3Kv0Qm31QUfucLSGUBPR3j+EGpQ1'
                'shsMiaUw9Q/1brkPAeSwj+aeeNmJsi7Q8wNSM7uqQeQD6DfymGRhyKtmf+1T'
                'L3W9ssRrLGSUgktLK/VaMx2VV4h8gBXPEo118TYvBQPq5p7+NPeo5n6MCs88'
                'MwdP80KbMvBf9xVtCXMinA9OO0zwX+5rlLSUAN8DyWLI3Km4r80CnRuyuR+I'
                'LFT+YU5fLTvX7XuSy1P1GV0HxshSl5C5J2mR571nSD3/IZWSClojvfzHvS0d'
                'Y9vzFZT3GAbvP+NBi8cXQep7Tt2vE87T6RrPdYVz84dEuZCLlUps2NRdHSQS'
                'FgnraQuZuAzo8ywKcVCiXmqrYLWis+NinM9MJwVKd65wlRf2zLl4BwW7+Cx3'
                'pk2DfxcpX0mkgG9bwo2LZs6GPY+J3enyr0c1mi8jcQdVW8D32bNfAMT7dpfl'
                'w0aH/Kb8VJnEwVC/EyCaMPOs24Gdu+OO9gGDcm6ZQYsEGNcbI33fKh+541RC'
                'n4rrZavBZ/+Q9ApJEEaT4fGWCpJuNkot4MJyjw0sYY7agaOZZHBKBwt1Q5ir'
                'R2leng+xNnD1PGRt4mr838ko5Gj8Xx8QcXNQTs3wMipwsUv5Of87GUWZWP8x'
                'CZSOOWazjTlWzo1j0NcWU5HSHWYD1SB8ofQDkOtnl0yRSTpE7nwTfUQwsCDG'
                'z8PFz74GBx/KjT83w1lFzGc6OMBoy6ZP+J+D/TQ5U2x0OJ8lGMkO8FvzEbEM'
                '9PdtOMaZNyTHX8PEheP9OvMmBvjzTFwE0a89c2foa/135fOvS/kkD/ik9gnp'
                'JPYpjPr0DBccaEVEZU0bV4z1kXqa7Nc/ycAFWJFGWZoCvn8bOqhk9L8rof9V'
                'SqiuiIOFU2fwP+NkwTqhLJzL+DanVobWWw9TOrBpIP3+ruXKJfLfW839W+d3'
                'qTY/jOd/aHfNz8/tX42rQ7YVA/ovYdi/0uNXU90prtth+odDeO6Zm8B2mKkM'
                'cMFY4ND5bfnKFDceYLCBTwZ4yOL+rVlokFui/PUNeYTazZTO1gSlNvhd9bnu'
                'havv4t+p7vy3m2gubJ/W/78OH5x04AoFIUnb8jbvdLfa0QUUVBj6ScgrDgX+'
                'qtnFuUjSA5zroX51brI9yA7lQUB/EfUstM2Z9XwAsnIjf4JXYDbKsgi/nZlq'
                'XAwuzuHaq9C2cwrQSFvH7pJc3LroGtC7LCnlb7pqt2qjHya8QukuC+fPC1ai'
                'VB5sj/CQmMU6ZN70oVhe9djz/GJCbGhxCOXOF67uRG1imooFEu8Bi/4InTdS'
                'y3dh6tZESvpKzAzf0U/vSwz14/e35cbN6cspWDjezsa4ybQGibn9eZQaCmSN'
                'nzCj4/tCBRuWJQFzGP/JE7rQdvJFKV2EkoVrx08QzR16g3vV5ZSMofYUXwmN'
                '8iIubui7c/rmws3WF/CGqV0uktmg7yQEleCSm2o/MOleSZH5QTwHXnTDjTTh'
                'EK1mxcOA/KL0fRHLCVC6BQtjUkcIlEhIoseR+pjhgI8NG1P4kKevzitV99oT'
                'SnGHJ2QNhnL9jM1kD68kGVvbVUGkKj913SK8+NMwZCE6/G+kYGkHfmoCaT6F'
                'h5Twc+H3z0+dJEfA/YLc5M1whScLtZaFI4n24keXmMGon2HlXiBduIjY7E3u'
                'TASxvN6s+xMqerjw43l11fZYIivRbiJioaOduNx+211zXbLmYwPFBRjDx9uM'
                'mR2CEChtoeqriJgi3YAV4gsF1s1UT67sHFq2rW7ZYbXd6PzwvEQM5SV9yeWg'
                'uc92zbZattdN/RM4Z3NbTvtFPpVqwlrrs9u3G5k3DAtr8wCXJQReLesVeIiW'
                'uERXrXGHu3U9hogVXKbUZwT4Z4G042Qw9iuxLtyEFvYTT9WDFAG2zUzxIyu4'
                '48XvX7198cPr37x6+YcXPy4gzc3i7P37t27pVw4X93k40bYwWXosPkU88ALi'
                'PvaGXfy6XlfwoS1Rzn6Avy4hpuCeYvJ1vNJVLRxhVSsWMi91SAH4eWqIaK1X'
                'H9VLTOwJASLscggm4CCggaIy3LgLp8hjwdGN6bAF4VrZriryojWpe1b1ksaA'
                'USOYE3mNYUHkcglpOsGT9ow9e333SszVx1647DYJJdEURGyqsINCx+TMavG4'
                '3F1Brhbt4gld5hAL2qH/nHp7pUYJXzgde525smNfx0NRWkCWeb5VwoYRi7os'
                'LpB6c/zae6PHM9cAkpsMZzSSmg+ODNx1y7X1ZT2ZnqAvbpd1992s61d/qptJ'
                'u+v/4uwEnMZJ6TXTPAgRVQOyuc0A6WQqnQX3UTdh5vL87lgoCssDsvgYYe0M'
                'GWUW0vnxFsS07TaMjAguj3xBDSK6xYgRN/+99vFFTkfREmyvekZPY4mnkL90'
                'niqL4cRtOpxmaQiQcxaDAKswmE+H8CZ7d9SPSGYRAAuykrwn4bKxbggq3z26'
                'qYr9sP3Hnc7/OwaxNdanF0qFYrN3FcmYXS9yF3hf6ZhvTFhnBrIOEuMNt2dx'
                '/UpvEAOBcu8woluLae3/h+EJJh6Mhajx8uwypYGV67q/xwg4E2BFvreAsVYR'
                'OQIHQssp/gFAIDBepSZSrjxMKEVOSdLRNXas6ALv2Ik+AqEaxoy1WNyU3c1i'
                'oTiConUtBtV/mv5x5YQ6NW7rON0gd/AXfSnBNNU+MMBb+AWWEQwAcJBHZ8B8'
                'rO5DIOqhlU0LiBxdLMTFH+n7P+h4EbuVH2zqEDk4onYOODaq84UiQuS1CT+N'
                '2vX0PdjVGtC+Ueyzduik7+u8QQSGgmIU+MqblJxzOYBE3LHIHug9chvIwaIV'
                'xf4MHO+dMZEPvvPIP/kovX9bXdewUHyn+oV9QcYWJ5MmvKp0EoLAHZ/eqh0G'
                'XyvhR7Ef0lW12NsmR409f1izBXvRh66WB0MAp2ADwHqVHdz+Ci7bDADh3nQA'
                'BDIUQGPpWXFwQzv64Nb5ABh49QSNxd3fAc0owEDeVB3QiM3G0M6x/B/QlI5O'
                'HVLYM+q5aV9RW3EixDiAS6+OTC8YCMdq1L5Se/EjlGmEPnIT25sqDO1W1l+T'
                'adO9gkL0yrFriA/ddeZVHHCSsdO7GGxdumBhShc4Hzup4imlTAJ/89rHy6SY'
                'h7DqihS9JjuhQZ1gXY0uW9eYKbaprtW++0kHOfvGKH67oLc6rxWXH4AgSKUq'
                'jrf5f0w/rJ7+jz/DP08+zOBvNyuxRqOlNB1uhmJbIRPP9Fj2A7HTvQtAhAdG'
                'PFIMKoXHdi1Y4OC4DyF+SvZy+Gq1qns/2gg2+WBgXqHuEfUW1azo1VsSv5Re'
                'QKbRGWgFO6tZKrR9sxS/Z7MOJ8N1zta0r9Nnxqhkpb+0H3jQ/vSXIoBwjl2A'
                'QZE6EXu+aQ3m4yH0pD9DyrhoETx3gFygcdoFVAzRO0p9o9ba0OwllESBCPC9'
                'c5GYGUVHs6TSqqa79Ga7zQpqjWlTbpCIu6vsKsbFgxxvLPjm/AWk3qxdkxja'
                'GrfVp7rd2XxQjiHMBpw31Z2TV9wtBujIu3TKpK5PKdCotrmZlbSV/lw0F/Fl'
                '15aaTEzMhX36xRjOKd5RVPHxkz3FywC7uet8Vc7hXTO7wKpkFqZKbHv4lN+e'
                'rVZybh0tbLitvhsyNixmQ3SmjHGjzqaC8yMbEtaz2YyOO3NecOpBEW/gZZn2'
                'fg4DMqc1w/lNKxIR0fEZpD06rNZUtwmjqsEdFnIO6OdqUiWg3uQ1t5tC2bip'
                'QyYmhYrtUWoAPEBb/4cV9UB5DxLCbymTF9bSALID6z0nvttiwTIo8cZZohBC'
                'yLc4cNWAQ6oHVlfo8YtcbijT38Ft2pWT4ckMzrsfoz7MXgFL0TbSQbM+Uzll'
                'DWCDvquhftFdlcM2zSzd2MD3gLChNSeCh25+CBbER3pxQ5ULTQ2obSuv4aZk'
                '9fcXNVjpdGSunqgY/TmMWl+K4lxd+HOpxaMrIsKJtFCo4wszft3mnERlYFGM'
                'nz8HhVqys+DMGr/FLGVWo0nkNtO762LlVjsE8LVmq2un8dWmf7HJC2qhU2OM'
                '5dfFPs93fWnFuJ487k7AvubA8BA06QSDu9bowQPzWblZIzDWnUmv0R5Jn/QF'
                'WNF9dYxUJw771lsNp8CwPwYIYyDvpcrjrY8e3t6Z9qP41oYyfxlWUPJ3HjqS'
                '7N1/qFKzOg3oW5XfDDQbOijpu3f8FZhVqbyfg2jqFJXW3Ayuv+OmL3TL38Qa'
                'HnpqOwpzSf9khbBt1bXrT3Q20mfgLnCmqZYfF/ptrBoWlnppTRiNU3rQ0bb0'
                'APyiPrqggkkrQ8zuFidcVZ/lssFsaPd+bq8aM8c4mt9DCmUMHM3PnacXZv3H'
                'XAmu1uU1bs4houHRUx84vxh5c4GSOFLP8F9XDYvk2WaJccBBNp5g9ICGmh8w'
                'n3CiSqDOneZl+3Z0bOdkCZWT9zC+y5TUJBRSuIIMTy7cPOvmubOedOUttrJA'
                'etu6X8tqlfCTS6UHzmtOQfqI5AqmmcqiI0xM0+wCH7jwW5YNzO1ttb22yRem'
                'WOONUcd4thJSxD3e5odd/MFNlMDIK5XlIXcuvoRFJKQXkRKoU5VwijUOX7U6'
                '2brlVw8hpJmpgJph2SAu72oPu0RbPER3WhUs+4lVWz0YxlsNTskEC1ebDgg0'
                'yORdpJKsN6WsR+6d1j2kJS0t3HGjqxZbzQWESaLgr7nU4I+H72kiFy3cLrh/'
                '8acFZtfKfe2TUW8tiYOKAl4R7dliT9VdSzr6BKg2RFR/85Ozur9c7KPs1ev3'
                'L06R3wbUiwzK6GbXmAGdZsU7s8o5AJI0nJIbru4xlxak/mQfEqouQnfu5WX7'
                'qdq7VpJaiFeobNdXnxda4TGsltSZRsmQJCKw/nkcGyAW35AZxCj9ucdkphIn'
                'Soau8+NtGUsXNxevQEJ5WBmM0EpUut7KQ2p24jxujWQJR2Asiw2RTDbjnZ8k'
                '0Tn56q+SZge98ZzITzGtI9+yiGy0jt2hO4m5CNq0wb6/yW25/RgzW6BnlB3M'
                'FaTkW1clJItFu5DjsoIJ/IL8YZ7PM2XsKrSQTmVyjztDGyoAc4H2s68XrwiU'
                'tvTsNzike4yrW2FSX9wLm9ZTYH1FDHNGU2cT4QGfBbEPPnv6Zpp950BZ1pir'
                '2EIaxdZ4fwYYBnnuxD0ZtFsMfRBXwgMyP+KjvdDw8YZp1YJJkerJIiEhk6mN'
                '3/f96oXe7XQK5j+tE0pD4oCKpxeWQxSlzJ0O5CDIMehfYovWRiVX0IU3ogeS'
                'v7Bnwk3bO/eoj+gR7NFVkxOxgiGQbqY0VQ4nMRiS0io4oRuI4NBHD/cU5E/E'
                'AyeByyK7sLPvs+fxk1LQ0fNDOxpg48QAnSM1uHjCMq2bkkvPTqdXbTu9LLd5'
                'Nv0+y9WPBf5AeTP9TE8/56OoPZOiKCi9IV9jBFbNWIgIkCscQKyARte7H6mu'
                'Iy2l53/a+zEKbRiQSILptpytqd5SMGVFbGlD+4GVi9ITKGX2KyuE+DL9mDPZ'
                'AIeL8cz4UnCcT8GlYpGnzuN0DbkKN4oH7gjRWq64OwTGXnZDMyCjV8PGLCt5'
                '0viKBCVVYzfJbFs1jdxKu0ExK/YG8dxD5T6l3aC5xIbvbOKVH+bHaFzVIS05'
                'd2PscAsKoYq6e6XjRbSp0HFSDPorjqn9Fmw4Bhs0Lu5w3HiVdxqybYJlo6OS'
                'dPdskp6ZR8zBVd2Qiq6XD1UP0TNgc/y3roMefuG7anwFw1zQbMDSGIoIFytz'
                'JXCInXIPLLNd+Lez7md+Ge0h6zElJJJ9nI6G7AHO5Z11sRpqYs5CXkeSVfx1'
                'U4mwIqe5einIJ1ayrfMCljP7qatajVUTiGssRgG2ZncRzt8OmQ+rsRew3SSL'
                'lEBM/kcHTX+c0rE8En6lKaRp8Ngf1RCpmT8OIrbDVmCPxVUbUnvAPD5xj9R+'
                'J4G9j/uR/n+2n1HEH8VTsNhuPLC/DixP3Jc89NnzI7BKiloFTXuHqfH989hE'
                'j6bu3bIt0jatjRIQOIvip49pJwfWEffvbGae6d1slsYX3Lm3C7yq0z7hFvMJ'
                'G8LIiVjav+hJ9LiIRholoW7rDutZhSfcSyW+YEMJjLQGCik9VqmwjnDeJ1ZA'
                'aBmVC/wje5rfXCqPTtO4Vqmb+ZfwTlP/pZe0DYltcx448+T7ukdajuU8SCtw'
                '3NWCTIU23MNL/I6Gb7a++q630m4XeLCiK2Z224K/lq0tZAz54ZxGfNsdZk44'
                'w9v+Q7Pdga69omH0k7TzrWipnx7pcfrB31A1vMGGR10r22D5IYaK2C0Hpjt1'
                'c/xl14BD+MWl2RCK/j2iFnwJJwC338PEn5u/KxxKvKsgYMVeXh5ZPmEhr+jt'
                'kjqGO6yPpe4icZ6IXKRYka2zU2oOPeBcEfHc8cb018GUPk5fjRHdCOYgSm+S'
                'xfZkdrp8bSP2NhQUGK9ph4H30ap2g0HRmHUkUk6N80aJEqUQ4KrY4NP5M6G5'
                'goc+aKcYVk1/aoXVtix3fTu9rtSw0H6BWpJhqMKt7WbCtxCifKAQu9PpADR2'
                '4Dkq2lebes3DgZrdVy2UQvLL7Ti1pSUl1C4GDK5acyCL6q/tUgWmNuCwydkO'
                'sH5QJWCZJEvsRadgOkWCOYkSTiqkJsMQdFEu2MFLxp4pQD9YqyseqdkYG/hs'
                'ShhAcgj4XRwIDL7tRD0yVydfreqBvgLnRuYup9gx3cOt4xCC86mC8C4est+y'
                'DSVyCp7iHa+uxXQGumg2vfnHKT4RR42jyhsB46XyMCH7D2R1c1Xm8BPi3tTb'
                'PVnjmHshxdUodn6V7Dh3eHFPbOcczJIRkDGOSiHns8RAXmzXUSFHm0Gsfz23'
                'mAtdnmLdJGxxr9r6dgPXV0pFbpz7KvhPP5zBH+GlueIWYOYT7uNEVMdt/UwV'
                'NUR0KPosQezNHD9+Ae4N3IZiXH7qixPHiR/d9GmHmYvYPc0fJ69OyHP/JAUO'
                'an1W5Ur9Ncl+ZPxUy/9HAy+8dF3OEcUd4PARZfCEEjGcOIy0J7o45KgD4o1D'
                '9hrwgDGBeeBSSGlOUFiL9GmK03D3jN6s4BulTbXdbFP2N7NLNcdY0njh7KN+'
                'mDE2CpO07dgMhv+6r3jPm7P42JcS0Xntb1NzX1J4n0d3kXlcFngR11oUz83K'
                'HTkxKoEfi+sy5eess24KDJF8XJTyGnNByIsiekCMNA+30bBxt7vkwFcniYAX'
                'l02pcGQixHql4NX9/Tjq+anvQ1y7pBd6y17nZHTR8AKXYKQ05mfg+bcqDJia'
                'KoiiK7f3otWYKo5XnzdqPdS9YX4l1JRCu91CdqXrdXspCBPaNMAhZYqeKOm7'
                'U25kMxKqFgPRJcHnErK8JDShFcxdEa9iR4qOEmlVuaen+Y29s+JnT757Gqvg'
                'Zs81cx1/vT9FK25dit06SjykRIhU/0xyVsl7eoQ8p188wE/RAZoNJTlGu+Xs'
                'H6belCTiSWIcnLA24HdSfqTLkfo2MNPwEQq+rButMMW8z+Pex9TAc631r/kE'
                'oTm1GBT4DE1GB17xkWbXdQdcqsdjVvXv4rCoxjdKCPX3JvHOYXG2X1CuEVNT'
                'egURcY+LVG7UuoP/Ks6xubeTRSo8esZi972WI1+9LuMRAdA6OdA/isRAHKT3'
                '4ABoGJfdv9KBNCaUQWx2SX2aFBFdEZJd3LE64K1ivhoSDxkw7sbqx7LYLJCk'
                'kejKw3L/UmKREOGUQiPX407GyucyG6eSWDZdU+GcGHK0egsnSnAfdZgu5eWn'
                'zeaLsfR6IHCQhmR3ydYaR4/wToRBe4fd6XYqdr/lKCIpZ3PyJZfdDSXnSgGW'
                'KpeTDxJUViPxeLpcQxCXeTYpRruP9WYjdZxHEeMFinDtAHmCAE9PviAZrkyt'
                'bS+7Y4m1UeY6+mU0wlZvC0XoMGzbJF2547jh9OFYx1btn0hsJtyDYq1oPLDI'
                '9ptI9D0jf6nhlLedttRGgkUFaZx4M255WNyoyB0TsQ47oGJJvFMBfJZv0+7Z'
                'yTgnd+h7bcrHGNwPjXgDd5AhU3hqvYpJGWyfGovjDjycVvg84fkwkOoh5qUZ'
                'JcxF2oH+Z0EqeQl/xN5tt+8fpJnemIm0Ef/YHVxu4pSqVjht22JzNlFt4J6H'
                'yw4sDyYxQiTj7VCq20+nqYzDIpmvkeCeT46nJ5C7Wa69cgB6EfIpFDb3Ri3Q'
                'PXzsjyhLgzjVYt7Re3Wovs2c8uk6oUN0E+FMB9aE4yWy1vBt5hrMyko3HqzX'
                'BEcBrKCnv492a1/PRa7HQHkCVwtmdrshg1EfDiF5qC49OH3MUOJtsZJuys7P'
                'XyzAFEmP7HjCl3R33rnLxAUH+V8ifdVdzWmKx26jSQYWu2SIbrxfqyhQHSLt'
                'eBVYSsLDWz9AKj+HkjvlHl/tnfJDclykZzAxdZEBiCq4XlaMSEJxV8nXR312'
                'wRJpxFB4dGk3WzfJd+dm5T9I1PHwI0NPJd+OeGiBSsopuY/I4l1ETAnrQxvH'
                'bIkeNQLnYulw6I5C0VkLOvXxom6u2nFx/vwiJc7VQhmrvwrHizwpr2Np1d3k'
                'COgRj6l4naAeYANMXKzOAYotILt4cGKNW6mTZ1c3F7x2TSrxGNUtANgCb0O9'
                '3OpueCTcZA56TfCO4yVkdvOA3UNuO7Vo2+Vyt8WzT5CSRV9yhkHXMhrUZqw+'
                'LJLUd+8SsDwHhyDEs57w13YjqRo1OLjpH6fhFAkPax6bP1x5pJfdhTnzHUhm'
                'Ccquz0/r49vUUDnu1BVcnoM7XU3rZMg2AoElm3Y02+CRrHHSJtbLG3QtLZss'
                'f51boUdxmgweuL+hZBwTuQuoNmdBG81hE7BjlGSVl19AuFEeD9Nb8DhcFgtH'
                'AMu799zzxRJZ1HTWhn/cpeOxj33nMo8Pqwi8iNl9QA3nqicnASoF3ExjQWhO'
                'tQbKGu+njR8aqPY4UqQs4scMZxw+9nENYm9nZ3nglSzSdmmLGYhJaygLojA1'
                'o6xAAhJDUk4XtKVhzi3DZgcYmplb+t0GDV9yf9VHSDF5xSgdc0cgoiqvNSog'
                'WeCe6CyMnowjmGTp8/rCBpph5/v6fJ0fzSD80BEVcMQh40kNd29qsq4pVaqa'
                'NTDOsOXFlQyShQRK9sAURcO167TNp2qLif/FRsqcImJhgTcojUH5sepEsL8w'
                'r1SN2CGUPB4X7ku17rSaF3zo3IJCH659YmLvFI1iMFh0yMcI7GaBrcNxE+C6'
                'GYGK3iVRCBaeyCBWd/Y8z4pFCa5mFZssaZvXaT3X935grUJdZgUtu253S25q'
                'ZW9TGsAPnQIvdpR5xK5UFOmsdJY11gmHgqhqSZ+w7n8SkYIOTfQAnONPTMOP'
                'T3KS9lowmpsWqyIE+7vMrqC29OTRMAIrhVf6zGbsFsG8mUkNLBfhRaiOD0Re'
                'Eo/GHo5pOINRP2geEWADdoRlJLNyKercKV6oV8QMywoVUHNsJl7xYIyr2fWM'
                '/THjh9Q0v6TP445R1D2CSECTLB0gbcI2lbBiIeYo6uh36SSqdMUVyBnIv676'
                's5sSxrEvcOsLlYlrThxmIJJzxRUmLO1pzWPT0cBeGN91RL8XkeCmIA+rdsKA'
                'E4i/X/khSoTkvfTJtK4tvOlg4SC7A0R5YPr5/iese2S+79SzbHqfTX/iHJ0m'
                'watNFOOsKki2ZO6e7A2I8zgyfBqYp0iiI94NHPTAvc+bLBOddQdupDvUa3xO'
                'oFsmP87KMTANKx7qGLAtrZ+55T1nOuOL23jymA+x8HR8EFJtN+43Vn+HfOCK'
                '1ymttB9a5l6e5Z3ONeGcOzEHL/BvjBQOrw1mIdUqia647U6sEVyhyhoE1Fny'
                'Q6WY5npdTVdld2MOOqCMoB7StAlAYu9k+pAV6RbKy4Ugu8yvyiSIRzj1Zb3W'
                'fzvhffGEWnvTC0dOHky4efYMhxjknUgnGU4uGhM6bPdOX6qmtx/oyJdZftqF'
                'pEoNQSjQ/qnDQUPNoaC6J9mcpup4DYfVV9KRPo6CEm2ceG4g2GvI6BuEgjtw'
                'h4295o7SabMv5NuVLA4RfLok26YPO2FCgOumhWCiQJ7E01ccp5RIZA9c6qoJ'
                'xLBUn9VvTghuJdxdlX+qEmC6HWb8v9qBaktJNFdijf6CrMTwYN22m7ggX/vr'
                '73mail3fIl95kjvJDFyITJLk4oFLlwzShy7eS6Xuf0wR35xUlFLX7i49+apU'
                'RJQ1fLRIwfBZZ3Q8T34pP34xL7obrNISvv4Ga8JcbbBRzP5isLEcPdnDvGna'
                'Upqow9iUStpWK20l6KjWlW9ZIK3m9OKh237QTTHat74UygbwaGB1BbrXKUBJ'
                'YPqVllhkeVkHNVOzjy0pWJwGtnThU0KTog4OaN31j24CiMNTWARIIb1y9eSu'
                'w/OPHFsi12J0jOLETY0jeUzjNpnwjBZVc1snNaMhiVKn3khnoeqq55yYqK2t'
                'fsGnqg5qXrqpDR9hZgA+wAnnFmF0OspF69ijpQwi8PQJebSUmLmnS3fCuSgM'
                'VIdp7h2iqGcKSFdferZIWmZg0atFuhl38XX6/WhowQ+td0LXW/VmUXZmuXM/'
                'Y8cRze8ozB+3hmoW7dVVaG8U5khgXsw2/Cas7GEt13rtSU/YZoV5iXHdiKU4'
                'tDRYjKkF8VO9cYdjh5240I2JIiagJ4kNqFBIOR/OBwRgakXuobLkLTQgqjPy'
                'HyFim5acJ6Z8a4IjtHx4+V5BJeh5forl7MUDrrBiaHwxGj4ye3ZsWG/uylEj'
                'eW1MHeUaWFDx1vp+kqkO1GlOjRxckB1XA6w2jYyCCUijBz06+XtF3cS0qQPc'
                'KHWY0DYfz1Gq/LwIPkNI6s04CmDI5S8Nbmp1ALKeSLx/OU+1DIxhmt6+tIJY'
                'wWqlA6obiLGOXBvB89R4IQFTaIcI7GrmfpDuqZo4lWMGDWrxvaMcXQQ2TUmX'
                'f5gnMY4EY1hqLKDIox7Yvh0hppuSYUbaLzyqghVSWnW5kwiowGyRrXZbPU9y'
                'p2Tvwxjl4kP7XtJqQB01lIiCSaUl7+tmVx2r+e7pahSzEzLp6MLeJwq+h8B+'
                '9DnHWkjqgOTvQr1Q7NqrSIkqOmjcwf+gDIn4eUTYj80+B4gRIoD2VEntRSle'
                'DvciNnGyw0NwPx+neQp8SoSELI3bObgqmjMUrnSX3m6ng6b82EaBfnFiht1M'
                'ECj89d4xkmeTB6znR9E1avjMnHTNzabPJt0oPiHuBGvcPCcUp2840et+haLE'
                '2UCcnvu2za6qO9dB1mb85RJcs1FcPgxF/zDkZJiPzXAOqJq8N/rWE7H7Cp6q'
                '8RQ37gUALz15kxwXO6mrvqEbPpcq4mZR5pfNi+xx5l3vJUnEsSU35QotaCx9'
                'YrR6mBuYqYGRpt1Dsvp7ly4PubFNWLt09TiHd9QiWGGhTcjwACsB5+CIPcaE'
                'Kh413UeQaLi9ZWGMCPZuW+NmD2NoQ7648rxpfZbbx66eaz7So9iXlNj6qLMz'
                'SXIPDH1TWQzKdE0R/8vAe9RxGaUyG2LU2kMUUzfU0mQCFnfX69PLMJt05QoU'
                'Zfh6W13v1uVWXkrhiYuPrLfZZbn8qDMFRY6ojmOaqDaZdmYN+dYbUnhtWYQp'
                'OI2LbYpgwrZZU4ad3rcDx1dRNCpaH6NxNvH+pJJeTOfoXhlrlIQWeu+ep43v'
                'el4xGIcLCSAqM2A2CItTO14Pb7vxHn9/BmXmiK1ICw1+0bfGxxwf7IHnjUNM'
                'XnHguA/1Wh66m5MYhBpIvO1V3cC+Mjg9TOXluu2qcRFRQtEV/eXrRPT7wc7o'
                '+53SA9mlzY5WSXMWpxZULnGsmErOu5VU3uybaDV+JePdPMO6m7k3YsHzysbw'
                '7YVxXrzC+jd1J4p4pfxDsdKJMBdaW6rzJtj+qFOqEk+F7Zzv41jHi3MiE1gv'
                'JtjIQaGFipfoI4mu1tShVEkJg0TMFKBC4SLgyhzwCjaBPZMuJ6uVcy2ZF2Ga'
                'Cl1nxm2lzoWY+nRv61cvdA2ZAICth5OC8JdRPOJIAnpsvRLHXYGqJWsSjRP9'
                'YTUGSSThg0ffJ8KW9lzKpdYaJ/For2QqSbrQ9ZcHWArx1YwC2J87USUJG7iz'
                'YLr9KwbTjFQdKMPreypnUzVOmSu8w7i8RwMrZqcmE6sbAWAvCKzVMcqtqi+a'
                'MU/XqGEb2ZbNdTVGCynHR0yyZ5Ns+tzbOfjtgmy+Ok4CQxpGCQ9mnfX80EV9'
                'kFbr4HER8QNzpMKwPPBUIbOkh4q8Ayn1JoWGZV3oBdC0mptgIrWpR9QL71zh'
                'MKy+wrISk3xrA0WW0AninqytwtNbHTbU6SxACN5u+ntjTGLH/NuqbPStWbT4'
                'ua1jzuCjSaX8JFXk+a/rrjtlh0jRjCJwSPeHlepJoxVaMutOn3G1Q6NOJCFm'
                'y/P/dIM9jin24GWojRd4sLCjtxjhrj2Jz4CaeDoqsNOarah0BP3Xjh5dRDxc'
                'jqH2ZXUFTnTw4mR+Ioi/h9z5PHcPS6fpElCBi6ttRWr4WEGbZM+Lr1vD46Cp'
                '3ePI5c3wwLDcqsTlFvUzJYqub9Cqo299eb2p09ag9yHfgoqKh85a0LX7CKQ6'
                'a1ZbBbcvXXuD9CR2L82dN/FjI/KLSeejsUARO4nwEUYV3V7W17t21/ns6nQX'
                'Kc+l3TaPqNshL3qHmM2a2ql3b1egqmpy4cZiyTzbnh4mfwuJD/hCgXYziCYI'
                'aqw9Ivdb4RFH7MlK0YS09666BjWn1B6z1227kuF/XSuXpb7kdVcnesBFyB4K'
                'CvnBxHM972IiJe6b/khElsHuQE7aMsxskl3uevgEinFzZa3S1OMWgEhtPFQa'
                'PlJKmMK0E0HjGuaUIE2xK39OD6zbHd3DxS74oILdgzs0Z6FDT2mylR2hF+TZ'
                'oEhOdRzpQARawLxJj7put7zxL4EfkXAyKZ+ycX+Dgk/Bvq2vb3rC2qmSCIja'
                'JGFBJhDK7xHfUL0MNlqKkd6VqrUu9fEgEdXRpQ/hKleuStjE9I2h2stGhzuO'
                'J0ofUsOo33jcZ9xuyU6DZDinVvviwSd7N+fBUFGTvHNYhHtdB57g0eJfR2kA'
                'PnFnOL8dTO7YwTVhsfsaGoTYZQ5QIuLhJXj+YTOhv6v4mqTZTJdqGWPm+gby'
                'UTdotdcW3jqelAAWu9nyQ4hcrxcT/WEmdqrpJIA5OpBa2qpTd1s6ktfTMRKH'
                's9o+NkNbwGIQ3vnpdxeRNkNr5/w7mSro27Az7OgR7P8LeTmky6EcHXXj/++/'
                'eLHABJzJqQR91Wew1+7L/2ZU0V1jrZlyJzvVOmg65FImxGvXaweIpwCmDB+h'
                'dSmRGA8VBDjMKP33Fg8jl9W6vZtonz2QJhiYi4sEEjW4+Wt00gyKRuQDaoUq'
                'JiegjgXUN9qLUxpFPcdlbVkdY8Q5xqh15DikdS2Wr4GEwzReycxhvo09H0+f'
                'nE2fFLmT0QmH/FO1bTMsaF1FhDKuAx7J3Jqk93f2q+HeMHRuX3eyEPr+Ls/P'
                'phfRPvGW+sAupdl8/yCTXYJDkDVBm7DA7d7+37743dnLVz++eLuv9/Pp2ev0'
                'cM0NE3kiKX66vH84Um/O3r7bjxHQI44UJSiQ9WzAZHBdbbsBSRPr4HEHXAXe'
                'AtMnfE6HbDRP6OMisDaRu38YuD2B7C1uJoUjs2j62Dm/RYnlJ3mYOvXQttw0'
                'LjR9aWPcHASsfVkk+TVWz+LrRcyAfliuSFcQc3qL5D2iI47RCV/1dq+mCIyA'
                'Su8jHuMoEMwZC1G0buIgOzXEmqyenVPbiV08F0M5t87JA7DznC3wVA7eudBl'
                '5JAmsgXDbc5qB5lVTBoDtUNUTTRLdGCyJl3TGUhStB7GjPAf5eaYi2qd3SG+'
                'E16zWN4PN20hNtiTrVADTeUnxF9FIqU8VXyONnA25IqZfZ4/yTOI4xZmiYkN'
                'xEMnrabVRcymcA/u5emc+GlP2BqCooNZlFKs9Ddl42rwKCjHh0yw3MzgA2/4'
                'yVywRTo5ppOwMn55dcD87mEM4Yrw0MnydJjMnEQSa4q/d1OIGLOiFCpoVAzJ'
                'DUKBTDh6WSUlwmRgjPv4OJV26hjaGJklLqpNnJjaOnXyElO3tgnYz+e0hA6h'
                'R3OeXJZ0ofnJE4yOLLRiegBXkOeIr04GAZfUWyGPomjHtIyH43zEfLiVkYTG'
                'QjV1QFkiJJlFFYc6jjvhAvo6aJsvsO3pMfIyfdTC2VL6oLu4+BN6GNnYk/u6'
                'kE5ArAWEOwoPMSyte7/AdPlcS4inHX45Pwp/x1ws1USAS87YQC4SGaEfb7UU'
                '1G3yo7xI4LbE9BHJaIa0o0mNpDODpukUscbya3pIXXhp9N6rD1+QJxHXH6z8'
                'RLReRlXTIsxOqzrWKWEdyucLdDJeLHL0XnbeelHKRGbwbgt94h7urCNGqfjc'
                'VnAFO1/X7hv52DSfiLbFNxw/5BVo6A7hccdLMswnsJ/RuIiL4IEHLtbAHiIl'
                'gbteads5DRlbw7Zldq1H9/KmxcScY1CMN9USfReLiDKuPxSKCFUDQ8ispLvf'
                'nkZuQVmztFewt+VmDFMz8Rrvmx76DCYnG6u/oaYq5hx7zF5q/W7zAK7dV8sI'
                'ilxOuQjGwQn3zeRxzQxbjEPM1uG1RPZV9nBCWSaDTlh7QjmCG7NE+Y+RP0J8'
                'fPQA5ZWrU5Pw5xyxk3nfVLdJoNJXn8mrduZUwpEugTIc3GZRg5WjziPbqSKa'
                'OqvoOJxIcJKfflk+7RLlaMiKvegqGerNOZOxck8xUCoGx+Q0iVb5CRsaddFt'
                '7SVpTgCAUEuNr0NArwJliv70mTd9Ol0yBr2gdKDmWXnZfqoeytxsQPH5O1X/'
                'daD2a/4ec7xIqCxR3DKvYMjqnQKxuVdYbLBerDoYr9vmWv2AGDxwSl3NvNJk'
                'sZKtXyqZ7OQw2seLE6+neJ2WWNXRMdZUNvVPh6W7lO2mcvYBkt0WEYFGQi5N'
                'MLjFTzCr9lIMU4mXkqIAFtS9un4lc8txMmTsg8tfjcWYud+COhXEoxZGFP+8'
                'SNFMJnCSKyiB1gMXkwP/r3At7SObpkxIuUijia6Glpxafh8Yl9JTHpl2pZsH'
                'XDG729aQjJ/gp5YXP33xud6/pMxAIYEVD09tY/2umz8zAz10iDEyG1qJcdmJ'
                '4UMPdI2dCspz3I8kuEDh5OSEIxwZkSw49L0BPMDk5Zawq5tlu1UsRJXnMXaI'
                '3yjOI/wcEyJg180s2JdX2X27s6V0OZ0suTyhFETPLr6PAQ2dBSZci4iVTO+r'
                'Go0hmD4MAhCDMJqZHLJfYtrKvyh1aYsG6n43waN8d0pkhTvkDw0q7GMjrS2Z'
                'i9H/BywSRHHvVgEA')
            # @:adhoc_import:@
            import argparse_local as argparse              # @:adhoc:@
        except ImportError:
            printe('error: argparse missing. Try `easy_install argparse`.')
            sys.exit(1)

    parser = argparse.ArgumentParser(add_help=False)
    # parser.add_argument('--sum', dest='accumulate', action='store_const',
    #                    const=sum, default=max,
    #                    help='sum the integers (default: find the max)')
    # |:opt:| add options
    class AdHocAction(argparse.Action):
        def __call__(self, parser, namespace, values, option_string=None):
            list(map(lambda opt: setattr(namespace, opt, False),
                     ('implode', 'explode', 'extract', 'template', 'eide',
                      # |:special:|
                      'compile', 'decompile'
                      # |:special:|
                      )))
            setattr(namespace, option_string[2:], True)
            setattr(namespace, 'adhoc_arg', values)
    # |:special:|
    parser.add_argument(
        '-c', '--compile', nargs=0, action=AdHocAction, default=False,
        help='compile file(s) or standard input into file OUT (default standard output).')
    parser.add_argument(
        '-d', '--decompile', nargs=0, action=AdHocAction, default=False,
        help='decompile file(s) or standard input into DIR (default __adhoc__).')
    parser.add_argument(
        '-o', '--output', action='store', type=str, default=None,
        help='output file/directory for --compile/--decompile.')

    # |:special:|
    parser.add_argument(
        '-q', '--quiet', action='store_const', const=-2,
        dest='debug', default=0, help='suppress warnings')
    parser.add_argument(
        '-v', '--verbose', action='store_const', const=-1,
        dest='debug', default=0, help='verbose test output')
    parser.add_argument(
        '--debug', nargs='?', action='store', type=int, metavar='NUM',
        default = 0, const = 1,
        help='show debug information')
    parser.add_argument(
        '-t', '--test', action='store_true',
        help='run doc tests')
    parser.add_argument(
        '--implode', nargs=0, action=AdHocAction, default=False,
        help='implode script with adhoc')
    parser.add_argument(
        '--explode', nargs='?', action=AdHocAction, type=str, metavar='DIR',
        default=False, const='__adhoc__',
        help='explode script with adhoc in directory DIR'
        ' (default: `__adhoc__`)')
    parser.add_argument(
        '--extract', nargs='?', action=AdHocAction, type=str, metavar='DIR',
        default=False, const = '.',
        help='extract files to directory DIR (default: `.`)')
    parser.add_argument(
        '--template', nargs='?', action=AdHocAction, type=str, metavar='NAME',
        default=False, const = '-',
        help='extract named template to standard output. default NAME is ``-``')
    parser.add_argument(
        '--eide', nargs='?', action=AdHocAction, type=str, metavar='COMM',
        default=False, const = '',
        help='Emacs IDE template list (implies --template list)')
    parser.add_argument(
        '--expected', nargs='?', action=AdHocAction, type=str, metavar='DIR',
        default=False, const = '.',
        help='extract expected output to directory DIR (default: `.`)')
    parser.add_argument(
        '-h', '--help', action='store_true',
        help="display this help message")
    # |:special:|
    parser.add_argument(
        '--documentation', action='store_true',
        help="display module documentation.")
    parser.add_argument(
        '--install', action='store_true',
        help="install adhoc.py script.")
    # |:special:|
    parser.add_argument(
        '--ap-help', action='store_true',
        help="internal help message")
    parser.add_argument(
        'args', nargs='*', metavar='arg',
        #'args', nargs='+', metavar='arg',
        #type=argparse.FileType('r'), default=sys.stdin,
        help='a series of arguments')

    #_parameters = parser.parse_args()
    (_parameters, _pass_opts) = parser.parse_known_args(argv[1:])
    # generate argparse help
    if _parameters.ap_help:
        parser.print_help()
        return 0

    # standard help
    if _parameters.help:
        # |:special:|
        help_msg = __doc__
        help_msg = re.sub(
            '^\\s*[.][.]\\s+_END_OF_HELP:\\s*\n.*(?ms)', '', help_msg)
        sys.stdout.write(adhoc_rst_to_ascii(help_msg).strip() + '\n')
        # |:special:|
        return 0

    _debug = _parameters.debug
    if _debug > 0:
        _verbose = True
        _quiet = False
    elif _debug < 0:
        _verbose = (_debug == -1)
        _quiet = not(_verbose)
        _debug = 0
    _parameters.debug = _debug
    _parameters.verbose = _verbose
    _parameters.quiet = _quiet

    if _debug:
        cmd_line = argv
        sys.stderr.write(sformat(
                "{0}{3:^{1}} {4:<{2}s}: ]{5!s}[\n",
                ((('dbg_comm' in globals()) and (globals()['dbg_comm'])) or ('# ')),
                ((('dbg_twid' in globals()) and (globals()['dbg_twid'])) or (9)),
                ((('dbg_fwid' in globals()) and (globals()['dbg_fwid'])) or (15)),
                ':DBG:', 'cmd_line', cmd_line))

    # at least use `quiet` to suppress the setdefaultencoding warning
    setdefaultencoding(quiet=_quiet or _parameters.test)
    # |:opt:| handle options

    # adhoc: implode/explode/extract
    adhoc_export = (_parameters.explode or _parameters.extract)
    adhoc_op = (_parameters.implode or adhoc_export
                or _parameters.template or _parameters.eide
                # |:special:|
                or _parameters.documentation
                or _parameters.install
                or _parameters.expected
                # |:special:|
                )
    if adhoc_op:
        # |:special:|
        #          compiled   AdHoc RtAdHoc
        # compiled                    v
        # implode     req      req
        # explode     req            req
        # extract     req            req
        # template    req(v)         req
        #
        # uncompiled --- AdHoc ---> implode   --> (compiled)
        # compiled   -- RtAdHoc --> explode   --> __adhoc__
        # compiled   -- RtAdHoc --> extracted --> .
        # compiled   -- RtAdHoc --> template  --> stdout
        # |:special:|
        file_ = __file__
        source = None

        have_adhoc = 'AdHoc' in globals()
        have_rt_adhoc = 'RtAdHoc' in globals()

        # shall adhoc be imported
        if _parameters.implode or not have_rt_adhoc:
            # shall this file be compiled
            adhoc_compile = not (have_rt_adhoc
                                 # |:special:|
                                 or _parameters.documentation
                                 # |:special:|
                                 )
            os_path = os.defpath
            for pv in ('PATH', 'path'):
                try:
                    os_path = os.environ[pv]
                    break
                except KeyError:
                    pass
            os_path = os_path.split(os.pathsep)
            for path_dir in os_path:
                if not path_dir:
                    continue
                if path_dir not in sys.path:
                    sys.path.append(path_dir)
            if not have_adhoc:
                try:
                    import adhoc
                    AdHoc = adhoc.AdHoc
                except ImportError:
                    adhoc_compile = False
                    try:
                        from rt_adhoc import RtAdHoc as Adhoc
                    except ImportError:
                        pass
            # |:special:|
            AdHoc.flat = False
            # |:special:|
        else:
            adhoc_compile = False
            AdHoc = RtAdHoc

        AdHoc.quiet = _quiet
        AdHoc.verbose = _verbose
        AdHoc.debug = _debug
        AdHoc.include_path.append(os.path.dirname(file_))
        AdHoc.extra_templates = [
            # |:special:|
            ('README.txt', 'adhoc_template'),
            ('doc/USE_CASES.txt', 'adhoc_template'),
            ('-adhoc_init', 'adhoc_template'),
            # |:special:|
            ]
        AdHoc.template_process_hooks = {
            # |:special:|
            'doc/index.rst': tpl_hook_doc_index_rst
            # |:special:|
            }

        if _parameters.eide:
            AdHoc.tt_ide = True
            AdHoc.tt_comment = _parameters.adhoc_arg or ''
            AdHoc.tt_prefix = '. (shell-command "'
            AdHoc.tt_suffix = '")'
            _parameters.template = True
            _parameters.adhoc_arg = 'list'

        if adhoc_compile:
            ah = AdHoc()
            source = ah.compileFile(file_)
        else:
            file_, source = AdHoc.std_source_param(file_)

        # implode
        if _parameters.implode:
            # @:adhoc_enable:@
            if not _quiet:
                list(map(sys.stderr.write,
                    ["warning: ", os.path.basename(file_),
                     " already imploded!\n"]))
            # @:adhoc_enable:@
            AdHoc.write_source('-', source)
        # explode
        elif (_parameters.explode
              # |:special:|
              or _parameters.install
              # |:special:|
              ):
            # |:special:|
            if _parameters.install:
                _parameters.adhoc_arg = '__adhoc_install__'
            # |:special:|
            AdHoc.export_dir = _parameters.adhoc_arg
            AdHoc.export(file_, source)
            # |:special:|
            README = get_readme(file_, source, as_template='README.txt', transform=False)
            USE_CASES = get_use_cases(as_template='doc/USE_CASES.txt')
            sv = AdHoc.inc_delimiters()
            AdHoc.export(file_, README)
            AdHoc.export(file_, USE_CASES)
            AdHoc.reset_delimiters(sv)
            # |:special:|
        # extract
        elif _parameters.extract:
            AdHoc.extract_dir = _parameters.adhoc_arg
            AdHoc.extract(file_, source)
            # |:special:|
            # imports, that should be extracted
            for imported in (
                'use_case_000_',
                'use_case_001_templates_',
                'use_case_002_include_',
                'use_case_003_import_',
                'use_case_005_nested_',
                ):
                ximported = ''.join((imported, '.py'))
                ximported = AdHoc.check_xfile(ximported)
                if ximported:
                    simported = AdHoc.get_named_template(imported, file_)
                    AdHoc.write_source(ximported, simported)
            README = get_readme(file_, source, as_template='README.txt', transform=False)
            USE_CASES = get_use_cases(as_template='doc/USE_CASES.txt')
            sv = AdHoc.inc_delimiters()
            AdHoc.extract(file_, README)
            AdHoc.extract(file_, USE_CASES)
            AdHoc.reset_delimiters(sv)
            # |:special:|
        # template
        elif _parameters.template:
            template_name = _parameters.adhoc_arg
            if not template_name:
                template_name = '-'
            if template_name == 'list':
                sys.stdout.write(
                    '\n'.join(AdHoc.template_table(file_, source)) + '\n')
            # |:special:|
            elif template_name == 'README.txt':
                README = get_readme(file_, source, as_template=template_name, transform=False)
                sv = AdHoc.inc_delimiters()
                AdHoc.write_source('-', AdHoc.get_named_template(template_name, file_, README))
                AdHoc.reset_delimiters(sv)
            elif template_name == 'doc/USE_CASES.txt':
                USE_CASES = get_use_cases()
                AdHoc.write_source('-', USE_CASES)
            elif template_name == 'adhoc_init':
                import use_case_000_ as use_case
                use_case.main('script --template'.split())
            # |:special:|
            else:
                template = AdHoc.get_named_template(
                    template_name, file_, source)
                # |:special:|
                try:
                    template = AdHoc.decode_source(template)
                except UnicodeDecodeError:
                    pass
                else:
                    template = AdHoc.section_tag_remove(template, "adhoc_run_time_section")
                # |:special:|
                AdHoc.write_source('-', template)
        # |:special:|
        # expected
        elif _parameters.expected:
            AdHoc.extract_dir = _parameters.adhoc_arg
            AdHoc.extract_templates(file_, source, AdHoc.section_tag('adhoc_expected'))
        # documentation
        elif _parameters.documentation:
            sys.stdout.write(get_readme(file_, source))
        # install
        if _parameters.install:
            here = os.path.abspath(os.getcwd())
            os.chdir(AdHoc.export_dir)
            os.system(''.join((sys.executable, " setup.py install")))
            os.chdir(here)
            import shutil
            shutil.rmtree(AdHoc.export_dir, True)
        # |:special:|

        # restore for subsequent calls to main
        if not have_adhoc:
            del(AdHoc)
        return 0

    # run doc tests
    if _parameters.test:
        import doctest
        doctest.testmod(verbose = _verbose)
        return 0

    # |:opt:| handle options
    run(_parameters, _pass_opts)

if __name__ == "__main__":
    #sys.argv.insert(1, '--debug') # |:debug:|
    result = main(sys.argv)
    sys.exit(result)

    # |:here:|

# @:adhoc_uncomment:@
# @:adhoc_template:@ -test
# Test template.
# @:adhoc_template:@
# @:adhoc_uncomment:@

if False:
    pass
    # @:adhoc_verbatim:@ # docutils.conf
    # @:adhoc_remove:@
    # @:adhoc_uncomment:@
    # @:adhoc_indent:@ -4
    # @:adhoc_template_v:@ docutils.conf
    # [html4css1 writer]
    # stylesheet: README.css
    # embed-stylesheet: yes
    # language_code: en
    # @:adhoc_template_v:@
    # @:adhoc_indent:@
    # @:adhoc_uncomment:@
    # @:adhoc_remove:@

    # |:info:| The following list is kept in sync with MANIFEST.in.
    # This makes it easier to avoid discrepancies between installation
    # from source distribution vs. installation from compiled script.

    # @:adhoc_include:@ MANIFEST.in
    # @:adhoc_unpack:@ !MANIFEST.in
    RtAdHoc.unpack_(None, file_='MANIFEST.in',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        'H4sIAGGVLlMC/3WSy07DMBBF93xF1khxSys+oBJBYlEWwN4a7Ek6wi95JlXg60lKSZNW'
        '2XhxzrWvNTYF41qLxX73+vJcvX8oCsUd/UP4wpocjuCt2j3tK2WYr5F0MiKwh2hU+r6A'
        '3CTIjNpFA25qbDSrm5YBahYQMqvTWaWLTSy3G0UmzlIXq/jYzJSJob5uomCxU5llRn3f'
        'rz5hDn9KD8zQYPm3iQ9T3Qo5VkPFSAN45AQGtSUj02ZGadMMSKbQ1DF7kNuRtP2cDPTL'
        'er3WC+JBC/rkQJCXIht9hkuBrSafYpYl/6gDsqA9+YymzUzHYRyTR+6vwVLczxPYnedE'
        'vRv/wi8ZvSj5aQIAAA==')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ Makefile
    # @:adhoc_unpack:@ !Makefile
    RtAdHoc.unpack_(None, file_='Makefile',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        'H4sIAGGVLlMC/6VWbW/aSBD+zP6KOUqL3atNXhSdZI4KmjjXqCUgIFIjneTbrBew8Ju8'
        '615a5cff7BqDwSRFOT6sdmeenZl95gW/Aeu9BRFd8XkQcnUgRCapJzLmBxn0wCaV7UMQ'
        'F9tOLrJOmDAadlBGyPh+9nl0601Hd5NLdwq9fcHvPaD+MmF2+oOQwdXn0aU3vveu3LFW'
        'DUv3E3dwNXRtJgT4CctlEAqbJfEcBJd5qi7X7iKuoyCo1Hv1FPuBSn0oDR++piOywmSR'
        '2OL7Qos8IakMqirr/MwOWFK3IGQWxIt5kkVUepqKg/HRbJHSTPAXIDGNuEgp454fMHkQ'
        '0jLupq53OcBl9m2mxSYhNZmC5uiLUVxOTk48ZexXqFNP8igNqeTiKPyZF8QszH1+FPrc'
        'C6I0yeRR4Asv5kJyX4OJ+202GXhXN9MZFhS5/OoObq9vvuryqhw0O+tyG09Gf00GQ+Rm'
        'FzAc3N5cu9PZnvg9umF7sip9KopntRXaXsRt6HoRVdL0Iqik5wCIYbh6PdXrmV7P9Xqx'
        'h9W17bElZysvSvw85F7RXvxYoNw0fEk4qCSkVIr8QUh4+8EPhOy8/bBJzHoOmFi0Kp9l'
        'Grf7yhTYldZMPKPepn5Pv60idF7Ehfw5oNbtUGpoTXkEy2JJlKqR1PoTPrb6pMGWSAH8'
        'cXEBeCI+n9M8lA7QMCQEFwc9bRybSmzphtfKYuuU400+ynK7lFGoBw8OVv5oZ6KYW2Wf'
        'TBWWEBZyGjukgaUmwfoJ7ZaxzZTZhqcnyCKwsjnsKAgJYpxnW/8q2Ea0UiPcShFbjHOT'
        'NPpGQ//+Jo0Qeei167S2u1C6b7ZaCtVEv+oGjkBIs2QBQQyFpouPWJsD4GyZQJOl2mVL'
        'Azeem9016LC6W9jwk5h3NwFun+XAzvtgLtMiww7+h9GFsDKGpC147KmTLZaY1rJnNaCm'
        'xacwXtqoMNVfV05ZH86mcDDYnWFtVq6pK6SR/pDLJIZnS0tlz1Dpw+z1u8AfAwmn5n7B'
        '4dvKAvgNrH+hI7LvHRR20vxB5UFTY2A0w8EX14SCwN4OapcspLFSg4dqE/+FSQMr8kwB'
        '1pGHCV1ZPKJBaFHfz7gQXOh36CC3NpxKZ9UJKJPQw9d/1ORWO+AVd3f6ZSc5B/42jzFq'
        'j7H47x3VjMrBunUMYL4Swbt3G6YVOWYRxbMfD5g5o37zWTiaewNPzpJn3HnCrRP43Ip4'
        'nDvgRpQJuLlycVpiuw1RCBZ8yudznkH/0931tTvp4xUbhtYj/MMRqW+2wTCNzQmaP5va'
        'ibLswOVoOMaB4YBqBH3ZCLkEw8BvFwFNJW2aJhhl3eImZviF1VTfWmCtoKm+coRpHrKp'
        'm6BmU0lfb3NdyXWza8XrLasRUrOKwv/xfqyg+vMT9nqL+t+gblOLX291Kmns08yvGz7W'
        '5n/r1+bDSwwAAA==')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ README.css
    # @:adhoc_unpack:@ !README.css
    RtAdHoc.unpack_(None, file_='README.css',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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')
    # @:adhoc_unpack:@
    #                   README.txt is generated
    #                   adhoc.py is this file
    #                   argparse_local.py is imported
    # @:adhoc_include:@ doc/Makefile
    # @:adhoc_unpack:@ !doc/Makefile
    RtAdHoc.unpack_(None, file_='doc/Makefile',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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'
        'ORHh1PkHUfjTfNMaAAA=')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ doc/_static/adhoc-logo-32.ico
    # @:adhoc_unpack:@ !doc/_static/adhoc-logo-32.ico
    RtAdHoc.unpack_(None, file_='doc/_static/adhoc-logo-32.ico',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        'H4sIAGGVLlMC/62Xe0hbVxzHT5IlsYZpqy4T3HzNYlbrY7Pq3GRJzWNqNiubcyn+k4HQ'
        'gZgOK8xlLSulo9tEqLRULJN2MKxVR0IowXQgPrrB2DRjJeBIMbGdpMQmMcYketX727lx'
        'KdKa5t6bnvBNbm7u/X3O/Z2T3wMhDn7l5iLqHQ3vR0iMEJJg4VNIhnbORwb+LU20o+gA'
        'AFoKh8MHLBaLtru7+3p9ff3vEonkYV5eHuTn5/vKysrut7S0/Nbb29tjs9mUJEkm07Ub'
        'Tw6Ho1qn0xkyMjLWqenGE4fDgaqqKvvo6GgXnsd+ttxQKJSJn/WmUCgEOty9VFNTY5+f'
        'n5die1wmbLvdLi0uLvaw5VI+4HK5kc+UlJQNg8FwBtvl02HPzc1pxWLxOlMmj8uD5vxm'
        'MNYYwVnnBK/KCy65C6bfmoZzknMw9fNUdzw/4OdWYPY2U3ZachqY3jWBV+GNKZfKRYYs'
        'oT7M2bcXOxgMvlJSUrLMlC14QQC3Zbefyd6t8Fj4BuYJnuTr9fobbNb6ROEJ2uyI8LoQ'
        'vxKf72b7/f5ckUhEsNlns4pZZnws34c+glwlC6N8k8nUxubZj2QeYcyOKvRj6If/+fz+'
        'y/3fs+H3vdnHmr+iWfHDFqQCCfuufXxtiSk768UsWFIuseZT2rRtfrT516bWprQBj8dj'
        'xL9adTUhduS/MBLuCfWHblLHxwuO02Y3v9YMXqU3YX6wN3hrtXN1njp2KBxwOONwXHZd'
        'Th0VSxJmUwqcDkzifbAe/U7NQVOgicTuJ7kioQj0xXpwq9xx7U4dnYLOok5Q56gj0kl0'
        'YJFanvJZ4KvAL75jvqfun5PPwfmS89Be3A66Ih1cqbgCDpUjLvee4h405TdF4kIs39kV'
        '9sfXr32zdsev9Xuehy9tchscPHAw7vodSj8ETqVzJwb0h0yBM4E/EmW7lC4ofamU9v7V'
        'Fmoj9xEzRCeOQ5cT5Z8qOsUsZ/EF4GxyEmSQzNz6Z+uTRNh35XchiZ/EOHaavzMbIrmY'
        'hGR/m/8hW/7J10+yqpGMRmN7NP+s31r/lg17+b1lyEzJZMW3Wq2qxzmYgCz/p8x9MPbO'
        'GCs2rts929vbwt01AN4Hx3zv+zZo83EsUbyqYMUfGho6vUcNxiX+JNo8H3gIOvxL1Zdi'
        'xplnSaPRWHFfkBSjBuU/mH3QYpaZN2Lll0eqR3Ch/ALjfEmpoqJieW1trSBeDW42mz+T'
        '5cjgYvlFmDk6A1aZFSalk9DzRg+UiktZ+byysnIZjxK6Pcj4+Hhbenp6mG0PsrtGbG1t'
        'ncX1dS7THmxxcbFarVb/zZadnZ3tGRkZOYvXW5BAD8qfmJhoxfOwCQQCMh6Tyt3l5eX/'
        'DgwMfI175pefVx+MJXS73UXDw8NfdHV1/dTY2HhHLpc7amtr7zc0NEx3dHQYBwcHv1xY'
        'WHgbX8ujbXcSX4rnvYWQFDd9OSsIpToREk4ixKN0FiEOJcRscKL3Re1QNrH9VMzJwU6U'
        'UkyK/R87YiMjvhAAAA==')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ doc/adhoc-logo.svg
    # @:adhoc_unpack:@ !doc/adhoc-logo.svg
    RtAdHoc.unpack_(None, file_='doc/adhoc-logo.svg',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        'H4sIAGGVLlMC/+2cW3MbWXKt3/tX1OG8TMcBwH2/sCX5oSccMRGeF9snzjNFQhLcJMEA'
        'oZbUv97fyg2QFAXqNlK3w9Ht8IioKlTt2jtz5VqZufHkX95eXky/Ljc3q/XV0yO/cEfT'
        '8upsfb66evn06P/957/O29F0sz29Oj+9WF8tnx5drY/+5dkPT/7PfD79vFmebpfn05vV'
        '9tX096tfbs5Or5fTX19tt9cnx8dv3rxZrHYHF+vNy+Mfp/n82Q8/PLn59eUP0zTx3Kub'
        'k/Ozp0e7L1y/3lzYhednx8uL5eXyantz7Bf++Oju8rO7y8/09NWvy7P15eX66sa+eXXz'
        'l3sXb85f3F6t0byJdpHvvR+7cBzCnCvmN++utqdv5+9/lTEe+mpwzh1z7u7Kz7vq5O0F'
        'U/HoYOzs/acz/df8/+0X9gcWN+vXm7PlC765XFwtt8d/+8+/3Z6cu8X59vzebfaz/95z'
        '31uSq9PL5c316dny5nh/3L7/ZnW+ffX0KCRnH18tVy9fbe8+r86fHvF+wT7csx0/zu7u'
        'dHJ7xi1SW8SFnza9tWIX7Qd9cr4+0yieHp2ev1qfzS/WL9fzX8OcKVxoCp9x8ZPz5Ysb'
        'fWk8WZ/S0XRsp27vo5uc/7pavrm78PnpzXidabo+fYmhXKw3T4/+8sL+2514vt6cLzf7'
        'U8X+e+/UmulZbd8N19jde/+Cuuvt+YNnb16dnq/fMHMPT/62Xl8+PYqLHHP54OTZ26dH'
        'JSxKCzH6D05qLL4vcqi1PTzJbL6W48xfX622GOf12w++/nqz0QUXp++WvLL9s3/jm1fr'
        'Ny83mrrt5vXy/sHXq/PlzXuHb29o5+bPn6/fHj5/c3V6PX95sX5+evGRC67Wjz5g3IBh'
        'cf7F6cXN4Qu26/l+lAcvWj//r+XZdn59un312CVvVlcs1nxn/L778sgVe3/wzrdHLnl7'
        'wCB2p949fury9O3qcvXbkhXYr/uL1ZbDm5erK17x+u6r945fLF9sD57YjGEeOPN8vd3K'
        'AN29RR72/tgcc8F9gx4XPbOrntzZAqs0vjhN23dCnrfvdOxof1C2pQOht3x7cHl5LRCy'
        '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'
        'hvZEP+z87If/BprdwG+aZwAA')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ doc/conf.py
    # @:adhoc_unpack:@ !doc/conf.py
    RtAdHoc.unpack_(None, file_='doc/conf.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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')
    # @:adhoc_unpack:@
    #                   doc/index.rst is generated
    # @:adhoc_include:@ doc/make.bat
    # @:adhoc_unpack:@ !doc/make.bat
    RtAdHoc.unpack_(None, file_='doc/make.bat',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        'H4sIAGGVLlMC/7VXbU8bORD+TH7FKFKk9gSJkO7DiTanawsITimJINX1QwV1didZN7v2'
        'snZ46a+/8ctmX27jQ0CRIMF+ZuYZe/x4/NfJp7MpTE9Pe73Lk8/wSWYZEzEseYqwlAVc'
        '5QkXDxDLaJOh0ExzKXo9voT+4Gp2dn7x9eOX88nxoA/jMfT78Ka3p1BDbWqsrIeDxYan'
        'ce9tz0zbiePzy/GNGzVjHyYTZzWdza/GBzEMStRgRNF1gahgUEEGMLR254d/XNQMWwgi'
        'ejGdE9nZh9nJZZtmK+YxpEzjw03OcixuFP+JY28HgwZ04MxboYP2TeyAFsIt4mFJaSW1'
        'hATTvDlhRizfIzu3h1Eih7MUmULY0O/3jK0Rrt9rVqxQX//5He4TLOojwBVIgSCX3hog'
        '0VkK7oeCWg9K07az1ADP5p8ntgDU1iDmRWlTGlQoECzDGLiI8WFoYVwYC4y0LHjNi+Ji'
        'laJFlF6YH6SVI7aV061NzqM1Tdcj+6Emwx9KilZKf19NL1ooE9usY3cepvCZG7CgvJA/'
        'KImt9a32tgFrj2mbxnhX2u40PfaYti3mm0UrNSbs6BZi664JmbA5fnX+9+FRbiAiI1O1'
        'tiLH7Heg0+2+p6g1Fltn5Eq34tmh5lKSTEALRUMblkLOVjUcmXKxlHXc3A81Ha4MCxe5'
        'BM6mkKFS5I/Ya6rOVQWPEiYoTmtV5B0Wdxzv7Rdgaepx8YjFMf2NMae6pNWietWYVe5S'
        'LtZRgtHaunPfjDkxwkJQVgagrCRyoXFVcP1Y7S7pE6qSerER1tSPKsBsgSa6ORdUHk0x'
        'BTrtKNgixbi3Z0UARdyWh4gOvLAyYAiMSBwH3Hh7U4nkt9/ekmMoMjp5MLqFkTKg3l6M'
        'aflvDbs7lDkiNlJD3+Fg4VSjJYR1lTbzvT2TTlHIIsU7inxIC8g1jBZw6FfLf3w0wk8V'
        'ILhKMB7CPPEnwlYPMJIwyq/lfbibtleobualfAXIe8iv4+8DBFKo5LE7i5p8BhKpUL8u'
        'lypGIB0n092peAkPpOEQz0zhHQh5vxU90tOIVMQevfrdEeBubpNu5vaeCfA286/OurrJ'
        'huGDu+0WOg+vvV3+5wC7LuMV+BsVtEV0ZqL+I4u1SmQO91wnNqfr3jBJtpedazj/e+IN'
        'nUDO7rbtztjfxIF8HeLVsu3fRjJNKRlS9RUKLBj1P/1GxrdJFEzZMdqny8ZcuglXRz42'
        'tXFd3uua7my/2Rjeai7BXoYmul0ME7LmkinFTeOn4aByfmpodfhdJVFAfl3vskN+fWMT'
        'kl8Hea5k7SZm2qRuVratClByDdYLJNQGcJusWvtspgKkbTvXzdp1egHaFvDsmjaVUusc'
        'O7Tf+g9wNz1cN3Xb3QWYm/kXLXjVpXbwNpMB2hnbIfimzw2QpukXca73zB2saTq81qaR'
        '3rnctssOr7iBvCiBRjPfve5mPpCFb/y7syhfBe0HdKMkZcSe3Sv4bWg9M7oK30YJ5OFf'
        'JN15lM+VwG54yJPzMLy3751unfEuQ1JTvnt2yM32WRSSnBL0ZOoTsvCPrEhmOT1A8R2k'
        'Uq7tA4uJR+dFlS8mtqBEQW50vtF0j9pHWCeDkcMMdfCw+5fZjtvKP+ZCt5WDPH2nCEwt'
        'M8hl9Sj0mSm5KajP25bjvlsGpn3LUKDapLq9r97L7myPzOe/zV7QttwTAAA=')
    # @:adhoc_unpack:@
    # @:adhoc_include:@ doc/z-massage-index.sh
    # @:adhoc_unpack:@ !doc/z-massage-index.sh
    RtAdHoc.unpack_(None, file_='doc/z-massage-index.sh',
        mtime='2014-03-23T03:03:44', mode=int("100755", 8),
        zipped=True, flat=None, source64=
        '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'
        'e7N8EQAA')
    # @:adhoc_unpack:@
    #                   docutils.conf is included above
    #                   namespace_dict.py is imported
    # @:adhoc_include:@ setup.py
    # @:adhoc_unpack:@ !setup.py
    RtAdHoc.unpack_(None, file_='setup.py',
        mtime='2014-03-23T03:03:44', mode=int("100644", 8),
        zipped=True, flat=None, source64=
        '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'
        'Oi/0euz+qev++XuiSt+z6t38D7p16b9oDwAA')
    # @:adhoc_unpack:@
    #                   stringformat_local.py is imported
    #                   use_case_00?_* is imported
    #                   adhoc_test is imported
    #                   dist/adhoc.py is generated

    # |:here:|

# (progn (forward-line 1) (snip-insert-mode "py.t.ide" t) (insert "\n"))
#
# :ide-menu: Emacs IDE Main Menu - Buffer @BUFFER@
# . M-x `eIDE-menu' (eIDE-menu "z")

# :ide: CSCOPE ON
# . (cscope-minor-mode)

# :ide: CSCOPE OFF
# . (cscope-minor-mode (quote ( nil )))

# :ide: TAGS: forced update
# . (compile (concat "cd /home/ws/project/ws-rfid && make -k FORCED=1 tags"))

# :ide: TAGS: update
# . (compile (concat "cd /home/ws/project/ws-rfid && make -k tags"))

# :ide: +-#+
# . Utilities ()

# :ide: TOC: Generate TOC with py-toc.py
# . (progn (save-buffer) (compile (concat "py-toc.py ./" (file-name-nondirectory (buffer-file-name)) " ")))

# :ide: CMD: Fold region with line continuation
# . (shell-command-on-region (region-beginning) (region-end) "fold --spaces -width 79 | sed 's, $,,;1!s,^, ,;$!s,$,\\\\,'" nil nil nil t)

# :ide: CMD: Fold region and replace with line continuation
# . (shell-command-on-region (region-beginning) (region-end) "fold --spaces --width 79 | sed 's, $,,;1!s,^, ,;$!s,$,\\\\,'" t nil nil t)

# :ide: +-#+
# . Fold ()

# :ide: CMD: Remove 8 spaces and add `>>> ' to region
# . (shell-command-on-region (region-beginning) (region-end) "sed 's,^        ,,;/^[ ]*##/d;/^[ ]*#/{;s,^ *# *,,p;d;};/^[ ]*$/!s,^,>>> ,'" nil nil nil t)

# :ide: CMD: Remove 4 spaces and add `>>> ' to region
# . (shell-command-on-region (region-beginning) (region-end) "sed 's,^    ,,;/^[ ]*##/d;/^[ ]*#/{;s,^ *# *,,p;d;};/^[ ]*$/!s,^,>>> ,'" nil nil nil t)

# :ide: +-#+
# . Doctest ()

# :ide: LINT: Check 80 column width ignoring IDE Menus
# . (let ((args " | /srv/ftp/pub/check-80-col.sh -")) (compile (concat "sed 's,^\\(\\|. \\|.. \\|... \\)\\(:ide\\|[.] \\).*,,;s,^ *. (progn (forward-line.*,,' " (buffer-file-name) " " args " | sed 's,^-," (buffer-file-name) ",'")))

# :ide: LINT: Check 80 column width
# . (let ((args "")) (compile (concat "/srv/ftp/pub/check-80-col.sh " (buffer-file-name) " " args)))

# :ide: +-#+
# . Lint Tools ()

# :ide: DELIM:     |: SYM :|         |:tag:|                standard symbol-tag!
# . (symbol-tag-normalize-delimiter (cons (cons nil "|:") (cons ":|" nil)) t)

# :ide: DELIM:     :: SYM ::         ::fillme::             future standard fill-me tag
# . (symbol-tag-normalize-delimiter (cons (cons nil "::") (cons "::" nil)) t)

# :ide: DELIM:     @: SYM :@         @:fillme:@             adhoc tag
# . (symbol-tag-normalize-delimiter (cons (cons nil "@:") (cons ":@" nil)) t)

# :ide: +-#+
# . Delimiters ()

# :ide: COMPILE: Run with --ap-help
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --ap-help")))

# :ide: COMPILE: Run with --help
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --help")))

# :ide: COMPILE: Run with --test
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --test")))

# :ide: COMPILE: Run with --test --verbose
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --test --verbose")))

# :ide: COMPILE: Run with --debug
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --debug")))

# :ide: +-#+
# . Compile with standard arguments ()

# :ide: OCCUR-OUTLINE: Python Source Code
# . (x-symbol-tag-occur-outline "sec" '("||:" ":||") (cons (cons "^\\([ \t\r]*\\(def\\|class\\)[ ]+\\|[A-Za-z_]?\\)" nil) (cons nil "\\([ \t\r]*(\\|[ \t]*=\\)")))

# :ide: MENU-OUTLINE: Python Source Code
# . (x-eIDE-menu-outline "sec" '("|||:" ":|||") (cons (cons "^\\([ \t\r]*\\(def\\|class\\)[ ]+\\|[A-Za-z_]?\\)" nil) (cons nil "\\([ \t\r]*(\\|[ \t]*=\\)")))

# :ide: +-#+
# . Outline ()

# :ide: INFO: SQLAlchemy - SQL Expression Language - Reference
# . (let ((ref-buffer "*sqa-expr-ref*")) (if (not (get-buffer ref-buffer)) (shell-command (concat "w3m -dump -cols " (number-to-string (1- (window-width))) " 'http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/expressions.html'") ref-buffer) (display-buffer ref-buffer t)))

# :ide: INFO: SQLAlchemy - SQL Expression Language - Tutorial
# . (let ((ref-buffer "*sqa-expr-tutor*")) (if (not (get-buffer ref-buffer)) (shell-command (concat "w3m -dump -cols " (number-to-string (1- (window-width))) " 'http://www.sqlalchemy.org/docs/05/sqlexpression.html'") ref-buffer) (display-buffer ref-buffer t)))

# :ide: INFO: SQLAlchemy - Query
# . (let ((ref-buffer "*sqa-query*")) (if (not (get-buffer ref-buffer)) (shell-command (concat "w3m -dump -cols " (number-to-string (1- (window-width))) " 'http://www.sqlalchemy.org/docs/orm/query.html'") ref-buffer) (display-buffer ref-buffer t)))

# :ide: +-#+
# . SQLAlchemy Reference ()

# :ide: INFO: Python - argparse
# . (let ((ref-buffer "*python-argparse*")) (if (not (get-buffer ref-buffer)) (shell-command (concat "w3m -dump -cols " (number-to-string (1- (window-width))) " 'http://docs.python.org/library/argparse.html'") ref-buffer) (display-buffer ref-buffer t)))

# :ide: INFO: Python Documentation
# . (let ((ref-buffer "*w3m*")) (if (get-buffer ref-buffer) (display-buffer ref-buffer t)) (other-window 1) (w3m-goto-url "http://docs.python.org/index.html" nil nil))

# :ide: INFO: Python Reference
# . (let* ((ref-buffer "*python-ref*") (local "/home/ws/project/ws-util/python/reference/PQR2.7.html") (url (or (and (file-exists-p local) local) "'http://rgruet.free.fr/PQR27/PQR2.7.html'"))) (unless (get-buffer ref-buffer) (get-buffer-create ref-buffer) (with-current-buffer ref-buffer (shell-command (concat "snc txt.py.reference 2>/dev/null") ref-buffer) (goto-char (point-min)) (if (eobp) (shell-command (concat "w3m -dump -cols " (number-to-string (1- (window-width))) " " url) ref-buffer)))) (display-buffer ref-buffer t))

# :ide: +-#+
# . Python Reference ()

# :ide: COMPILE: Run with --decompile dist/xx_adhoc.py
# . (progn (save-buffer) (compile (concat "rm -rf __adhoc__; cp -p dist/adhoc.py dist/xx_adhoc.py; python ./" (file-name-nondirectory (buffer-file-name)) " --decompile dist/xx_adhoc.py")))

# :ide: COMPILE: Run with cat dist/adhoc.py | --decompile
# . (progn (save-buffer) (compile (concat "rm -rf __adhoc__; cat dist/adhoc.py | python ./" (file-name-nondirectory (buffer-file-name)) " --decompile")))

# :ide: COMPILE: Run with cat /dev/null | --decompile
# . (progn (save-buffer) (compile (concat "rm -rf __adhoc__; cat /dev/null | python ./" (file-name-nondirectory (buffer-file-name)) " --decompile")))

# :ide: COMPILE: Run with cat /dev/null | --compile
# . (progn (save-buffer) (compile (concat "cat /dev/null | python ./" (file-name-nondirectory (buffer-file-name)) " --compile")))

# :ide: COMPILE: Run with cat /dev/null |
# . (progn (save-buffer) (compile (concat "cat /dev/null | python ./" (file-name-nondirectory (buffer-file-name)) " ")))

# :ide: COMPILE: Run with --help
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --help")))

# :ide: COMPILE: Run with --template doc/index.rst
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --template doc/index.rst")))

# :ide: COMPILE: Run with --template test
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --template test")))

# :ide: COMPILE: Run with --template
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --template")))

# :ide: COMPILE: Run with python3 with --template list
# . (progn (save-buffer) (compile (concat "python3 ./" (file-name-nondirectory (buffer-file-name)) " --template list")))

# :ide: COMPILE: Run with --verbose --implode
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) "  --verbose --implode")))

# :ide: COMPILE: Run with --documentation
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --documentation")))

# :ide: COMPILE: make ftp
# . (progn (save-buffer) (compile (concat "make -k ftp")))

# :ide: COMPILE: Run with --verbose --extract
# . (progn (save-buffer) (shell-command "rm -f README.txt doc/index.rst") (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) "  --verbose --extract")))

# :ide: COMPILE: Run with --verbose --template README.txt
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --verbose --template README.txt")))

# :ide: COMPILE: Run with --template list
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --template list")))

# :ide: COMPILE: Run with --eide #
# . (progn (save-buffer) (shell-command (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --eide '#'") (concat "*templates: " (file-name-nondirectory (buffer-file-name)) "*")))

# :ide: COMPILE: Run with --expected
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --expected")))

# :ide: COMPILE: make doc
# . (progn (save-buffer) (compile (concat "make doc")))

# :ide: COMPILE: Run with --eide
# . (progn (save-buffer) (shell-command (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --eide") (concat "*templates: " (file-name-nondirectory (buffer-file-name)) "*")))

# :ide: COMPILE: Run with python3 with --test
# . (progn (save-buffer) (compile (concat "python3 ./" (file-name-nondirectory (buffer-file-name)) " --test")))

# :ide: COMPILE: Run with python3 w/o args
# . (progn (save-buffer) (compile (concat "python3 ./" (file-name-nondirectory (buffer-file-name)) " ")))

# :ide: COMPILE: Run with --test
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --test")))

# :ide: COMPILE: Run with --verbose
# . (progn (save-buffer) (compile (concat "python ./" (file-name-nondirectory (buffer-file-name)) " --verbose")))

# :ide: +-#+
# . Compile ()

#
# Local Variables:
# mode: python
# comment-start: "#"
# comment-start-skip: "#+"
# comment-column: 0
# truncate-lines: t
# End:
