Full Code of downpoured/vipercard for AI

main d65d29a08242 cached
821 files
25.2 MB
2.6M tokens
3915 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (10,402K chars total). Download the full file to get everything.
Repository: downpoured/vipercard
Branch: main
Commit: d65d29a08242
Files: 821
Total size: 25.2 MB

Directory structure:
gitextract_cc7lxjo_/

├── README.md
└── vipercard/
    ├── .gitignore
    ├── LICENSE
    ├── building.md
    ├── doc/
    │   ├── gendocs.py
    │   ├── gendocs_to_md.py
    │   ├── gendocs_tovipercard.py
    │   ├── libraries.txt
    │   ├── page_404.md
    │   ├── page_terms.md
    │   ├── page_video.md
    │   ├── page_video1.md
    │   ├── page_video2.md
    │   ├── page_video3.md
    │   ├── page_why.md
    │   ├── readme.md
    │   ├── reference_01_overview
    │   ├── reference_01_overview.md
    │   ├── reference_02_commands
    │   ├── reference_02_commands.md
    │   ├── reference_03_syntax
    │   ├── reference_03_syntax.md
    │   ├── reference_04_properties
    │   ├── reference_04_properties.md
    │   ├── reference_05_functions
    │   ├── reference_05_functions.md
    │   ├── reference_06_events
    │   ├── reference_06_events.md
    │   ├── reference_07_compatibility
    │   └── reference_07_compatibility.md
    └── vipercard/
        ├── .eslintrc.js
        ├── .gitignore
        ├── .prettierrc.js
        ├── .prettierrc_longer.js
        ├── .vscode/
        │   ├── launch.json
        │   ├── settings.json
        │   └── tasks.json
        ├── 0.3/
        │   ├── html/
        │   │   ├── 404.html
        │   │   ├── script_reference/
        │   │   │   ├── github-markdown.css
        │   │   │   ├── reference_01_overview.html
        │   │   │   ├── reference_02_commands.html
        │   │   │   ├── reference_03_syntax.html
        │   │   │   ├── reference_04_properties.html
        │   │   │   ├── reference_05_functions.html
        │   │   │   ├── reference_06_events.html
        │   │   │   ├── reference_07_compatibility.html
        │   │   │   └── smalltheme.css
        │   │   ├── terms.html
        │   │   ├── video.html
        │   │   ├── video1.html
        │   │   ├── video2.html
        │   │   ├── video3.html
        │   │   └── why.html
        │   ├── index.dev.html
        │   └── style.css
        ├── BingSiteAuth.xml
        ├── external/
        │   ├── FileSaver.js-2.0.2/
        │   │   ├── CHANGELOG.md
        │   │   ├── FileSaver.d.ts
        │   │   ├── FileSaver.js
        │   │   ├── LICENSE.md
        │   │   └── README.md
        │   ├── base64-js-1.3.1/
        │   │   ├── LICENSE
        │   │   ├── README.md
        │   │   └── base64js.js
        │   ├── bowser-2.9/
        │   │   ├── LICENSE
        │   │   ├── README.md
        │   │   ├── bowser-2.9-bundled.js
        │   │   └── bowser.d.ts
        │   ├── chevrotain-6.5.0/
        │   │   ├── LICENSE.txt
        │   │   ├── README.md
        │   │   ├── chevrotain.js
        │   │   └── chevrotaintyping.d.ts
        │   ├── clipboard.js-2.0.6-notbundled/
        │   │   ├── LICENSE
        │   │   ├── clipboard.js
        │   │   └── readme.md
        │   ├── easyfilter-notbundled/
        │   │   ├── (already in typescript)
        │   │   ├── LICENSE
        │   │   └── bresenham.js
        │   ├── externaldelaybundlebig.js
        │   ├── externaldelaybundlemin.js
        │   ├── externalmanualbundlebig.js
        │   ├── externalmanualbundlemin.js
        │   ├── golly/
        │   │   ├── golly.js
        │   │   ├── golly.txt
        │   │   └── license.txt
        │   ├── js-lru/
        │   │   ├── js-lru.d.ts
        │   │   ├── js-lru.js
        │   │   └── license.txt
        │   ├── jsgif-dynamic/
        │   │   ├── (loaded dynamically)
        │   │   ├── LICENSE
        │   │   ├── jsgif.txt
        │   │   ├── jsgifcombined.js
        │   │   └── modified_to_expose_getblob.txt
        │   ├── lz-string-1.4.4/
        │   │   ├── LICENSE.txt
        │   │   ├── README.md
        │   │   ├── base64-string.js
        │   │   ├── lz-string.js
        │   │   └── lzstring.d.ts
        │   ├── manualbundle.py
        │   ├── pbkdf2/
        │   │   └── pbkdf2.txt
        │   ├── pizzicato-dynamic/
        │   │   ├── LICENSE
        │   │   ├── Pizzicato.js
        │   │   └── README.md
        │   └── text-encoding-types-notbundled/
        │       ├── index.d.ts
        │       └── license.txt
        ├── index.html
        ├── package.json
        ├── resources03a/
        │   ├── docs/
        │   │   ├── demo_anim.json
        │   │   ├── demo_game.json
        │   │   ├── demo_glider.json
        │   │   ├── demo_graphics.json
        │   │   ├── demo_spacegame.json
        │   │   ├── refcommands.json
        │   │   ├── refcompatibility.json
        │   │   ├── refevents.json
        │   │   ├── reffunctions.json
        │   │   ├── refoverview.json
        │   │   ├── refproperties.json
        │   │   └── refsyntax.json
        │   ├── fonts/
        │   │   ├── 00_10_+b+iu+osdce.json
        │   │   ├── 00_10_+b+iuosdce.json
        │   │   ├── 00_10_+biu+osdce.json
        │   │   ├── 00_10_+biuosdce.json
        │   │   ├── 00_10_b+iu+osdce.json
        │   │   ├── 00_10_b+iuosdce.json
        │   │   ├── 00_10_biu+osdce.json
        │   │   ├── 00_10_biuosdce.json
        │   │   ├── 00_12_+b+iu+osdce.json
        │   │   ├── 00_12_+b+iuosdce.json
        │   │   ├── 00_12_+biu+osdce.json
        │   │   ├── 00_12_+biuosdce.json
        │   │   ├── 00_12_b+iu+osdce.json
        │   │   ├── 00_12_b+iuosdce.json
        │   │   ├── 00_12_biu+osdce.json
        │   │   ├── 00_12_biuos+dce.json
        │   │   ├── 00_12_biuosdce.json
        │   │   ├── 00_14_+b+iu+osdce.json
        │   │   ├── 00_14_+b+iuosdce.json
        │   │   ├── 00_14_+biu+osdce.json
        │   │   ├── 00_14_+biuosdce.json
        │   │   ├── 00_14_b+iu+osdce.json
        │   │   ├── 00_14_b+iuosdce.json
        │   │   ├── 00_14_biu+osdce.json
        │   │   ├── 00_14_biuosdce.json
        │   │   ├── 00_18_+b+iu+osdce.json
        │   │   ├── 00_18_+b+iuosdce.json
        │   │   ├── 00_18_+biu+osdce.json
        │   │   ├── 00_18_+biuosdce.json
        │   │   ├── 00_18_b+iu+osdce.json
        │   │   ├── 00_18_b+iuosdce.json
        │   │   ├── 00_18_biu+osdce.json
        │   │   ├── 00_18_biuosdce.json
        │   │   ├── 00_24_+b+iu+osdce.json
        │   │   ├── 00_24_+b+iuosdce.json
        │   │   ├── 00_24_+biu+osdce.json
        │   │   ├── 00_24_+biuosdce.json
        │   │   ├── 00_24_b+iu+osdce.json
        │   │   ├── 00_24_b+iuosdce.json
        │   │   ├── 00_24_biu+osdce.json
        │   │   ├── 00_24_biuosdce.json
        │   │   ├── 00_9_+b+iu+osdce.json
        │   │   ├── 00_9_+b+iuosdce.json
        │   │   ├── 00_9_+biu+osdce.json
        │   │   ├── 00_9_+biuosdce.json
        │   │   ├── 00_9_b+iu+osdce.json
        │   │   ├── 00_9_b+iuosdce.json
        │   │   ├── 00_9_biu+osdce.json
        │   │   ├── 00_9_biuosdce.json
        │   │   ├── 01_10_+b+iu+osdce.json
        │   │   ├── 01_10_+b+iuosdce.json
        │   │   ├── 01_10_+biu+osdce.json
        │   │   ├── 01_10_+biuosdce.json
        │   │   ├── 01_10_b+iu+osdce.json
        │   │   ├── 01_10_b+iuosdce.json
        │   │   ├── 01_10_biu+osdce.json
        │   │   ├── 01_10_biuosdce.json
        │   │   ├── 01_12_+b+iu+osdce.json
        │   │   ├── 01_12_+b+iuosdce.json
        │   │   ├── 01_12_+biu+osdce.json
        │   │   ├── 01_12_+biuosdce.json
        │   │   ├── 01_12_b+iu+osdce.json
        │   │   ├── 01_12_b+iuosdce.json
        │   │   ├── 01_12_biu+osdce.json
        │   │   ├── 01_12_biuosdce.json
        │   │   ├── 01_14_+b+iu+osdce.json
        │   │   ├── 01_14_+b+iuosdce.json
        │   │   ├── 01_14_+biu+osdce.json
        │   │   ├── 01_14_+biuosdce.json
        │   │   ├── 01_14_b+iu+osdce.json
        │   │   ├── 01_14_b+iuosdce.json
        │   │   ├── 01_14_biu+osdce.json
        │   │   ├── 01_14_biuosdce.json
        │   │   ├── 01_18_+b+iu+osdce.json
        │   │   ├── 01_18_+b+iuosdce.json
        │   │   ├── 01_18_+biu+osdce.json
        │   │   ├── 01_18_+biuosdce.json
        │   │   ├── 01_18_b+iu+osdce.json
        │   │   ├── 01_18_b+iuosdce.json
        │   │   ├── 01_18_biu+osdce.json
        │   │   ├── 01_18_biuosdce.json
        │   │   ├── 01_24_+b+iu+osdce.json
        │   │   ├── 01_24_+b+iuosdce.json
        │   │   ├── 01_24_+biu+osdce.json
        │   │   ├── 01_24_+biuosdce.json
        │   │   ├── 01_24_b+iu+osdce.json
        │   │   ├── 01_24_b+iuosdce.json
        │   │   ├── 01_24_biu+osdce.json
        │   │   ├── 01_24_biuosdce.json
        │   │   ├── 01_9_+b+iu+osdce.json
        │   │   ├── 01_9_+b+iuosdce.json
        │   │   ├── 01_9_+biu+osdce.json
        │   │   ├── 01_9_+biuosdce.json
        │   │   ├── 01_9_b+iu+osdce.json
        │   │   ├── 01_9_b+iuosdce.json
        │   │   ├── 01_9_biu+osdce.json
        │   │   ├── 01_9_biuosdce.json
        │   │   ├── 02_10_+b+iu+osdce.json
        │   │   ├── 02_10_+b+iuosdce.json
        │   │   ├── 02_10_+biu+osdce.json
        │   │   ├── 02_10_+biuosdce.json
        │   │   ├── 02_10_b+iu+osdce.json
        │   │   ├── 02_10_b+iuosdce.json
        │   │   ├── 02_10_biu+osdce.json
        │   │   ├── 02_10_biuosdce.json
        │   │   ├── 02_12_+b+iu+osdce.json
        │   │   ├── 02_12_+b+iuosdce.json
        │   │   ├── 02_12_+biu+osdce.json
        │   │   ├── 02_12_+biuosdce.json
        │   │   ├── 02_12_b+iu+osdce.json
        │   │   ├── 02_12_b+iuosdce.json
        │   │   ├── 02_12_biu+osdce.json
        │   │   ├── 02_12_biuosdce.json
        │   │   ├── 02_14_+b+iu+osdce.json
        │   │   ├── 02_14_+b+iuosdce.json
        │   │   ├── 02_14_+biu+osdce.json
        │   │   ├── 02_14_+biuosdce.json
        │   │   ├── 02_14_b+iu+osdce.json
        │   │   ├── 02_14_b+iuosdce.json
        │   │   ├── 02_14_biu+osdce.json
        │   │   ├── 02_14_biuosdce.json
        │   │   ├── 02_18_+b+iu+osdce.json
        │   │   ├── 02_18_+b+iuosdce.json
        │   │   ├── 02_18_+biu+osdce.json
        │   │   ├── 02_18_+biuosdce.json
        │   │   ├── 02_18_b+iu+osdce.json
        │   │   ├── 02_18_b+iuosdce.json
        │   │   ├── 02_18_biu+osdce.json
        │   │   ├── 02_18_biuosdce.json
        │   │   ├── 02_24_+b+iu+osdce.json
        │   │   ├── 02_24_+b+iuosdce.json
        │   │   ├── 02_24_+biu+osdce.json
        │   │   ├── 02_24_+biuosdce.json
        │   │   ├── 02_24_b+iu+osdce.json
        │   │   ├── 02_24_b+iuosdce.json
        │   │   ├── 02_24_biu+osdce.json
        │   │   ├── 02_24_biuosdce.json
        │   │   ├── 02_9_+b+iu+osdce.json
        │   │   ├── 02_9_+b+iuosdce.json
        │   │   ├── 02_9_+biu+osdce.json
        │   │   ├── 02_9_+biuosdce.json
        │   │   ├── 02_9_b+iu+osdce.json
        │   │   ├── 02_9_b+iuosdce.json
        │   │   ├── 02_9_biu+osdce.json
        │   │   ├── 02_9_biuos+dce.json
        │   │   ├── 02_9_biuosdce.json
        │   │   ├── 03_10_+b+iu+osdce.json
        │   │   ├── 03_10_+b+iuosdce.json
        │   │   ├── 03_10_+biu+osdce.json
        │   │   ├── 03_10_+biuosdce.json
        │   │   ├── 03_10_b+iu+osdce.json
        │   │   ├── 03_10_b+iuosdce.json
        │   │   ├── 03_10_biu+osdce.json
        │   │   ├── 03_10_biuosdce.json
        │   │   ├── 03_12_+b+iu+osdce.json
        │   │   ├── 03_12_+b+iuosdce.json
        │   │   ├── 03_12_+biu+osdce.json
        │   │   ├── 03_12_+biuosdce.json
        │   │   ├── 03_12_b+iu+osdce.json
        │   │   ├── 03_12_b+iuosdce.json
        │   │   ├── 03_12_biu+osdce.json
        │   │   ├── 03_12_biuosdce.json
        │   │   ├── 03_14_+b+iu+osdce.json
        │   │   ├── 03_14_+b+iuosdce.json
        │   │   ├── 03_14_+biu+osdce.json
        │   │   ├── 03_14_+biuosdce.json
        │   │   ├── 03_14_b+iu+osdce.json
        │   │   ├── 03_14_b+iuosdce.json
        │   │   ├── 03_14_biu+osdce.json
        │   │   ├── 03_14_biuosdce.json
        │   │   ├── 03_18_+b+iu+osdce.json
        │   │   ├── 03_18_+b+iuosdce.json
        │   │   ├── 03_18_+biu+osdce.json
        │   │   ├── 03_18_+biuosdce.json
        │   │   ├── 03_18_b+iu+osdce.json
        │   │   ├── 03_18_b+iuosdce.json
        │   │   ├── 03_18_biu+osdce.json
        │   │   ├── 03_18_biuosdce.json
        │   │   ├── 03_24_+b+iu+osdce.json
        │   │   ├── 03_24_+b+iuosdce.json
        │   │   ├── 03_24_+biu+osdce.json
        │   │   ├── 03_24_+biuosdce.json
        │   │   ├── 03_24_b+iu+osdce.json
        │   │   ├── 03_24_b+iuosdce.json
        │   │   ├── 03_24_biu+osdce.json
        │   │   ├── 03_24_biuosdce.json
        │   │   ├── 03_9_+b+iu+osdce.json
        │   │   ├── 03_9_+b+iuosdce.json
        │   │   ├── 03_9_+biu+osdce.json
        │   │   ├── 03_9_+biuosdce.json
        │   │   ├── 03_9_b+iu+osdce.json
        │   │   ├── 03_9_b+iuosdce.json
        │   │   ├── 03_9_biu+osdce.json
        │   │   ├── 03_9_biuosdce.json
        │   │   ├── 04_10_+b+iu+osdce.json
        │   │   ├── 04_10_+b+iuosdce.json
        │   │   ├── 04_10_+biu+osdce.json
        │   │   ├── 04_10_+biuosdce.json
        │   │   ├── 04_10_b+iu+osdce.json
        │   │   ├── 04_10_b+iuosdce.json
        │   │   ├── 04_10_biu+osdce.json
        │   │   ├── 04_10_biuosdce.json
        │   │   ├── 04_12_+b+iu+osdce.json
        │   │   ├── 04_12_+b+iuosdce.json
        │   │   ├── 04_12_+biu+osdce.json
        │   │   ├── 04_12_+biuosdce.json
        │   │   ├── 04_12_b+iu+osdce.json
        │   │   ├── 04_12_b+iuosdce.json
        │   │   ├── 04_12_biu+osdce.json
        │   │   ├── 04_12_biuosdce.json
        │   │   ├── 04_14_+b+iu+osdce.json
        │   │   ├── 04_14_+b+iuosdce.json
        │   │   ├── 04_14_+biu+osdce.json
        │   │   ├── 04_14_+biuosdce.json
        │   │   ├── 04_14_b+iu+osdce.json
        │   │   ├── 04_14_b+iuosdce.json
        │   │   ├── 04_14_biu+osdce.json
        │   │   ├── 04_14_biuosdce.json
        │   │   ├── 04_18_+b+iu+osdce.json
        │   │   ├── 04_18_+b+iuosdce.json
        │   │   ├── 04_18_+biu+osdce.json
        │   │   ├── 04_18_+biuosdce.json
        │   │   ├── 04_18_b+iu+osdce.json
        │   │   ├── 04_18_b+iuosdce.json
        │   │   ├── 04_18_biu+osdce.json
        │   │   ├── 04_18_biuosdce.json
        │   │   ├── 04_24_+b+iu+osdce.json
        │   │   ├── 04_24_+b+iuosdce.json
        │   │   ├── 04_24_+biu+osdce.json
        │   │   ├── 04_24_+biuosdce.json
        │   │   ├── 04_24_b+iu+osdce.json
        │   │   ├── 04_24_b+iuosdce.json
        │   │   ├── 04_24_biu+osdce.json
        │   │   ├── 04_24_biuosdce.json
        │   │   ├── 04_9_+b+iu+osdce.json
        │   │   ├── 04_9_+b+iuosdce.json
        │   │   ├── 04_9_+biu+osdce.json
        │   │   ├── 04_9_+biuosdce.json
        │   │   ├── 04_9_b+iu+osdce.json
        │   │   ├── 04_9_b+iuosdce.json
        │   │   ├── 04_9_biu+osdce.json
        │   │   ├── 04_9_biuosdce.json
        │   │   ├── 05_10_+b+iu+osdce.json
        │   │   ├── 05_10_+b+iuosdce.json
        │   │   ├── 05_10_+biu+osdce.json
        │   │   ├── 05_10_+biuosdce.json
        │   │   ├── 05_10_b+iu+osdce.json
        │   │   ├── 05_10_b+iuosdce.json
        │   │   ├── 05_10_biu+osdce.json
        │   │   ├── 05_10_biuosdce.json
        │   │   ├── 05_12_+b+iu+osdce.json
        │   │   ├── 05_12_+b+iuosdce.json
        │   │   ├── 05_12_+biu+osdce.json
        │   │   ├── 05_12_+biuosdce.json
        │   │   ├── 05_12_b+iu+osdce.json
        │   │   ├── 05_12_b+iuosdce.json
        │   │   ├── 05_12_biu+osdce.json
        │   │   ├── 05_12_biuosdce.json
        │   │   ├── 05_14_+b+iu+osdce.json
        │   │   ├── 05_14_+b+iuosdce.json
        │   │   ├── 05_14_+biu+osdce.json
        │   │   ├── 05_14_+biuosdce.json
        │   │   ├── 05_14_b+iu+osdce.json
        │   │   ├── 05_14_b+iuosdce.json
        │   │   ├── 05_14_biu+osdce.json
        │   │   ├── 05_14_biuosdce.json
        │   │   ├── 05_18_+b+iu+osdce.json
        │   │   ├── 05_18_+b+iuosdce.json
        │   │   ├── 05_18_+biu+osdce.json
        │   │   ├── 05_18_+biuosdce.json
        │   │   ├── 05_18_b+iu+osdce.json
        │   │   ├── 05_18_b+iuosdce.json
        │   │   ├── 05_18_biu+osdce.json
        │   │   ├── 05_18_biuosdce.json
        │   │   ├── 05_24_+b+iu+osdce.json
        │   │   ├── 05_24_+b+iuosdce.json
        │   │   ├── 05_24_+biu+osdce.json
        │   │   ├── 05_24_+biuosdce.json
        │   │   ├── 05_24_b+iu+osdce.json
        │   │   ├── 05_24_b+iuosdce.json
        │   │   ├── 05_24_biu+osdce.json
        │   │   ├── 05_24_biuosdce.json
        │   │   ├── 05_9_+b+iu+osdce.json
        │   │   ├── 05_9_+b+iuosdce.json
        │   │   ├── 05_9_+biu+osdce.json
        │   │   ├── 05_9_+biuosdce.json
        │   │   ├── 05_9_b+iu+osdce.json
        │   │   ├── 05_9_b+iuosdce.json
        │   │   ├── 05_9_biu+osdce.json
        │   │   ├── 05_9_biuosdce.json
        │   │   ├── 06_10_+b+iu+osdce.json
        │   │   ├── 06_10_+b+iuosdce.json
        │   │   ├── 06_10_+biu+osdce.json
        │   │   ├── 06_10_+biuosdce.json
        │   │   ├── 06_10_b+iu+osdce.json
        │   │   ├── 06_10_b+iuosdce.json
        │   │   ├── 06_10_biu+osdce.json
        │   │   ├── 06_10_biuosdce.json
        │   │   ├── 06_12_+b+iu+osdce.json
        │   │   ├── 06_12_+b+iuosdce.json
        │   │   ├── 06_12_+biu+osdce.json
        │   │   ├── 06_12_+biuosdce.json
        │   │   ├── 06_12_b+iu+osdce.json
        │   │   ├── 06_12_b+iuosdce.json
        │   │   ├── 06_12_biu+osdce.json
        │   │   ├── 06_12_biuosdce.json
        │   │   ├── 06_14_+b+iu+osdce.json
        │   │   ├── 06_14_+b+iuosdce.json
        │   │   ├── 06_14_+biu+osdce.json
        │   │   ├── 06_14_+biuosdce.json
        │   │   ├── 06_14_b+iu+osdce.json
        │   │   ├── 06_14_b+iuosdce.json
        │   │   ├── 06_14_biu+osdce.json
        │   │   ├── 06_14_biuosdce.json
        │   │   ├── 06_18_+b+iu+osdce.json
        │   │   ├── 06_18_+b+iuosdce.json
        │   │   ├── 06_18_+biu+osdce.json
        │   │   ├── 06_18_+biuosdce.json
        │   │   ├── 06_18_b+iu+osdce.json
        │   │   ├── 06_18_b+iuosdce.json
        │   │   ├── 06_18_biu+osdce.json
        │   │   ├── 06_18_biuosdce.json
        │   │   ├── 06_24_+b+iu+osdce.json
        │   │   ├── 06_24_+b+iuosdce.json
        │   │   ├── 06_24_+biu+osdce.json
        │   │   ├── 06_24_+biuosdce.json
        │   │   ├── 06_24_b+iu+osdce.json
        │   │   ├── 06_24_b+iuosdce.json
        │   │   ├── 06_24_biu+osdce.json
        │   │   ├── 06_24_biuosdce.json
        │   │   ├── 06_9_+b+iu+osdce.json
        │   │   ├── 06_9_+b+iuosdce.json
        │   │   ├── 06_9_+biu+osdce.json
        │   │   ├── 06_9_+biuosdce.json
        │   │   ├── 06_9_b+iu+osdce.json
        │   │   ├── 06_9_b+iuosdce.json
        │   │   ├── 06_9_biu+osdce.json
        │   │   ├── 06_9_biuosdce.json
        │   │   ├── 07_10_+b+iu+osdce.json
        │   │   ├── 07_10_+b+iuosdce.json
        │   │   ├── 07_10_+biu+osdce.json
        │   │   ├── 07_10_+biuosdce.json
        │   │   ├── 07_10_b+iu+osdce.json
        │   │   ├── 07_10_b+iuosdce.json
        │   │   ├── 07_10_biu+osdce.json
        │   │   ├── 07_10_biuosdce.json
        │   │   ├── 07_12_+b+iu+osdce.json
        │   │   ├── 07_12_+b+iuosdce.json
        │   │   ├── 07_12_+biu+osdce.json
        │   │   ├── 07_12_+biuosdce.json
        │   │   ├── 07_12_b+iu+osdce.json
        │   │   ├── 07_12_b+iuosdce.json
        │   │   ├── 07_12_biu+osdce.json
        │   │   ├── 07_12_biuosdce.json
        │   │   ├── 07_14_+b+iu+osdce.json
        │   │   ├── 07_14_+b+iuosdce.json
        │   │   ├── 07_14_+biu+osdce.json
        │   │   ├── 07_14_+biuosdce.json
        │   │   ├── 07_14_b+iu+osdce.json
        │   │   ├── 07_14_b+iuosdce.json
        │   │   ├── 07_14_biu+osdce.json
        │   │   ├── 07_14_biuosdce.json
        │   │   ├── 07_18_+b+iu+osdce.json
        │   │   ├── 07_18_+b+iuosdce.json
        │   │   ├── 07_18_+biu+osdce.json
        │   │   ├── 07_18_+biuosdce.json
        │   │   ├── 07_18_b+iu+osdce.json
        │   │   ├── 07_18_b+iuosdce.json
        │   │   ├── 07_18_biu+osdce.json
        │   │   ├── 07_18_biuosdce.json
        │   │   ├── 07_1_biuosdce.json
        │   │   ├── 07_24_+b+iu+osdce.json
        │   │   ├── 07_24_+b+iuosdce.json
        │   │   ├── 07_24_+biu+osdce.json
        │   │   ├── 07_24_+biuosdce.json
        │   │   ├── 07_24_b+iu+osdce.json
        │   │   ├── 07_24_b+iuosdce.json
        │   │   ├── 07_24_biu+osdce.json
        │   │   ├── 07_24_biuosdce.json
        │   │   ├── 07_9_+b+iu+osdce.json
        │   │   ├── 07_9_+b+iuosdce.json
        │   │   ├── 07_9_+biu+osdce.json
        │   │   ├── 07_9_+biuosdce.json
        │   │   ├── 07_9_b+iu+osdce.json
        │   │   ├── 07_9_b+iuosdce.json
        │   │   ├── 07_9_biu+osdce.json
        │   │   └── 07_9_biuosdce.json
        │   ├── intro/
        │   │   ├── introjs.js
        │   │   ├── script_reference/
        │   │   │   └── github-markdown.css
        │   │   └── style.css
        │   ├── sound/
        │   │   ├── sound.m4a
        │   │   └── sound.ogg
        │   └── test/
        │       ├── prevVersionStacks/
        │       │   ├── demo_anim.json
        │       │   ├── demo_game.json
        │       │   ├── demo_glider.json
        │       │   ├── demo_graphics.json
        │       │   ├── demo_spacegame.json
        │       │   ├── ref_commands.json
        │       │   ├── ref_event_handlers.json
        │       │   ├── ref_functions.json
        │       │   ├── ref_fundamentals.json
        │       │   └── ref_properties.json
        │       ├── testScriptExtensiveChunkTests.txt
        │       ├── testScriptExtensiveConditionalsCollateral.txt
        │       └── testScriptExtensiveConditionalsExpected.txt
        ├── src/
        │   ├── bridge/
        │   │   ├── bridgeBase64Js.ts
        │   │   ├── bridgeBrowserInfo.ts
        │   │   ├── bridgeChevrotain.ts
        │   │   ├── bridgeFileSaver.ts
        │   │   ├── bridgeJsGif.ts
        │   │   ├── bridgeJsLru.ts
        │   │   ├── bridgeLzString.ts
        │   │   ├── bridgePbkdf2.ts
        │   │   ├── bridgePizzicato.ts
        │   │   └── bridgeTextEncoding.ts
        │   ├── internaldocs.md
        │   ├── layers.cfg
        │   ├── test/
        │   │   ├── in-app-tests/
        │   │   │   ├── card1.script
        │   │   │   ├── card4.script
        │   │   │   ├── card4btn.script
        │   │   │   ├── inapptest.json
        │   │   │   ├── stackscript.script
        │   │   │   └── undotest.script
        │   │   ├── testUtils/
        │   │   │   ├── testTop.ts
        │   │   │   ├── testUtils.ts
        │   │   │   └── testUtilsCanvas.ts
        │   │   ├── ui512demo/
        │   │   │   ├── uiDemoBasic.ts
        │   │   │   ├── uiDemoButtons.ts
        │   │   │   ├── uiDemoComposites.ts
        │   │   │   ├── uiDemoMenus.ts
        │   │   │   ├── uiDemoPaint.ts
        │   │   │   ├── uiDemoText.ts
        │   │   │   └── uiDemoTextEdit.ts
        │   │   ├── util512/
        │   │   │   ├── testExternalLibs.ts
        │   │   │   ├── testUtil512.ts
        │   │   │   ├── testUtil512Assert.ts
        │   │   │   ├── testUtil512Class.ts
        │   │   │   ├── testUtil512Higher.ts
        │   │   │   ├── testUtilsCanvasWrapper.ts
        │   │   │   └── testUtilsDraw.ts
        │   │   ├── util512ui/
        │   │   │   ├── testUI512CodeEditor.ts
        │   │   │   ├── testUI512Composites.ts
        │   │   │   ├── testUI512DrawText.ts
        │   │   │   ├── testUI512Elements.ts
        │   │   │   ├── testUI512ElementsViewButtons.ts
        │   │   │   ├── testUI512FormattedText.ts
        │   │   │   ├── testUI512MenuRender.ts
        │   │   │   ├── testUI512Paint.ts
        │   │   │   ├── testUI512PaintFlood.ts
        │   │   │   ├── testUI512TextEdit.ts
        │   │   │   ├── testUI512TextEditInteractions.ts
        │   │   │   ├── testUI512TextModify.ts
        │   │   │   └── testUI512TextSelectEvents.ts
        │   │   ├── vpc/
        │   │   │   ├── vpcTestChunkResolution.ts
        │   │   │   ├── vpcTestElements.ts
        │   │   │   ├── vpcTestScriptEval.ts
        │   │   │   ├── vpcTestScriptExprLvl.ts
        │   │   │   ├── vpcTestScriptExtensiveChunk.ts
        │   │   │   ├── vpcTestScriptExtensiveIf.ts
        │   │   │   ├── vpcTestScriptParseCmd.ts
        │   │   │   ├── vpcTestScriptParseExpr.ts
        │   │   │   ├── vpcTestScriptRewrites.ts
        │   │   │   ├── vpcTestScriptRunBase.ts
        │   │   │   ├── vpcTestScriptRunCmd.ts
        │   │   │   ├── vpcTestScriptRunCustomFns.ts
        │   │   │   ├── vpcTestScriptRunSyntax.ts
        │   │   │   ├── vpcTestVpcVal.ts
        │   │   │   ├── vpcuiTestIntroProvider.ts
        │   │   │   └── vpcuiTestMsgBox.ts
        │   │   └── vpc03/
        │   │       ├── cmds/
        │   │       │   └── test03go.ts
        │   │       ├── fns/
        │   │       │   └── test03standalone.ts
        │   │       ├── props/
        │   │       │   ├── test03chunk.ts
        │   │       │   └── test03computed.ts
        │   │       ├── test03chunkAdditional.ts
        │   │       ├── test03chunkBasic.ts
        │   │       ├── test03exprObjectRef.ts
        │   │       ├── test03exprPseudoObjects.ts
        │   │       ├── test03lexer.ts
        │   │       └── test03objectRenderName.ts
        │   ├── ui512/
        │   │   ├── composites/
        │   │   │   ├── ui512ButtonGroup.ts
        │   │   │   ├── ui512CodeEditor.ts
        │   │   │   ├── ui512CodeEditorAutoIndent.ts
        │   │   │   ├── ui512Composites.ts
        │   │   │   ├── ui512ModalDialog.ts
        │   │   │   └── ui512Toolbox.ts
        │   │   ├── draw/
        │   │   │   ├── ui512DrawBorders.ts
        │   │   │   ├── ui512DrawIconClasses.ts
        │   │   │   ├── ui512DrawIconManager.ts
        │   │   │   ├── ui512DrawPaintDispatch.ts
        │   │   │   ├── ui512DrawPainter.ts
        │   │   │   ├── ui512DrawPainterClasses.ts
        │   │   │   ├── ui512DrawPatterns.ts
        │   │   │   ├── ui512ImageCollection.ts
        │   │   │   ├── ui512ImageDissolve.ts
        │   │   │   ├── ui512ImageSerialization.ts
        │   │   │   └── ui512Interfaces.ts
        │   │   ├── drawtext/
        │   │   │   ├── ui512ComplexFontChanges.ts
        │   │   │   ├── ui512DrawText.ts
        │   │   │   ├── ui512DrawTextArgs.ts
        │   │   │   ├── ui512DrawTextChar.ts
        │   │   │   ├── ui512DrawTextCharGrayed.ts
        │   │   │   ├── ui512DrawTextClasses.ts
        │   │   │   ├── ui512DrawTextFontRequest.ts
        │   │   │   ├── ui512FormattedText.ts
        │   │   │   └── ui512TranslateCharset.ts
        │   │   ├── elements/
        │   │   │   ├── ui512Element.ts
        │   │   │   ├── ui512ElementApp.ts
        │   │   │   ├── ui512ElementButton.ts
        │   │   │   ├── ui512ElementCanvasPiece.ts
        │   │   │   ├── ui512ElementGettable.ts
        │   │   │   ├── ui512ElementGroup.ts
        │   │   │   ├── ui512ElementLabel.ts
        │   │   │   ├── ui512ElementMenu.ts
        │   │   │   ├── ui512ElementTextField.ts
        │   │   │   └── ui512ElementView.ts
        │   │   ├── lang/
        │   │   │   └── langBase.ts
        │   │   ├── menu/
        │   │   │   ├── ui512Events.ts
        │   │   │   ├── ui512MenuAnimation.ts
        │   │   │   ├── ui512MenuListeners.ts
        │   │   │   ├── ui512MenuPositioning.ts
        │   │   │   ├── ui512PresenterWithMenu.ts
        │   │   │   └── ui512SuspendEvents.ts
        │   │   ├── presentation/
        │   │   │   ├── ui512Presenter.ts
        │   │   │   └── ui512PresenterBase.ts
        │   │   ├── root/
        │   │   │   ├── rootSetupHelpers.ts
        │   │   │   ├── rootStartCanvas.ts
        │   │   │   └── rootUI512.ts
        │   │   ├── textedit/
        │   │   │   ├── ui512BasicHandlers.ts
        │   │   │   ├── ui512ClipManager.ts
        │   │   │   ├── ui512GenericField.ts
        │   │   │   ├── ui512Scrollbar.ts
        │   │   │   ├── ui512TextEvents.ts
        │   │   │   ├── ui512TextLines.ts
        │   │   │   ├── ui512TextSelModify.ts
        │   │   │   └── ui512TextSelModifyImpl.ts
        │   │   └── utils/
        │   │       ├── util512.ts
        │   │       ├── util512Assert.ts
        │   │       ├── util512Base.ts
        │   │       ├── util512Higher.ts
        │   │       ├── util512Serialize.ts
        │   │       ├── utilsCanvasDraw.ts
        │   │       ├── utilsCursors.ts
        │   │       ├── utilsDrawConstants.ts
        │   │       └── utilsKeypressHelpers.ts
        │   ├── vpc/
        │   │   ├── codeexec/
        │   │   │   ├── vpcScriptCaches.ts
        │   │   │   ├── vpcScriptExecAsync.ts
        │   │   │   ├── vpcScriptExecFrame.ts
        │   │   │   ├── vpcScriptExecFrameStack.ts
        │   │   │   ├── vpcScriptExecInternalDirective.ts
        │   │   │   ├── vpcScriptExecStatement.ts
        │   │   │   ├── vpcScriptExecStatementHelpers.ts
        │   │   │   └── vpcScriptExecTop.ts
        │   │   ├── codeparse/
        │   │   │   ├── vpcParser.ts
        │   │   │   ├── vpcTokens.ts
        │   │   │   ├── vpcVisitor.ts
        │   │   │   ├── vpcVisitorInterface.ts
        │   │   │   └── vpcVisitorMixin.ts
        │   │   ├── codepreparse/
        │   │   │   ├── vpcBuiltinFunctions.ts
        │   │   │   ├── vpcBuiltinFunctionsUtils.ts
        │   │   │   ├── vpcCheckReserved.ts
        │   │   │   ├── vpcLineToCodeObj.ts
        │   │   │   ├── vpcPreparseCommon.ts
        │   │   │   ├── vpcProcessBranchAndLoops.ts
        │   │   │   ├── vpcRewritesCommands.ts
        │   │   │   ├── vpcRewritesConditions.ts
        │   │   │   ├── vpcRewritesCustomFunctions.ts
        │   │   │   ├── vpcRewritesGlobal.ts
        │   │   │   ├── vpcRewritesLoops.ts
        │   │   │   └── vpcTopPreparse.ts
        │   │   ├── request/
        │   │   │   ├── vpcRequest.ts
        │   │   │   ├── vpcRequestBase.ts
        │   │   │   └── vpcSigned.ts
        │   │   ├── vel/
        │   │   │   ├── velBase.ts
        │   │   │   ├── velBg.ts
        │   │   │   ├── velButton.ts
        │   │   │   ├── velCard.ts
        │   │   │   ├── velField.ts
        │   │   │   ├── velFieldChangeFont.ts
        │   │   │   ├── velModelTop.ts
        │   │   │   ├── velOutsideInterfaces.ts
        │   │   │   ├── velProductOpts.ts
        │   │   │   ├── velRenderName.ts
        │   │   │   ├── velResolveContainer.ts
        │   │   │   ├── velResolveReference.ts
        │   │   │   ├── velSerialization.ts
        │   │   │   ├── velStack.ts
        │   │   │   └── velStackOrderHelpers.ts
        │   │   └── vpcutils/
        │   │       ├── vpcAudio.ts
        │   │       ├── vpcChunkResolution.ts
        │   │       ├── vpcChunkResolutionSort.ts
        │   │       ├── vpcChunkResolutionUtils.ts
        │   │       ├── vpcEnums.ts
        │   │       ├── vpcInitIcons.ts
        │   │       ├── vpcRequestedReference.ts
        │   │       ├── vpcStandardLibDoMenu.ts
        │   │       ├── vpcStandardLibScript.ts
        │   │       ├── vpcTables.ts
        │   │       ├── vpcUtils.ts
        │   │       ├── vpcVal.ts
        │   │       ├── vpcValEval.ts
        │   │       └── vpcVarCollection.ts
        │   └── vpcui/
        │       ├── intro/
        │       │   ├── vpcInterfaceImpl.ts
        │       │   ├── vpcIntro.ts
        │       │   ├── vpcIntroInterface.ts
        │       │   ├── vpcIntroPageBase.ts
        │       │   ├── vpcIntroPageFirst.ts
        │       │   ├── vpcIntroPageLoading.ts
        │       │   ├── vpcIntroPageOpen.ts
        │       │   ├── vpcIntroPagePickFile.ts
        │       │   └── vpcIntroProvider.ts
        │       ├── menu/
        │       │   ├── vpcAboutDialog.ts
        │       │   ├── vpcAppMenuActions.ts
        │       │   ├── vpcMenu.ts
        │       │   └── vpcMenuStructure.ts
        │       ├── modelrender/
        │       │   ├── vpcGifExport.ts
        │       │   ├── vpcModelRender.ts
        │       │   └── vpcPaintRender.ts
        │       ├── nonmodaldialogs/
        │       │   ├── vpcDocViewer.ts
        │       │   ├── vpcFormLogin.ts
        │       │   ├── vpcFormNewUser.ts
        │       │   ├── vpcFormSendReport.ts
        │       │   ├── vpcLyrNonModalHolder.ts
        │       │   └── vpcReplMessageBox.ts
        │       ├── panels/
        │       │   ├── vpcEditPanelsBase.ts
        │       │   ├── vpcEditPanelsBtn.ts
        │       │   ├── vpcEditPanelsCard.ts
        │       │   ├── vpcEditPanelsEmpty.ts
        │       │   ├── vpcEditPanelsFld.ts
        │       │   ├── vpcEditPanelsStack.ts
        │       │   ├── vpcLyrDragHandles.ts
        │       │   ├── vpcLyrNotification.ts
        │       │   ├── vpcLyrPanels.ts
        │       │   ├── vpcLyrToolbox.ts
        │       │   ├── vpcPanelsInterface.ts
        │       │   ├── vpcScriptEditor.ts
        │       │   ├── vpcToolboxMain.ts
        │       │   ├── vpcToolboxNav.ts
        │       │   └── vpcToolboxPatterns.ts
        │       ├── presentation/
        │       │   ├── vpcInternalDirectiveImpl.ts
        │       │   ├── vpcPresenter.ts
        │       │   ├── vpcPresenterEvents.ts
        │       │   ├── vpcPresenterInit.ts
        │       │   ├── vpcPresenterInterface.ts
        │       │   └── vpcSave.ts
        │       ├── state/
        │       │   ├── vpcCreateOrDelVel.ts
        │       │   ├── vpcInterface.ts
        │       │   ├── vpcOutsideImpl.ts
        │       │   ├── vpcState.ts
        │       │   ├── vpcStateSerialize.ts
        │       │   └── vpcUndo.ts
        │       └── tools/
        │           ├── vpcToolBase.ts
        │           ├── vpcToolBrowse.ts
        │           ├── vpcToolBucket.ts
        │           ├── vpcToolCurve.ts
        │           ├── vpcToolEdit.ts
        │           ├── vpcToolLasso.ts
        │           ├── vpcToolSelect.ts
        │           ├── vpcToolSelectBase.ts
        │           ├── vpcToolShape.ts
        │           ├── vpcToolSmear.ts
        │           └── vpcToolStamp.ts
        ├── tools/
        │   ├── add-assert-markers/
        │   │   ├── assertmarkerutils.py
        │   │   ├── base90.py
        │   │   ├── config.cfg
        │   │   ├── current_assert_id.txt
        │   │   ├── main.py
        │   │   └── readconfig.py
        │   ├── genparse/
        │   │   ├── bgrammar_01.ccc
        │   │   ├── bgrammarcmds_01.ccc
        │   │   ├── list-all.ccc
        │   │   ├── main.py
        │   │   ├── produceparser.py
        │   │   ├── producetokens.py
        │   │   ├── producevisitor.py
        │   │   └── readgrammarinput.py
        │   ├── prettier-except-long-imports/
        │   │   ├── check_for_long_lines.py
        │   │   ├── check_for_null_coalesce.py
        │   │   ├── check_more.py
        │   │   ├── check_tests_referenced.py
        │   │   ├── config.cfg
        │   │   ├── find_missing_comments.py
        │   │   ├── help_fix_long_lines.py
        │   │   ├── main.py
        │   │   ├── place_imports_one_line.py
        │   │   └── readconfig.py
        │   ├── readme.md
        │   ├── releasetools/
        │   │   ├── minify.txt
        │   │   └── release steps.txt
        │   ├── set_tsconfig_flavor.js
        │   └── typescript-super-auto-import/
        │       ├── README.md
        │       ├── config.cfg
        │       ├── main.py
        │       ├── readconfig.py
        │       ├── ts_add_copyright.py
        │       ├── ts_exports_read.py
        │       ├── ts_layers_read.py
        │       └── ts_parsing.py
        ├── tsconfig.development.json
        ├── tsconfig.json
        ├── tsconfig.production.json
        ├── webpack.config.development.js
        └── webpack.config.production.js

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
ViperCard is an open source rewrite of 1987's HyperCard.

You can use it to make animations, games, and interactive art!

This is a community project, all source code is released to the public.

* Try it now at [vipercard.net](https://www.vipercard.net)

* Follow on [twitter](https://twitter.com/vipercarddotnet) and talk about your projects on [google groups](https://groups.google.com/forum/#!forum/vipercard)

* Donate at [donorbox.org](https://donorbox.org/vipercard)

Enjoy!

    ViperCard
    Copyright (C) 2020 Ben Fisher

    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/>.


================================================
FILE: vipercard/.gitignore
================================================


# python

*.pyc
__pycache__/

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history


================================================
FILE: vipercard/LICENSE
================================================
The following files are released under the MIT License:
Copyright 2019 moltenform (Ben Fisher)
  src/ui512/utils/util512.ts
  src/ui512/utils/util512Base.ts
  src/ui512/utils/util512Assert.ts
  src/ui512/utils/util512Higher.ts
  src/test/testUtils/testTop.ts
  src/test/testUtils/testUtils.ts
  src/test/util512/testUtil512.ts
  src/test/util512/testUtil512Assert.ts
  src/test/util512/testUtil512Class.ts
  src/test/util512/testUtil512Higher.ts

All other files are released under the GPLv3 license:
Copyright 2019 moltenform (Ben Fisher)

                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    {one line to give the program's name and a brief idea of what it does.}
    Copyright (C) {year}  {name of author}

    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/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    {project}  Copyright (C) {year}  {fullname}
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: vipercard/building.md
================================================

### How to build ViperCard:

- install node.js

- download vipercard source

- cd to `vipercard/vipercard`

- run `npm install`

- run `npm run start`

- webpack will do its thing, after ~30s of compiling, a browser and vipercard will open

### Running tests

- open the JavaScript console, usually in the brower's 'show development tools'

- click on any button in ViperCard, then press Option+Shift+T

- the test status should be shown, and finally a message like '261/261. all tests pass.'

### Build for production

- Production builds have minified js and fewer breakpoints

- cd to `vipercard/vipercard`

- run `npm run build`

- an output .js file will be written to `./dist`

- make a copy of `index.dev.html` with a new `<script>` at the bottom pointing to the js file

- run a server and open the new html file



================================================
FILE: vipercard/doc/gendocs.py
================================================


# gendocs.py
# Ben Fisher, 2017

import re
import json
import sys
from collections import OrderedDict
import enum

# if documentation needs to have a real ^ or ` character,
# it should use $caret$ or $backtic1$ or $backtic$

sys.path.append('../vipercard/tools/typescript-super-auto-import/bn_python_common.zip')
from bn_python_common import *

def parseSection(txt):
    out = []
    longOnes = re.compile('\n' +'=' * 50 + '*\n')
    pts = re.split(longOnes, txt)
    assertTrue(not pts[0].strip(), 'text outside?', pts[0].strip())
    pts.pop(0) # get rid of any first ones
    if len(pts)%2 != 0:
        assertTrue(False, "uneven start and stop titles?")
    for title, body in takeBatch(pts, 2):
        title = title.strip()
        assertTrue(title.startswith('===='), 'not a title?', title)
        title = title.replace('=', '').strip()
        title = title.replace('___', ' ')
        assertTrue(not '\n' in title, 'title must be one line')
        body = parseBody(body, title)
        if title.strip()[0] == '(':
            shortTitle = title
        else:
            shortTitle = title.split('(')[0]
        
        out.append((shortTitle, title, body))
    return out
    
def parseBody(txt, title):
    # Examples should automatically be given code-formatting
    exfind = '\nExamples:'
    hasExamples = txt.find(exfind)
    if hasExamples!=-1:
        txt = txt[0:hasExamples + len(exfind)] + '\n`' + txt[hasExamples + len(exfind):] + '\n`\n'
    
    # check code-formatting
    # a - 1
    # a`b`c - 3
    # a`b ` c `d `e -5
    assertTrue(len(txt.split('`')) % 2 == 1, "unclosed `?", title)
    # check sub-headers
    assertTrue(len(txt.split('^')) % 2 == 1, "unclosed ^?", title)
    if not txt.endswith('\n'):
        txt+='\n'
    return txt
    
def parseAll(f):
    trace('parsing...')
    out = OrderedDict()
    for f, short in files.listFiles(f):
        if short.startswith('reference_') and not '.' in short:
            trace(f'{short}...')
            section = parseSection(files.readAll(f, encoding='utf-8'))
            out[short] = section
    return out
    
if __name__=='__main__':
    parseAll('.')


================================================
FILE: vipercard/doc/gendocs_to_md.py
================================================

from gendocs import *
import os

def addFormattingMarkdown(s):
    # first, escape characters that happen to be markdown formatters
    # not needed because the symbols are in `code` blocks treated as literal
    # s = s.replace('\\', '\\\\')
    # s = s.replace('#', '\\#')
    # s = s.replace('*', '\\*')
    # s = s.replace('_', '\\_')
    # s = s.replace('~', '\\~')
    
    # then do formatting
    s = s.replace('^', '**')
    
    r = re.compile('\n`(.*?)`\n    ([a-zA-Z0-9].*)')
    s = r.sub('\n\n$backtic1$\\1$backtic1$ (\\2)\n\n', s)
    
    r = re.compile('\n`([^`]+?)`\n', re.DOTALL)
    s = r.sub('\n\n```\n\\1\n```\n\n', s)
    
    # if a subheader bold, should not be a newline right there, add more space
    r = re.compile('\\*\\*\n(?=[A-Za-z0-9])', re.DOTALL)
    s = r.sub('**\n\n', s)
    

    s = s.replace('$caret$', '^').replace('$backtic1$', '`').replace('$backtic$', '\\`')
    
    # need to double newlines! except for * lists. and not inside a ``` block
    pts = s.split('```')
    for i, item in enumerate(pts):
        if i%2==0:
            pts[i] = re.sub(r'(\S) *\n *([^*\s])', r'\1'+'\n\n'+r'\2', pts[i])
    
    s = '```'.join(pts)
    
    return s


def goSection(section, sectionfulltitle, outname, outfile, myHeaderLinks):
    out = ''
    out += '''<!---
this is a generated file, changes will be lost.
-->'''
    out+='\n\n'+myHeaderLinks+'\n\n'
    for item in section:
        shortTitle, title, body = item
        out += f'\n\n## {title}\n\n'
        out += addFormattingMarkdown(body)
    
    
    trace('write to', outfile)
    files.writeAll(outfile, out, encoding='utf-8')
    


def makeHeaderLinks(data, mapIt, outname1):
    headerLinks = []
    for key in data:
        outname = key.split('_')[-1].lower()
        sectionfulltitle = mapIt[outname].replace('lng', '')
        if outname==outname1:
            headerLinks.append(sectionfulltitle)
        else:
            headerLinks.append(f'[{sectionfulltitle}](./{key}.md)')
            
    return ' | '.join(headerLinks)

def goToMarkdown(indir):
    data = parseAll(indir)
    trace('outputting...')
    mapIt = dict(overview='lngOverview',
        commands='lngCommands',
        syntax='lngSyntax',
        properties='lngProperties',
        functions='lngFunctions',
        events='lngEvent Handlers',
        compatibility='lngCompatibility')
    
    for key in data:
        section = data[key]
        outname = key.split('_')[-1].lower()
        sectionfulltitle = mapIt[outname]
        outfile = key + '.md'
        myHeaderLinks = makeHeaderLinks(data, mapIt, outname)
        goSection(section, sectionfulltitle, outname, outfile, myHeaderLinks)
    trace('done.')

def transformToHtml(indir, outdir):
    indir = os.path.abspath(indir)
    outdir = os.path.abspath(outdir)
    goToMarkdown(indir)
    tmpdir = r'C:\b\devarchive\moltenform\static\page' + '\\TEMP'
    if not os.path.exists(tmpdir):
        os.mkdir(tmpdir)
    files.ensureEmptyDirectory(tmpdir)
    manifest = '''
# These are temporary files belonging to vipercard

titleprefix=title
contentprefix=
contentprefix_ifnotindex=
contentprefix_ifindex=
csspath=../github-markdown/github-markdown.css
header=
headernavparts=vipercard.net=/;script reference=./reference_01_overview.html

header_generated_by_makelinkchain=<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a href="/"><div class="linktilebutton linktilebutton_narrow linktilebutton_homenarrow"><img class="linktilebuttonicon linktilebuttonicon_home" src="/resources03a/images/pages/hm.png" alt="home" /><br />Home</div></a><span class="linktilebuttonhspace"></span></div>
end_header_generated_by_makelinkchain=
    
    '''
    files.writeAll(f'{tmpdir}/mdnotjekyll_info.txt', manifest)
    
    for f, short in files.listFiles(indir):
        if short.endswith('.md') and not 'readme' in short.lower() and not 'rationale' in short.lower():
            dest = files.join(tmpdir, short).replace('.md','.mdnotjekyll')
            files.copy(f, dest, False)
    prevpath = os.path.abspath('.')
    scr = r"C:\b\devarchive\moltenform\site-make-pages\markdown\goMarkdown.py"
    os.chdir(files.getParent(scr))
    args = [r"C:\data\e5\unzipped\devkits\py_64_37\pythonw", scr]
    files.run(args)
    os.chdir(prevpath)
    
    for f, short in files.listFiles(outdir):
        if f.lower().endswith('.html'):
            files.delete(f)
            
    headerfragment = files.readAll(outdir+'/../noship_headerfragment.html', encoding='utf-8')
    
    for f, short in files.listFiles(tmpdir):
        if short.endswith('.html'):
            dest = files.join(outdir, short)
            files.move(f, dest, False)
            alltxt = files.readAll(dest, encoding='utf-8')
            alltxt = fixuphtml(short, alltxt, headerfragment)
            files.writeAll(dest, alltxt, encoding='utf-8')
    
    import shutil
    shutil.rmtree(tmpdir)
    movePagesUp(outdir)

g_titles = {}
g_titles['page_404'] = 'ViperCard - Page not found'
g_titles['page_terms'] = 'ViperCard - Terms and Content Policies'
g_titles['page_video'] = 'ViperCard - Tutorial Videos'
g_titles['page_video1'] = 'ViperCard - Tutorial Videos - Making a GIF'
g_titles['page_video2'] = 'ViperCard - Tutorial Videos - Making a game'
g_titles['page_video3'] = 'ViperCard - Tutorial Videos - Making interactive art'
g_titles['page_why'] = 'ViperCard - Rationale'
g_titles['reference_01_overview'] = 'ViperCard - Script Reference - overview'
g_titles['reference_02_commands'] = 'ViperCard - Script Reference - commands'
g_titles['reference_03_syntax'] = 'ViperCard - Script Reference - syntax'
g_titles['reference_04_properties'] = 'ViperCard - Script Reference - properties'
g_titles['reference_05_functions'] = 'ViperCard - Script Reference - functions'
g_titles['reference_06_events'] = 'ViperCard - Script Reference - events'
g_titles['reference_07_compatibility'] = 'ViperCard - Script Reference - compatibility'
navScrRef = '<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a class="smalltheme-textwithinbox" href="/">vipercard</a><span class="smalltheme-textwithinbox"> &gt; </span><a class="smalltheme-textwithinbox" href="reference_01_overview.html">script reference</a><span class="linktilebuttonhspace"></span></div>'
navVideo = '<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a class="smalltheme-textwithinbox" href="/">vipercard</a><span class="smalltheme-textwithinbox"> &gt; </span><a class="smalltheme-textwithinbox" href="video.html">tutorial vids</a><span class="linktilebuttonhspace"></span></div>'
g_nav = {}
g_nav['page_404'] = '<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a class="smalltheme-textwithinbox" href="/">vipercard</a><span class="smalltheme-textwithinbox"><span class="linktilebuttonhspace"></span></div>'
g_nav['page_terms'] = '<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a class="smalltheme-textwithinbox" href="/">vipercard</a><span class="smalltheme-textwithinbox"><span class="linktilebuttonhspace"></span></div>'
g_nav['page_video'] = navVideo
g_nav['page_video1'] = navVideo
g_nav['page_video2'] = navVideo
g_nav['page_video3'] = navVideo
g_nav['page_why'] = '<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a class="smalltheme-textwithinbox" href="/">vipercard</a><span class="smalltheme-textwithinbox"> &gt; </span><a class="smalltheme-textwithinbox" href="#">Why</a><span class="linktilebuttonhspace"></span></div>'
g_nav['reference_01_overview'] = navScrRef
g_nav['reference_02_commands'] = navScrRef
g_nav['reference_03_syntax'] = navScrRef
g_nav['reference_04_properties'] = navScrRef
g_nav['reference_05_functions'] = navScrRef
g_nav['reference_06_events'] = navScrRef
g_nav['reference_07_compatibility'] = navScrRef
g_descriptions={}
g_descriptions['page_404'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_terms'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_video'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_video1'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_video2'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_video3'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['page_why'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_01_overview'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_02_commands'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_03_syntax'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_04_properties'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_05_functions'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_06_events'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'
g_descriptions['reference_07_compatibility'] = 'ViperCard, an open source HyperCard, make interactive 1 bit art and games like Macintosh'

def fixuphtml(short, alltxt, headerfragment):
    
    def replExpectAtLeastOne(s1, s2):
        nonlocal alltxt
        assertTrue(s1 in alltxt, "not seen", s1)
        alltxt = alltxt.replace(s1, s2)
    if not 'page' in short:
        replExpectAtLeastOne('md">', 'html">')
    key = short.split('.')[0]
    replExpectAtLeastOne('<head>', '<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n'+headerfragment+'\n')
    replExpectAtLeastOne('<div class="smalltheme-uppernavbox"><span class="linktilebuttonhspace"></span><a href="/"><div class="linktilebutton linktilebutton_narrow linktilebutton_homenarrow"><img class="linktilebuttonicon linktilebuttonicon_home" src="/resources03a/images/pages/hm.png" alt="home" /><br />Home</div></a><span class="linktilebuttonhspace"></span></div>', 
        g_nav[key])
    replExpectAtLeastOne('<link rel="stylesheet" href="../github-markdown/github-markdown.css">', '<link rel="stylesheet" href="./github-markdown.css">')
    replExpectAtLeastOne('<link rel="stylesheet" href="../smalltheme.css">', '<link rel="stylesheet" href="./smalltheme.css">')
    alltxt = alltxt.replace('example videos.', 'example videos (<a href="../video.html">here</a>).')
    alltxt = re.sub(r'<title>(.*?)</title>', rf'<title>{g_titles[key]}</title>', alltxt)
    alltxt = alltxt.replace('%%keywords%%', g_descriptions[key]+', '+g_titles[key])
    alltxt = alltxt.replace('%%description%%', g_descriptions[key]+', '+g_titles[key])
    return alltxt

def fixuphtmlpage(alltxt):
    def replExpectAtLeastOne(s1, s2):
        nonlocal alltxt
        assertTrue(s1 in alltxt, "not seen", s1)
        alltxt = alltxt.replace(s1, s2)
    
    replExpectAtLeastOne('<link rel="stylesheet" href="./smalltheme.css">', '<link rel="stylesheet" href="./script_reference/smalltheme.css">')
    replExpectAtLeastOne('<link rel="stylesheet" href="./github-markdown.css">', '<link rel="stylesheet" href="./script_reference/github-markdown.css">')
    return alltxt

def movePagesUp(outdir):
    for f, short in files.listFiles(outdir):
        if short.startswith('page_'):
            dest = f'{outdir}/../{short.replace("page_", "")}'
            files.move(f, dest, True) # overwrite existing
            # fix html
            alltxt = files.readAll(dest, encoding='utf-8')
            alltxt = fixuphtmlpage(alltxt)
            files.writeAll(dest, alltxt, encoding='utf-8')

if __name__=='__main__':
    outdir = r'..\vipercard\0.3\html\script_reference'
    transformToHtml('.', outdir)
    

================================================
FILE: vipercard/doc/gendocs_tovipercard.py
================================================

from gendocs import *
specialCharFontChange = "\x02"
changeFontTitle = f'{specialCharFontChange}times_24_biuosdce{specialCharFontChange}'
changeFontBody = f'{specialCharFontChange}times_12_biuosdce{specialCharFontChange}'
changeFontBold = f'{specialCharFontChange}times_12_+biuosdce{specialCharFontChange}'
changeFontCode = f'{specialCharFontChange}monaco_9_biuosdce{specialCharFontChange}'

def goItem(item):
    shortTitle, title, body = item
    ret = {}
    
    body = body.replace(specialCharFontChange, '?')
    body = changeFontTitle + title + changeFontBody + '\n\n' + body
    
    counter = 0
    def doReplaceBold(np):
        nonlocal counter
        counter += 1
        if counter % 2 == 1:
            return changeFontBold
        else:
            return changeFontBody
    body = re.sub(r'\^',doReplaceBold,body)
    
    counter = 0
    def doReplaceCodef(np):
        nonlocal counter
        counter += 1
        if counter % 2 == 1:
            return changeFontCode
        else:
            return changeFontBody
    body = re.sub(r'`',doReplaceCodef, body)
    body = changeFontBody + body
    body = body.replace('$caret$', '^').replace('$backtic1$', '`').replace('$backtic$', '\\`')
    ret['title'] = title
    ret['body'] = body
    return ret

def goSection(section, sectionfulltitle, outname, outfile):
    trace(f'{outname}...')
    out = OrderedDict()
    out['name'] = sectionfulltitle
    entries = []
    out['entries'] = entries
    for item in section:
        entries.append(goItem(item))
    alls = json.dumps(out)
    trace('write to ', outfile)
    files.writeAll(outfile, alls, encoding='utf-8')

def goTsIndexSection(section, sectionfulltitle, outname):
    trace('/* prettier-ignore */')
    out = []
    out.append(outname)
    out.append(sectionfulltitle)
    entries = []
    out.append(entries)
    for item in section:
        shortTitle, title, body = item
        entries.append(shortTitle)
    j = json.dumps(out)
    assertTrue(j.startswith('["'), j)
    trace(j + ',')
    
def goToVipercard(indir, outdir):
    data = parseAll(indir)
    trace('outputting...')
    mapIt = dict(overview='lngOverview',
        commands='lngCommands',
        syntax='lngSyntax',
        properties='lngProperties',
        functions='lngFunctions',
        events='lngEvent Handlers',
        compatibility='lngCompatibility')
    for key in data:
        section = data[key]
        outname = key.split('_')[-1].lower()
        sectionfulltitle = mapIt[outname]
        outfile = files.join(outdir, f'ref{outname}.json')
        goSection(section, sectionfulltitle, outname, outfile)
    for key in data:
        section = data[key]
        outname = key.split('_')[-1].lower()
        sectionfulltitle = mapIt[outname]
        goTsIndexSection(section, sectionfulltitle, outname)
    trace('done.')

if __name__=='__main__':
    outdir = '../vipercard/resources03a/docs'
    goToVipercard('.', outdir)
    



================================================
FILE: vipercard/doc/libraries.txt
================================================

Uses:
chevrotain
    https://github.com/SAP/chevrotain
    Shahar Soel, Apache-2.0

FileSaver.js
    https://github.com/eligrey/FileSaver.js
    Eli Grey <me@eligrey.com> MIT license

Golly
    https://github.com/dannygarcia/golly
    Copyright (c) 2012, Danny Garcia MIT license
    
js-lru
    https://github.com/rsms/js-lru
    MIT license

Clipboard.js
    https://github.com/zenorocha/clipboard.js/
    MIT license

[base64js](https://github.com/beatgammit/base64-js)


JSGIF (libgif.js)
    https://github.com/antimatter15/jsgif
    MIT license

easy.filter Bresenham
    http://members.chello.at/easyfilter/bresenham.html
    Alois Zingl, Vienna, Austria
    Bresenham Curve Rasterizing Algorithms
    Used with explicit permission, e-mail on Oct 27 2017

lz-string
    https://github.com/pieroxy/lz-string
    Sam Hocevar, released under WTFPL

[Pizzicato](https://github.com/alemangui/pizzicato)

[Bowser](https://github.com/lancedikson/bowser)

[TypeScript Types for TextEncoding](https://github.com/DefinitelyTyped/DefinitelyTyped)

deep-freeze
    https://github.com/substack/deep-freeze
    public domain

pbkdf2 gist by Chris Veness

Wikipedia's [description of Mac OS Roman](https://en.wikipedia.org/wiki/Mac_OS_Roman)

A small code excerpt from:
Scintilla
    http://www.scintilla.org/
    Scintilla license (public domain)







================================================
FILE: vipercard/doc/page_404.md
================================================

The requested page was not found.

<a href="/"><img border="0" src="/resources03a/intro/err/back.png"  alt="Back to ViperCard" /></a>


================================================
FILE: vipercard/doc/page_terms.md
================================================

#### Terms and Content Policies

The following terms and conditions govern all use of the *ViperCard* website and all content, services and products available at or through the website (taken together, the Website). The Website is owned and operated by *ViperCard*. The Website is offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies and procedures that may be published from time to time on this Site by *ViperCard* (collectively, the “Agreement”).

Please read this Agreement carefully before accessing or using the web site. By accessing or using any part of the web site, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access the website or use any services. If these terms and conditions are considered an offer by *ViperCard*, acceptance is expressly limited to these terms.

#### Your Account
You are responsible for maintaining the security of your account, and you are fully responsible for all activities that occur under the account and any other actions taken in connection with it. You must not use your account in a misleading or unlawful manner, including in a manner intended to trade on the name or reputation of others, and *ViperCard* may change or remove any description or keyword that it considers inappropriate or unlawful, or otherwise likely to cause *ViperCard* liability. You must immediately notify *ViperCard* of any unauthorized uses of your account or any other breaches of security. *ViperCard* will not be liable for any acts or omissions by You, including any damages of any kind incurred as a result of such acts or omissions.

#### Responsibility of Contributors
If you post material to the Website, post links on the Website, or otherwise make (or allow any third party to make) material available by means of the Website (any such material, “Content”), You are entirely responsible for the content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that:

the downloading, copying and use of the Content will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark or trade secret rights, of any third party;
* if your employer has rights to intellectual property you create, you have either (i) received permission from your employer to post or make available the Content, including but not limited to any software, or (ii) secured from your employer a waiver as to all rights in or to the Content;
* you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms;
* the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content;
* the Content is not spam, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing);
* the Content is not obscene, libelous or defamatory, pornographic, hateful or racially or ethnically objectionable, and does not violate the privacy or publicity rights of any third party; and
* you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by *ViperCard* or otherwise.

By submitting Content to *ViperCard* for inclusion on your Website, you grant *ViperCard* a world-wide, royalty-free, and non-exclusive license to reproduce and publish the Content. If you delete Content, *ViperCard* will use reasonable efforts to remove it from the Website, but you acknowledge that caching or references to the Content may not be made immediately unavailable.

Without limiting any of those representations or warranties, *ViperCard* has the right (though not the obligation) to, in *ViperCard*’s sole discretion (i) refuse or remove any content that, in *ViperCard*’s reasonable opinion, violates any *ViperCard* policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of the Website to any individual or entity for any reason, in *ViperCard*’s sole discretion.





#### Responsibility of Website Visitors
*ViperCard* has not reviewed, and cannot review, all of the material, including computer software, posted to the Website, and cannot therefore be responsible for that material’s content, use or effects. By operating the Website, *ViperCard* does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. The Website may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. The Website may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. *ViperCard* disclaims any responsibility for any harm resulting from the use by visitors of the Website, or from any downloading by those visitors of content there posted.

#### Content Posted on Other Websites
We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which *ViperCard* links, and that link to *ViperCard*. *ViperCard* does not have any control over those non-*ViperCard* websites and webpages, and is not responsible for their contents or their use. By linking to a non-*ViperCard* website or webpage, *ViperCard* does not represent or imply that it endorses such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. *ViperCard* disclaims any responsibility for any harm resulting from your use of non-*ViperCard* websites and webpages.

#### Disclaimer of Warranties
The Website is provided “as is”. *ViperCard* and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither *ViperCard* nor its suppliers and licensors, makes any warranty that the Website will be error free or that access thereto will be continuous or uninterrupted. You understand that you download from, or otherwise obtain content or services through, the Website at your own discretion and risk.

#### Copyright Infringement and DMCA Policy
As *ViperCard* asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by *ViperCard* violates your copyright, you are encouraged to notify *ViperCard* in accordance with *ViperCard*’s Digital Millennium Copyright Act (”DMCA”) Policy. *ViperCard* will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. In the case of a visitor who may infringe or repeatedly infringes the copyrights or other intellectual property rights of *ViperCard* or others, *ViperCard* may, in its discretion, terminate or deny access to and use of the Website. In the case of such termination, *ViperCard* will have no obligation to provide a refund of any amounts previously paid to *ViperCard*.


#### Intellectual Property
This Agreement does not transfer from *ViperCard* to you any *ViperCard* or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with *ViperCard*.

#### Changes
*ViperCard* reserves the right, at its sole discretion, to modify or replace any part of this Agreement. It is your responsibility to check this Agreement periodically for changes. Your continued use of or access to the Website following the posting of any changes to this Agreement constitutes acceptance of those changes. *ViperCard* may also, in the future, offer new services and/or features through the Website (including, the release of new tools and resources). Such new features and/or services shall be subject to the terms and conditions of this Agreement.

#### Termination
*ViperCard* may terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your account (if you have one), you may simply discontinue using the Website. Notwithstanding the foregoing, if you have a Services account, such account can only be terminated by *ViperCard* if you materially breach this Agreement and fail to cure such breach within thirty (30) days from *ViperCard*’s notice to you thereof; provided that, *ViperCard* can terminate the Website immediately as part of a general shut down of our service. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.


#### Limitation of Liability
In no event will *ViperCard*, or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damagaes; (ii) the cost of procurement or substitute products or services; (iii) for interpution of use or loss or corruption of data; or (iv) for any amounts that increase the fees paid by you to *ViperCard* under this agreement during the twelve (12) month period prior to the date the cause of the action accrues. *ViperCard* shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law.

#### General Representation and Warranty
You represent and warrant that (i) your use of the Website will be in strict accordance with the *ViperCard* Privacy Policy, with this Agreement and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the United States or the country in which you reside) and (ii) your use of the Website will not infringe or misappropriate the intellectual property rights of any third party.

#### Indemnification
You agree to indemnify and hold harmless *ViperCard*, its contractors, and its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of the Website, including but not limited to out of your violation this Agreement.

#### Miscellaneous
This Agreement constitutes the entire agreement between *ViperCard* and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of *ViperCard*, or by the posting by *ViperCard* of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of the Website will be governed by the laws of the state of Washington, excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in Seattle, Washington.

The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; *ViperCard* may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns.

These terms are based upon the <a href="http://wordpress.com">WordPress</a> Terms of Service, and are licensed under Creative Commons Share-Alike 1.0. This means that you are free to use and edit them for your own purposes, even commercially, provided you release your new versions under the same license.



================================================
FILE: vipercard/doc/page_video.md
================================================
<iframe width="450" height="240" src="https://www.youtube.com/embed/9Jyh-EXsH4w?rel=0&autoplay=1" style="border:0px" allowfullscreen="true"></iframe>

<h3><a href="video1.html" style="color:black;">Demo 1: make an animated GIF</a></h3>
<h3><a href="video2.html" style="color:black;">Demo 2: make a game</a></h3>
<h3><a href="video3.html" style="color:black;">Demo 3: make interactive art</a></h3>


<h3><a href="/" style="color:black;text-decoration:none">Home</a></h3>



================================================
FILE: vipercard/doc/page_video1.md
================================================
<iframe width="900" height="480" src="https://www.youtube.com/embed/gF4KI_4mFY0?rel=0&autoplay=1" style="border:0px" allowfullscreen="true"></iframe>

<h3><a href="video.html" style="color:black;text-decoration:none">Back</a></h3>


================================================
FILE: vipercard/doc/page_video2.md
================================================
<iframe width="900" height="480" src="https://www.youtube.com/embed/VYnXucRurY0?rel=0&autoplay=1" style="border:0px" allowfullscreen="true"></iframe>

<h3><a href="video.html" style="color:black;text-decoration:none">Back</a></h3>


================================================
FILE: vipercard/doc/page_video3.md
================================================
<iframe width="900" height="480" src="https://www.youtube.com/embed/oCaGCMDwZPc?rel=0&autoplay=1" style="border:0px" allowfullscreen="true"></iframe>

<h3><a href="video.html" style="color:black;text-decoration:none">Back</a></h3>


================================================
FILE: vipercard/doc/page_why.md
================================================


# Why

ViperCard is a fun project for creating games and animations, but it also makes me reflect on the process of writing software.

This look into the past makes me wonder what could have been. HyperCard was successful because it removed many obstacles in the way of people creating digital or interactive media. Today I see so many barriers to people who want to begin to write software. And in addition to economic benefits, software has so much potential as a vehicle of creative expression -- you can build quick prototypes and iterations, actions can be stored and undone, platforms are essentially deterministic, there are no parts to order, variable costs are near-zero, and ideas shared quickly. The obstacles aren't inherent to the technology. Writing software should be a potential way of self-expression for any number of people, just as it has impacted my life, regardless of background. We are moving in this direction, but even in the current age that celebrates coding and builds code camps and impressive free online tutorials, I feel that we're not yet in the right place.

Computer Science courses lag behind modern practices, tools and SDKs are not friendly to beginners, and if teaching oneself, the choice paralysis when deciding which programming language to learn or which online tutorial is trustworthy.

More fundamentally, factors of environment and access are strong; others have written about this more effectively than I, but I see that this has been affecting us from the time of HyperCard to the present day. Years ago I lived in a moderately rural area, and volunteered some time writing conference scheduling software for a school district. I saw the extent to which families did not have internet access. Our school district was able to man a phone line as a fallback for this case, but unreliable/non-existent internet access divides our society. Community meetings in rural America have heated discussions about trying to get access, in places like northern Maine where the market is said to be too small. In TEALS presentations I learned that 75% of US high schools do not even have a single class to teach programming. We need to address these problems. I’m not saying people under economic injustice should “learn to code” -- I'm saying that we who have access to technology are often unaware of the difficulty of having stabile access to technology in fragile circumstances and abandoned communities. And even once access to technology is present, there are cultural barriers. Programming is mythologized so that only those seen as having a certain type of intelligence are encouraged to pursue it, and only privileged groups are seen as having some type of requisite aptitude. There are so many positive initiatives and energy in the right direction towards helping people, but they fight against the tide of years of accumulated software development complexity, cultural stereotypes, strong opinions about what who should use which development toolkits, and unhelpful learning environments that assume large amounts of prior knowledge.

I'm sure there were countless problems with software and accessibility in the 80s and early 90s, which were before my time. But I am fascinated by the idea that the line between “user” and “programmer” was often so blurred. You set up your Commodore 64 and typed in its software, line by line. You shared fun BASIC scripts with your friends, and even made your own modifications! Self-expression and self-efficacy are important. These computers had an incredibly difficult learning curve, but they also gave the dignity of assuming the user was capable of learning to not only operate, but transform and create. And HyperCard on the Macintosh did this even more amazingly.

Our lives (social, career, entertainment) center around software -- but we are discouraged from learning how this software truly works. It is stressful at a deep level, for nearly all of us, and especially the elderly. We are made into inadequate, passive consumers, when software has the potential to be so much more.

ViperCard makes me consider that an old black-and-white program from the 90s can inspire us to look for what modern software development is missing. (Also, as a nearly pure-JS webapp, it works smoothly even if an internet connection is slow or dropped).

# Still in progress

- ViperCard is currently not compatible with screen readers and accessibility tools.

- ViperCard is currently not compatible with mobile or tablet, despite the importance of these platforms.

- ViperCard is still in development and some features are not yet complete. For example: HyperCard's visual effect command and show all cards command.

ViperCard is released under the GNU Public License. See https://github.com/moltenform/vipercard for more information.


================================================
FILE: vipercard/doc/readme.md
================================================

Here's the ViperCard script reference, as it is shown within the application.

* [01 Overview](reference_01_overview.md)
* [02 Commands](reference_02_commands.md)
* [03 Syntax](reference_03_syntax.md)
* [04 Properties](reference_04_properties.md)
* [05 Functions](reference_05_functions.md)
* [06 Events](reference_06_events.md)
* [07 Compatibility](reference_07_compatibility.md)



================================================
FILE: vipercard/doc/reference_01_overview
================================================

 
============================================================
========================= Introduction
============================================================


Welcome to ViperCard, an open source re-creation and re-imagination of 1987's HyperCard. We suggest first watching the example videos.




============================================================
========================= Scripting
============================================================

All objects (all buttons, fields, and cards) have an associated set of code called a "script."

Here is an example script:
`on mouseUp
    answer "hello, world"
end mouseUp`

If this script is placed in a button, and the Browse tool is chosen (looks like a hand), the code will be run when the button is clicked.

A line of code beginning with -- is ignored. This is often used to write explanatory comments. It can also be used to temporarily "disable" some code. You can press Cmd+Q in the script editor to quickly comment-out or uncomment a line.

`on mouseUp
    -- this line is a comment
    answer "hello, world"
end mouseUp`


The indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.

A long line of code can be continued with a backslash, e.g.

`answer ("here is how to continue" & \
    "code across two lines")`

To have a comment spanning many lines, do this,

`on mouseUp
    --[[this line is a comment
    and so is this
    and also this]]
    answer "hello, world"
end mouseUp`

The language is not case sensitive. `on mouseup` and `on mouseUp` are equivalent.

A common data type is a string (i.e. text).

`put "abc" into x`

Double-quotes ("), not single-quotes ('), must be used. A string with length 0, "", is perfectly valid and used often to represent a missing value. You may see this referred to as an 'empty string'. You can easily test for an empty string with code like:

`if x is "" then
    answer "empty string"
end if`

To include a double-quote character in a string, use the quote constant,

`answer (quote & "a" & quote) -- displays "a"`

Valid numbers include `123`, `123.456`, and scientific notation like `1.23e6` which means `1.23` multiplied by (`10` to the `6`th power). Numbers can be in the range `[-1e18, 1e18]`, if a number is taken outside this range a runtime error will be thrown. Division by zero, logarithm of a negative, and so on will also cause a runtime error.

`sqrt(0.5)` is a function call meaning to take the square root of `0.5`. `sum(1, 2)` is a function call that adds 1 and 2 and returns 3. A comma separates the values sent. Function calls can be nested, for example, `sum(1, sum(2, 3))`.

You can call a function in two ways. `the mouseLoc` is the same as `mouseLoc()`. `the length of "abc"` is the same as `length("abc")`.

Buttons and fields are referred to as "objects". Cards are also a type of object. And, the entire project, referred to as a "stack", is an object.

A script can set properties of an object with syntax like:

`set the width of cd btn "myBtn" to 450`

Choose the button tool and select a button, and its id will be shown in the panel on the right. One can refer to an object by id in a script:

`set the width of cd btn id 1234 to 450`

When you are in the Browse tool and you interact with the page by clicking on buttons or pressing keystrokes, this causes messages to be fired. If you click a button, and if that button has a script that happens to have a function called `on mouseUp` defined, then the code inside `on mouseUp` will be run.

The documentation here has a list of Commands, Event Handlers, and Properties that can be set.



============================================================
========================= Expressions
============================================================


You can use expressions like `put 1+2+3+4 into x` or `put sqrt(0.5) + sqrt(0.6) into y` in your code.

Expressions can use parentheses to contain any level of nested sub-expressions, for example,

`sqrt(0.5)
sqrt(0.5 + sqrt(0.6))
sqrt(0.5 + sqrt(0.6 + sqrt(0.7)))`
are all valid.

Parentheses are used to dictate the order of operations, since
`3*(4+5)`
gives a different answer than
`(3*4)+5`

Parentheses are also used for grouping an expression. For example, we needed to get the (n + 1)th line of a variable, we would type `(line (n + 1) of x)`

Do not type something like
`answer (line n + 1 of x) -- this is hard to read.`
which is unclear,
`answer (line (n + 1) of x) -- this is preferred.`

In the expression `2 + 3`, the symbol `+` is called an operator. 
ViperCard also has logical operators like `and`, `or`, and `not`.
See the `operators` page in the Syntax documentation section
for more information.


============================================================
========================= Message Box
============================================================


Open the Message Box by choosing 'Message Box' from the Go menu, or by pressing Cmd+M.

The message box can be used to quickly try out snippets of code. For example, if you want to evaluate some math, you can open the message box, type `put 12*34`, and press Enter. The result will be shown below.

As another example, if you have two buttons, and you want to align the left sides of the buttons, you can type `set the left of cd btn 2 to the left of cd btn 1`, and press Enter, and the action will be performed.

You can use the Up and Down arrow keys to see previously typed commands.

You can use a semicolon to combine many lines, for example `put 2 into x; put x * 3`

You can use the message box to check or change the contents of a global variable. In fact, any variable mentioned in the message box will be assumed to be a global, so you can write `put 4 into myGlobal` without first needing to declare `global myGlobal`.

In your script, you can add debugging statements that trace a value and show it in the message box, as long as the message box is currently open.

`
put 45 * 56 into x
-- if the msg box is open, will show the value of x
-- otherwise, the line is ignored
put x into the msg box
-- code will continue running
`

The shortened form,

`
put 45 * 56 into x
-- if the msg box is open, will show the value of x
put x`

is also supported.



============================================================
========================= Lists/Arrays
============================================================


Here's a common way to create a list:

`put "" into myList
repeat with x = 1 to 5
    put 0 into line x of myList
end repeat`

Append a number to the list:

`put newline & 20 after myList`

Insert a number in the list (if the line doesn't yet exist, it will be added)

`put 6 into line 8 of myList`

Add 10 to each element of the list:

`repeat with x = 1 to the number of lines in myList
    put (line x of myList) + 10 into line x of myList
end repeat
`

`myList` is a normal variable, it can be passed as an argument and so on.

^Two-dimensional lists^

Here's a common way to create a 2-d list:
`put "" into myList
repeat with x = 1 to 5
    repeat with y = 1 to 5
        put 0 into item x of line y of myList
    end repeat
end repeat`

Insert a new number into the list (it's ok if the line or item does not yet exist, it will be created):

`put 3 into item 6 of line 8`

Add 10 to each element of the list:

`repeat with y = 1 to the number of lines in myList
    repeat with x = 1 to the number of items in line y of myList
        if length(item x of line y of theLine) > 0 theLine
            add 10 to item x of line y of theLine
        end if
    end repeat
end repeat
`


============================================================
========================= Variables
============================================================


Use a statement like 

`put 3 into x`

to put the value "3" into a variable named "x". You don't need to first declare x as a variable.

Variable names and function names are case insensitive.

Variable names cannot begin with a numeral, and can contain underscores but no other punctuation. Certain words cannot be used as variable names because they are already keywords or built-in functions. For example, you cannot have a variable named "line" because this is a keyword. You cannot have a variable named "result" because this is a built-in function.

If you try to read from a variable before it has been introduced, a runtime error will occur. `put notSeenBefore into x` will cause an error unless there is a statement assigning a value to `notSeenBefore`.

Use "global" to declare a variable as a global.
1) it can be accessed from any other script
2) its contents are saved even after the function is complete.

For example,

`global coordX, coordY
put 1 into coordX
put 2 into coordY`

If another script says
`global coordX, coordY
answer coordX, coordY`
it will read the values that were set.

Global variables are, though, reset when you close the stack (the values 
are not saved as part of the project.)

^Data types^

A runtime error can be thrown if a value has the wrong 
type, e.g.
`put "abc" + 4 into z`
causes a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string `"abc"`.

If you need to convert from a text type to a number, you can use the functions `strToNumber` and `numberToStr`. For example,
`ask "please enter a number"
put it into x
if strToNumber(x) is not false then
    answer "the number plus one is" && (strToNumber(x) + 1)
end if
`

For `if` and `else if`, only `true` or `false` are accepted, any other value is a runtime error. For example, to check that a string is not empty, you cannot say `if myVar then`, you have to say something like `if length(myVar) > 0 then` instead.

Note that equality checks account for different data types: 

`if (456 is "456.00") then answer "yes" -- answers yes`

A "point" data type is two numbers separated by a comma. You can write:
`
put 1 into x
put 2 into y
set the topleft of cd btn "myBtn" to x, y
`

This is the same as writing
`
set the topleft of cd btn "myBtn" to 1, 2
set the topleft of cd btn "myBtn" to "1, 2"
-- or
set the top of cd btn "myBtn" to 1
set the left of cd btn "myBtn" to 2
`

============================================================
========================= User Functions
============================================================

An example of how to define and call a custom function:
`function myAddition p1, p2
    return p1 + p2
end myAddition
on mouseUp
    put myAddition(1,2) into x
end mouseUp`

An example of how to define and call a custom handler:
`on showMessage p1, p2
    put p1 into cd fld "results1"
    put p2 into cd fld "results2"
end showMessage
on mouseUp
    showMessage "hello", "world"
end mouseUp`

You can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.

No error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string ("").
`myAddition(7, 8, 9) -- the extra argument 9 is ignored
myAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8
myAddition(7) -- p1 is assigned 7, p2 is assigned ""
myAddition() -- p1 is assigned "", p2 is assigned ""`

You can use recursion.

You can place common code in the current card's script, or the stack's script, so that it can be called by many objects. This is because of the message hierarchy:

Messages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.
* If you click on a button:
    * A mouseUp message is created
    * Script of the button is examined. 
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass mouseUp', continue:
    * Script of the current card is examined.
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass mouseUp', continue:
    * Script of the current stack is examined.
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.

* Similarly, if you are typing text in a field, and type the letter 'a':
    * A afterKeyUp message is created
    * Script of the current field is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the afterKeyUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass afterKeyUp', continue:
    * Script of the current card is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the afterKeyUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass afterKeyUp', continue:
    * Script of the current stack is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the mouseUp handler.

Calling `exit to ViperCard` passes the message up to ViperCard to be handled, and then exits all code execution. So it has two uses, it will exit all code execution, and will also fall back to the default ViperCard behavior.

See documentation of the 'pass' command for more information.

Calls to custom commands and procedures also bubble upwards in the same way. A function in the stack's script can be called from any handler on a card, field, or button. A function in the card's script can be called from any handler in a field or button. So, it is useful to put commonly used utility code in a stack script so that it can be called from anywhere.


============================================================
========================= Text and Chunks
============================================================


^Lines^

Use `newline` to refer to a new line character.

Let's say you wanted two lines of text in a field, you would use 
the following:

`put "first line" & newline & "second line" into cd fld "myFld"`

(You shouldn't have to be concerned with platform differences: the constants 'return', 'cr', 'linefeed' are present for compatibility, but they are all equivalent. For convenience, copying and pasting text in and out of ViperCard will automatically translate newline characters, for example if you are running windows, when you copy text we'll automatically convert to \r\n newlines so it will work seemlessly with other software. Internally, ASCII 10 represents newline.)

^Chunks^

ViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:

`
put "ab" & tab & "cd" & tab & "ef" into myList
set the itemDelimiter to tab
put 2 into n
answer "Result:" & item n of myList
`
If you have a comma-separated list you can get the nth item like this:

`
put "ab,cd,ef" into myList
set the itemDelimiter to ","
put 2 into n
answer "Result:" & item n of myList
`

More advanced examples:

`
answer char 2 of "abcd"
answer char (n + 1) of "abcd"
answer char 2 to 4 of "abcd"

answer item 2 of "ab,cd,ef,gh"
answer item (n + 1) of "ab,cd,ef,gh"
answer item 2 to 4 of "ab,cd,ef,gh"

answer first item of "ab,cd,ef,gh"
answer last item of "ab,cd,ef,gh"
answer any item of "ab,cd,ef,gh"

put "ab" & newline & "cd" & newline & "ef" into myList
answer line 2 of myList
answer line (n + 1) of myList
answer line 2 to 3 of myList
`

Recursive scopes:
`
put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList

answer item 2 of line 2 of myList
answer char 2 of line 2 of myList
answer char 2 of item 2 of line 2 of myList

answer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList
`


^Modifying by chunk^

`
put "abcd" into x
put "A" into char 2 of x
put "A" into char 2 to 4 of x

put "10,20,30" into myList
put "A" into item 2 of myList
put "A" into item 2 to 3 of myList
multiply item 2 of myList by 5
add 1 to item 2 of myList

put "A" into first item of myList
put "A" into last item of myList
put "A" into any item of myList

put "A" into before item 2 of myList
put "A" into after item 2 of myList
put "A" into before char 2 of item 2 of myList

put "A" into before item 2 of cd fld "myFld"
put "A" into after item 2 of cd fld "myFld"
put "A" into before char 2 of item 2 of cd fld "myFld"

put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList
put "A" into item 2 of line 2 of myList
put "A" into char 2 of line 2 of myList
put "A" into char 2 of item 2 of line 2 of myList

put "A" into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList
`

^Backwards compatiblity^

We went to much effort to maintain fidelity with HyperCard's chunk processing. All of the above can be done with words:

`
put "ab cd ef" into x
answer word 2 of x
answer word 2 to 3 of x
put "A" into word 2 of x
put "A" into word 2 to 3 of x
put "A" into char 2 to 3 of word 2 to 3 of x
`

To enable full compatibility with HyperCard, go to `Object->Stack info...` and turn on compatibility mode. Chunk handling will now be identical (including the non-intuitive behavior seen below).

`
-- if compatibility mode is on:
-- we follow HyperCard's non-intuitive behavior for the following:
put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList
put "A" into item 3 of item 4 of myList
put "A" into item 3 of char 2 of myList
delete item 3 of item 4 of myList
delete item 3 of char 2 of myList
add 1 to item 3 of item 4 of myList
add 1 to item 3 of char 2 of myList
answer item 0 of myList
put "A" into item 0 of myList
answer item 4 to 1 of myList
put "A" into item 4 to 1 of myList


-- The only known cases we don't support (we'll throw a runtime error):
answer item -1 of myList
put "A" into item -1 of myList
delete item -1 of myList
answer char 2 of item 4 to 1 of myList
put "A" into char 2 of item 4 to 1 of myList
delete char 2 of item 4 to 1 of myList
delete item 2 to 3 of myList
`

See also documentation for the `delete` command.

============================================================
========================= Objects
============================================================

Ways to refer to a button or field:
`
cd btn id 1234
cd btn "myBtn"
cd btn 2
first cd btn
any cd btn
last cd btn
`

Ways to refer to a card:
`
this card
prev card
next card
first card
second card
last card
card 1
card id 1234
card "name"
`

Ways to refer to a background:
`
this background
prev background
next background
first background
second background
last background
bg 1
bg id 1234
bg "name"
`

Ways to refer to a stack:
`
this stack
stack 1
stack "name"
`
Other ways to refer to objects:
`
answer the name of the target
answer the name of me
answer the name of the owner of cd btn id 1234
put "cd btn id 1234" into x
answer the name of x

function whichObject
    return "cd btn id 1234"
end whichObject
answer the name of whichObject()
`
============================================================
========================= Structure
============================================================


^Loops^
`repeat with x = 1 to 3
    ...other code here...
end repeat`

Refer to `repeat` under "syntax" for more information.

^If statements^
`if x > 1 then
    ...other code here...
else
    ...other code here...
end if`
Refer to `if` under "syntax" for more information.


^Scripts^
No code can exist outside of a handler or function.

^Handlers^
Handlers look like this

`on mouseup 
    answer "hello world"
end mouseup`
    
and respond to an event message.
    
^Functions^
Functions look like this

`function myAddition p1, p2
    return p1 + p2
end myAddition`

They can then be called with code like
`put myAddition(1,2) into x`
Functions inside of functions are not supported.


^Statements^
You cannot have a line that is just
    `sqrt(0.5)`
with no command, this is a syntax error.
    
Statements occur on separate lines, there's no way to have more than one statement on a line.
    
^Expressions^

A set of computations such as `1+2+3+4` or `sqrt(0.5) + sqrt(0.6)` is an expression. Most places that take a value can be given an expression, for example,

`go card 2
-- is the same as
put 1 into x
go card (x + 1)

put "abc" into cd fld "myFld1"
put "abc" into cd fld (prefix & "1")

put "a" into line 4 of myList
put "a" into line (x+1) of myList

set the left of cd btn "myBtn" to x
set the left of cd btn "myBtn" to (45 + 50 * cos(theta))
`

============================================================
========================= Examples
============================================================

The tutorial videos show helpful example code.

Example 1:
`
-- after creating a field called "myFld":
-- create a btn and put this in its script:
on mouseUp
    -- when you click button "Go", you get 10 points!
    put cd fld "myFld" into score
    put (score + 10) into score
    put score into cd fld "myFld"
end mouseUp

`

Example 2:
`
-- after creating a btn called "fish":
-- create a btn and put this in its script:
on mouseUp
    -- when you click this, the fish moves
    put the top of cd btn "fish" into y
    subtract 10 from y
    set the top of cd btn "fish" to y
end mouseUp

`
Example 3:
`
-- create interactive art.
-- put this in the card script,
-- then when you choose the browse tool and 
-- click on the card, it will draw lines.

on mouseUp
    put the clickH into X
    put the clickV into y
    
    -- choose the line tool to draw lines
    choose "line" tool
    
    -- make a loop that will repeat 10 times
    repeat 10 times
        put random(80) into randx
        put random(80) into randy
        -- will get random # between 1 and 80
        drag from x, y to (x + randx), (y + randy)
    end repeat
end mouseUp
  
`


============================================================
========================= Tips & Shortcuts
============================================================


General tips

* If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script
* See more error details, when in the Script Editor, by clicking on the error excerpt
* Double-click the eraser tool to clear paint on the current card

Keyboard shortcuts when editing text,

* Cmd+C to copy
* Cmd+X to cut
* Cmd+V to paste
* Cmd+A to select all
* Cmd+Backspace to delete entire word
* PageUp / PageDown to scroll one page
* Shift+PageUp / Shift+PageDown to select one page
* Home to move to start of line
* Shift+Home to select to start of line
* Cmd+Home to move to the start
* Cmd+Shift+Home to select to the start
* Left Arrow to move to the left
* Shift+Left Arrow to select to the left
* Cmd+Left Arrow to move left one word
* Cmd+Shift+Left Arrow to select left one word
* Cmd+Arrow Up to scroll up
* Cmd+Arrow Down to scroll down
* Cmd+D to duplicate the current line
* Cmd+L to delete the current line
* Cmd+Q to quickly comment-out or uncomment the current line
* Cmd+Q when many lines are selected to comment-out all of them
* Cmd+Q to comment-out a block of code
* Tab key, to auto-indent code in a script

Some of the main differences between ViperCard and HyperCard:
* ViperCard is open source software that can run in any modern web browser
* you can export stacks as a modern json format
* art-stamps feature for adding clip art
* new animation features like save-to-gif
* in ViperCard you have to hit Save to save changes
* but in ViperCard you have extensive undo history and can even undo changes made by a script

A few of the differences between ViperCard and HyperCard:
* You can use `--[[block comments]]` that span many lines.
* You can write `exit to ViperCard` instead of `exit to HyperCard`
* You must specify `cd` or `bg` when referring to a button or field, unless compatibility mode is enabled (Object->Stack Info)
* Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.
* Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool
* You cannot read a variable that has not been set. `put unsetVar into x` causes a runtime error.
* hilite and checkmark are separate properties
* label and name are separate properties
* You can't have a variable named id, short, long, first, and so on.
* The `choose` command sets the emulated current tool, not the actual tool, and is limited to certain paint operations
* The newline character is \n and not \r



============================================================
========================= What's New
============================================================

New in 0.24
* Script stack trace
* Use `get the shiftKey`, deprecate `get the shiftKey()`
* You can say `the sin of 4`
* You can say `sin of 4`, `sin of cd fld 1`
* Continue lines with logical-not, press `Alt-Enter` in code editor
* Block comments `--[[a comment]]`
* You can use `select`, `mark`, `doMenu` commands
* You can turn on compat mode to allow `put "a" into fld 1`
* Everything is case insensitive, even `cd btn "aBcDe"`
* Improvements to `send` and `do`, script error shown in more helpful line
* Improvements to built in functions like `selectedText`
* Improvements to click features like `wait until the mouseClick`
* You can say `put "card id 2590" into xx; put the name of xx into y`
* You can use values for coords, e.g. `put "3,4" into c; set the loc of cd btn 1 to c`
* Better match subtle differences between `target` and `the target`
* Single-line `if` statements, fewer parentheses needed
* Call custom functions from anywhere
* Better cursors, better rendering on different screen resolutions
* More fonts, all fonts have pixel-perfect spacing
* You can use recursive chunks like `put "a" into char 7 of line 3 of x`
* Improvements to load time by loading some libraries asynchronously
* Common commands in script execution are faster
* Scripts can dynamically create/delete objects, and set scripts
* New features like `set the textstyle of line 3 of cd fld "myFld" to "toggle-bold"`


============================================================
========================= Credits
============================================================


ViperCard
https://github.com/moltenform/vipercard
Copyright (C) 2020 Ben Fisher

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.

ViperCard uses the following libraries:

* Chevrotain
    * https://github.com/SAP/chevrotain
    * Apache License 2.0
* FileSaver.js
    * https://github.com/eligrey/FileSaver.js
    * MIT License
* Golly
    * https://github.com/dannygarcia/golly
    * MIT License
* js-lru
    * https://github.com/rsms/js-lru
    * MIT License
* Clipboard.js
    * https://github.com/zenorocha/clipboard.js
    * MIT License
* base64js
    * https://github.com/beatgammit/base64-js
    * MIT License
* JSGIF
    * https://github.com/antimatter15/jsgif
    * MIT License
* Bresenham easy.filter
    * http://members.chello.at/easyfilter/bresenham.html
    * written permission of author
* lz-string
    * https://github.com/pieroxy/lz-string
    * MIT License
* Pizzicato
    * https://github.com/alemangui/pizzicato
    * MIT License
* Bowser
    * https://github.com/lancedikson/bowser
    * MIT License
* types-text-encoding 
    * https://www.npmjs.com/package/@types/text-encoding
    * MIT License
* deep-freeze
    * https://github.com/substack/deep-freeze
    * Public domain
* pbkdf2 gist by Chris Veness
* description of Mac OS Roman character set
    * https://en.wikipedia.org/wiki/Mac_OS_Roman
    * http://creativecommons.org/licenses/by-sa/3.0/
    * Creative Commons Attribution-ShareAlike
* and a small excerpt from the SciTE code editor,
* ported from C++ to TypeScript by Ben Fisher
* SciTE
    * https://www.scintilla.org/License.txt



================================================
FILE: vipercard/doc/reference_01_overview.md
================================================
<!---
this is a generated file, changes will be lost.
-->

Overview | [Commands](./reference_02_commands.md) | [Syntax](./reference_03_syntax.md) | [Properties](./reference_04_properties.md) | [Functions](./reference_05_functions.md) | [Event Handlers](./reference_06_events.md) | [Compatibility](./reference_07_compatibility.md)



## Introduction



Welcome to ViperCard, an open source re-creation and re-imagination of 1987's HyperCard. We suggest first watching the example videos.





## Scripting


All objects (all buttons, fields, and cards) have an associated set of code called a "script."

Here is an example script:

```
on mouseUp
    answer "hello, world"
end mouseUp
```


If this script is placed in a button, and the Browse tool is chosen (looks like a hand), the code will be run when the button is clicked.

A line of code beginning with -- is ignored. This is often used to write explanatory comments. It can also be used to temporarily "disable" some code. You can press Cmd+Q in the script editor to quickly comment-out or uncomment a line.


```
on mouseUp
    -- this line is a comment
    answer "hello, world"
end mouseUp
```



The indentation helps readability, but it is not mandatory. The code editor will automatically add indentation whenever you press Tab or Enter.

A long line of code can be continued with a backslash, e.g.


```
answer ("here is how to continue" & \
    "code across two lines")
```


To have a comment spanning many lines, do this,


```
on mouseUp
    --[[this line is a comment
    and so is this
    and also this]]
    answer "hello, world"
end mouseUp
```


The language is not case sensitive. `on mouseup` and `on mouseUp` are equivalent.

A common data type is a string (i.e. text).


```
put "abc" into x
```


Double-quotes ("), not single-quotes ('), must be used. A string with length 0, "", is perfectly valid and used often to represent a missing value. You may see this referred to as an 'empty string'. You can easily test for an empty string with code like:


```
if x is "" then
    answer "empty string"
end if
```


To include a double-quote character in a string, use the quote constant,


```
answer (quote & "a" & quote) -- displays "a"
```


Valid numbers include `123`, `123.456`, and scientific notation like `1.23e6` which means `1.23` multiplied by (`10` to the `6`th power). Numbers can be in the range `[-1e18, 1e18]`, if a number is taken outside this range a runtime error will be thrown. Division by zero, logarithm of a negative, and so on will also cause a runtime error.

`sqrt(0.5)` is a function call meaning to take the square root of `0.5`. `sum(1, 2)` is a function call that adds 1 and 2 and returns 3. A comma separates the values sent. Function calls can be nested, for example, `sum(1, sum(2, 3))`.

You can call a function in two ways. `the mouseLoc` is the same as `mouseLoc()`. `the length of "abc"` is the same as `length("abc")`.

Buttons and fields are referred to as "objects". Cards are also a type of object. And, the entire project, referred to as a "stack", is an object.

A script can set properties of an object with syntax like:


```
set the width of cd btn "myBtn" to 450
```


Choose the button tool and select a button, and its id will be shown in the panel on the right. One can refer to an object by id in a script:


```
set the width of cd btn id 1234 to 450
```


When you are in the Browse tool and you interact with the page by clicking on buttons or pressing keystrokes, this causes messages to be fired. If you click a button, and if that button has a script that happens to have a function called `on mouseUp` defined, then the code inside `on mouseUp` will be run.

The documentation here has a list of Commands, Event Handlers, and Properties that can be set.




## Expressions



You can use expressions like `put 1+2+3+4 into x` or `put sqrt(0.5) + sqrt(0.6) into y` in your code.

Expressions can use parentheses to contain any level of nested sub-expressions, for example,


```
sqrt(0.5)
sqrt(0.5 + sqrt(0.6))
sqrt(0.5 + sqrt(0.6 + sqrt(0.7)))
```

are all valid.

Parentheses are used to dictate the order of operations, since

```
3*(4+5)
```

gives a different answer than

```
(3*4)+5
```


Parentheses are also used for grouping an expression. For example, we needed to get the (n + 1)th line of a variable, we would type `(line (n + 1) of x)`

Do not type something like

```
answer (line n + 1 of x) -- this is hard to read.
```

which is unclear,

```
answer (line (n + 1) of x) -- this is preferred.
```


In the expression `2 + 3`, the symbol `+` is called an operator.

ViperCard also has logical operators like `and`, `or`, and `not`.

See the `operators` page in the Syntax documentation section

for more information.



## Message Box



Open the Message Box by choosing 'Message Box' from the Go menu, or by pressing Cmd+M.

The message box can be used to quickly try out snippets of code. For example, if you want to evaluate some math, you can open the message box, type `put 12*34`, and press Enter. The result will be shown below.

As another example, if you have two buttons, and you want to align the left sides of the buttons, you can type `set the left of cd btn 2 to the left of cd btn 1`, and press Enter, and the action will be performed.

You can use the Up and Down arrow keys to see previously typed commands.

You can use a semicolon to combine many lines, for example `put 2 into x; put x * 3`

You can use the message box to check or change the contents of a global variable. In fact, any variable mentioned in the message box will be assumed to be a global, so you can write `put 4 into myGlobal` without first needing to declare `global myGlobal`.

In your script, you can add debugging statements that trace a value and show it in the message box, as long as the message box is currently open.


```

put 45 * 56 into x
-- if the msg box is open, will show the value of x
-- otherwise, the line is ignored
put x into the msg box
-- code will continue running

```


The shortened form,


```

put 45 * 56 into x
-- if the msg box is open, will show the value of x
put x
```


is also supported.




## Lists/Arrays



Here's a common way to create a list:


```
put "" into myList
repeat with x = 1 to 5
    put 0 into line x of myList
end repeat
```


Append a number to the list:


```
put newline & 20 after myList
```


Insert a number in the list (if the line doesn't yet exist, it will be added)


```
put 6 into line 8 of myList
```


Add 10 to each element of the list:


```
repeat with x = 1 to the number of lines in myList
    put (line x of myList) + 10 into line x of myList
end repeat

```


`myList` is a normal variable, it can be passed as an argument and so on.

**Two-dimensional lists**

Here's a common way to create a 2-d list:

```
put "" into myList
repeat with x = 1 to 5
    repeat with y = 1 to 5
        put 0 into item x of line y of myList
    end repeat
end repeat
```


Insert a new number into the list (it's ok if the line or item does not yet exist, it will be created):


```
put 3 into item 6 of line 8
```


Add 10 to each element of the list:


```
repeat with y = 1 to the number of lines in myList
    repeat with x = 1 to the number of items in line y of myList
        if length(item x of line y of theLine) > 0 theLine
            add 10 to item x of line y of theLine
        end if
    end repeat
end repeat

```




## Variables



Use a statement like 


```
put 3 into x
```


to put the value "3" into a variable named "x". You don't need to first declare x as a variable.

Variable names and function names are case insensitive.

Variable names cannot begin with a numeral, and can contain underscores but no other punctuation. Certain words cannot be used as variable names because they are already keywords or built-in functions. For example, you cannot have a variable named "line" because this is a keyword. You cannot have a variable named "result" because this is a built-in function.

If you try to read from a variable before it has been introduced, a runtime error will occur. `put notSeenBefore into x` will cause an error unless there is a statement assigning a value to `notSeenBefore`.

Use "global" to declare a variable as a global.

1) it can be accessed from any other script

2) its contents are saved even after the function is complete.

For example,


```
global coordX, coordY
put 1 into coordX
put 2 into coordY
```


If another script says

```
global coordX, coordY
answer coordX, coordY
```

it will read the values that were set.

Global variables are, though, reset when you close the stack (the values

are not saved as part of the project.)

**Data types**

A runtime error can be thrown if a value has the wrong

type, e.g.

```
put "abc" + 4 into z
```

causes a runtime error! The addition operator requires numbers, and so creates a runtime error when getting the string `"abc"`.

If you need to convert from a text type to a number, you can use the functions `strToNumber` and `numberToStr`. For example,

```
ask "please enter a number"
put it into x
if strToNumber(x) is not false then
    answer "the number plus one is" && (strToNumber(x) + 1)
end if

```


For `if` and `else if`, only `true` or `false` are accepted, any other value is a runtime error. For example, to check that a string is not empty, you cannot say `if myVar then`, you have to say something like `if length(myVar) > 0 then` instead.

Note that equality checks account for different data types: 


```
if (456 is "456.00") then answer "yes" -- answers yes
```


A "point" data type is two numbers separated by a comma. You can write:

```

put 1 into x
put 2 into y
set the topleft of cd btn "myBtn" to x, y

```


This is the same as writing

```

set the topleft of cd btn "myBtn" to 1, 2
set the topleft of cd btn "myBtn" to "1, 2"
-- or
set the top of cd btn "myBtn" to 1
set the left of cd btn "myBtn" to 2

```



## User Functions


An example of how to define and call a custom function:

```
function myAddition p1, p2
    return p1 + p2
end myAddition
on mouseUp
    put myAddition(1,2) into x
end mouseUp
```


An example of how to define and call a custom handler:

```
on showMessage p1, p2
    put p1 into cd fld "results1"
    put p2 into cd fld "results2"
end showMessage
on mouseUp
    showMessage "hello", "world"
end mouseUp
```


You can define variadic functions (that accept any number of values), see the documentation for the paramCount() function.

No error is thrown if the incorrect number of arguments is given. Missing arguments are given the empty string ("").

```
myAddition(7, 8, 9) -- the extra argument 9 is ignored
myAddition(7, 8) -- p1 is assigned 7, p2 is assigned 8
myAddition(7) -- p1 is assigned 7, p2 is assigned ""
myAddition() -- p1 is assigned "", p2 is assigned ""
```


You can use recursion.

You can place common code in the current card's script, or the stack's script, so that it can be called by many objects. This is because of the message hierarchy:

Messages bubble upwards from a button or field, to the parent card, to the stack, until they are handled.
* If you click on a button:
    * A mouseUp message is created
    * Script of the button is examined. 
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass mouseUp', continue:
    * Script of the current card is examined.
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass mouseUp', continue:
    * Script of the current stack is examined.
    * If there is an 'on mouseUp' handler,
        * Run the code in the mouseUp handler.

* Similarly, if you are typing text in a field, and type the letter 'a':
    * A afterKeyUp message is created
    * Script of the current field is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the afterKeyUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass afterKeyUp', continue:
    * Script of the current card is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the afterKeyUp handler.
        * If the handler completes, stop running code, we're done.
        * If the handler calls 'pass afterKeyUp', continue:
    * Script of the current stack is examined.
    * If there is an 'on afterKeyUp' handler,
        * Run the code in the mouseUp handler.

Calling `exit to ViperCard` passes the message up to ViperCard to be handled, and then exits all code execution. So it has two uses, it will exit all code execution, and will also fall back to the default ViperCard behavior.

See documentation of the 'pass' command for more information.

Calls to custom commands and procedures also bubble upwards in the same way. A function in the stack's script can be called from any handler on a card, field, or button. A function in the card's script can be called from any handler in a field or button. So, it is useful to put commonly used utility code in a stack script so that it can be called from anywhere.



## Text and Chunks



**Lines**

Use `newline` to refer to a new line character.

Let's say you wanted two lines of text in a field, you would use

the following:


```
put "first line" & newline & "second line" into cd fld "myFld"
```


(You shouldn't have to be concerned with platform differences: the constants 'return', 'cr', 'linefeed' are present for compatibility, but they are all equivalent. For convenience, copying and pasting text in and out of ViperCard will automatically translate newline characters, for example if you are running windows, when you copy text we'll automatically convert to \r\n newlines so it will work seemlessly with other software. Internally, ASCII 10 represents newline.)

**Chunks**

ViperCard can process text by using chunks. If you have a tab-separated list you can get the nth item like this:


```

put "ab" & tab & "cd" & tab & "ef" into myList
set the itemDelimiter to tab
put 2 into n
answer "Result:" & item n of myList

```

If you have a comma-separated list you can get the nth item like this:


```

put "ab,cd,ef" into myList
set the itemDelimiter to ","
put 2 into n
answer "Result:" & item n of myList

```


More advanced examples:


```

answer char 2 of "abcd"
answer char (n + 1) of "abcd"
answer char 2 to 4 of "abcd"

answer item 2 of "ab,cd,ef,gh"
answer item (n + 1) of "ab,cd,ef,gh"
answer item 2 to 4 of "ab,cd,ef,gh"

answer first item of "ab,cd,ef,gh"
answer last item of "ab,cd,ef,gh"
answer any item of "ab,cd,ef,gh"

put "ab" & newline & "cd" & newline & "ef" into myList
answer line 2 of myList
answer line (n + 1) of myList
answer line 2 to 3 of myList

```


Recursive scopes:

```

put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList

answer item 2 of line 2 of myList
answer char 2 of line 2 of myList
answer char 2 of item 2 of line 2 of myList

answer char 2 to 3 of item 2 to 3 of line 2 to 3 of myList

```



**Modifying by chunk**


```

put "abcd" into x
put "A" into char 2 of x
put "A" into char 2 to 4 of x

put "10,20,30" into myList
put "A" into item 2 of myList
put "A" into item 2 to 3 of myList
multiply item 2 of myList by 5
add 1 to item 2 of myList

put "A" into first item of myList
put "A" into last item of myList
put "A" into any item of myList

put "A" into before item 2 of myList
put "A" into after item 2 of myList
put "A" into before char 2 of item 2 of myList

put "A" into before item 2 of cd fld "myFld"
put "A" into after item 2 of cd fld "myFld"
put "A" into before char 2 of item 2 of cd fld "myFld"

put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList
put "A" into item 2 of line 2 of myList
put "A" into char 2 of line 2 of myList
put "A" into char 2 of item 2 of line 2 of myList

put "A" into char 2 to 3 of item 2 to 3 of line 2 to 3 of myList

```


**Backwards compatiblity**

We went to much effort to maintain fidelity with HyperCard's chunk processing. All of the above can be done with words:


```

put "ab cd ef" into x
answer word 2 of x
answer word 2 to 3 of x
put "A" into word 2 of x
put "A" into word 2 to 3 of x
put "A" into char 2 to 3 of word 2 to 3 of x

```


To enable full compatibility with HyperCard, go to `Object->Stack info...` and turn on compatibility mode. Chunk handling will now be identical (including the non-intuitive behavior seen below).


```

-- if compatibility mode is on:
-- we follow HyperCard's non-intuitive behavior for the following:
put "ab,cd" & newline & "ef,gh" & newline & "ij,kl" into myList
put "A" into item 3 of item 4 of myList
put "A" into item 3 of char 2 of myList
delete item 3 of item 4 of myList
delete item 3 of char 2 of myList
add 1 to item 3 of item 4 of myList
add 1 to item 3 of char 2 of myList
answer item 0 of myList
put "A" into item 0 of myList
answer item 4 to 1 of myList
put "A" into item 4 to 1 of myList


-- The only known cases we don't support (we'll throw a runtime error):
answer item -1 of myList
put "A" into item -1 of myList
delete item -1 of myList
answer char 2 of item 4 to 1 of myList
put "A" into char 2 of item 4 to 1 of myList
delete char 2 of item 4 to 1 of myList
delete item 2 to 3 of myList

```


See also documentation for the `delete` command.


## Objects


Ways to refer to a button or field:

```

cd btn id 1234
cd btn "myBtn"
cd btn 2
first cd btn
any cd btn
last cd btn

```


Ways to refer to a card:

```

this card
prev card
next card
first card
second card
last card
card 1
card id 1234
card "name"

```


Ways to refer to a background:

```

this background
prev background
next background
first background
second background
last background
bg 1
bg id 1234
bg "name"

```


Ways to refer to a stack:

```

this stack
stack 1
stack "name"

```

Other ways to refer to objects:

```

answer the name of the target
answer the name of me
answer the name of the owner of cd btn id 1234
put "cd btn id 1234" into x
answer the name of x

function whichObject
    return "cd btn id 1234"
end whichObject
answer the name of whichObject()

```



## Structure



**Loops**

```
repeat with x = 1 to 3
    ...other code here...
end repeat
```


Refer to `repeat` under "syntax" for more information.

**If statements**

```
if x > 1 then
    ...other code here...
else
    ...other code here...
end if
```

Refer to `if` under "syntax" for more information.


**Scripts**

No code can exist outside of a handler or function.

**Handlers**

Handlers look like this


```
on mouseup 
    answer "hello world"
end mouseup
```

    
and respond to an event message.
    
**Functions**

Functions look like this


```
function myAddition p1, p2
    return p1 + p2
end myAddition
```


They can then be called with code like

```
put myAddition(1,2) into x
```

Functions inside of functions are not supported.


**Statements**

You cannot have a line that is just

`sqrt(0.5)`

with no command, this is a syntax error.
    
Statements occur on separate lines, there's no way to have more than one statement on a line.
    
**Expressions**

A set of computations such as `1+2+3+4` or `sqrt(0.5) + sqrt(0.6)` is an expression. Most places that take a value can be given an expression, for example,


```
go card 2
-- is the same as
put 1 into x
go card (x + 1)

put "abc" into cd fld "myFld1"
put "abc" into cd fld (prefix & "1")

put "a" into line 4 of myList
put "a" into line (x+1) of myList

set the left of cd btn "myBtn" to x
set the left of cd btn "myBtn" to (45 + 50 * cos(theta))

```



## Examples


The tutorial videos show helpful example code.

Example 1:

```

-- after creating a field called "myFld":
-- create a btn and put this in its script:
on mouseUp
    -- when you click button "Go", you get 10 points!
    put cd fld "myFld" into score
    put (score + 10) into score
    put score into cd fld "myFld"
end mouseUp


```


Example 2:

```

-- after creating a btn called "fish":
-- create a btn and put this in its script:
on mouseUp
    -- when you click this, the fish moves
    put the top of cd btn "fish" into y
    subtract 10 from y
    set the top of cd btn "fish" to y
end mouseUp


```

Example 3:

```

-- create interactive art.
-- put this in the card script,
-- then when you choose the browse tool and 
-- click on the card, it will draw lines.

on mouseUp
    put the clickH into X
    put the clickV into y
    
    -- choose the line tool to draw lines
    choose "line" tool
    
    -- make a loop that will repeat 10 times
    repeat 10 times
        put random(80) into randx
        put random(80) into randy
        -- will get random # between 1 and 80
        drag from x, y to (x + randx), (y + randy)
    end repeat
end mouseUp
  

```




## Tips & Shortcuts



General tips

* If your script is caught in an infinite loop, click the Stop button (black rectangle) to stop the script
* See more error details, when in the Script Editor, by clicking on the error excerpt
* Double-click the eraser tool to clear paint on the current card

Keyboard shortcuts when editing text,

* Cmd+C to copy
* Cmd+X to cut
* Cmd+V to paste
* Cmd+A to select all
* Cmd+Backspace to delete entire word
* PageUp / PageDown to scroll one page
* Shift+PageUp / Shift+PageDown to select one page
* Home to move to start of line
* Shift+Home to select to start of line
* Cmd+Home to move to the start
* Cmd+Shift+Home to select to the start
* Left Arrow to move to the left
* Shift+Left Arrow to select to the left
* Cmd+Left Arrow to move left one word
* Cmd+Shift+Left Arrow to select left one word
* Cmd+Arrow Up to scroll up
* Cmd+Arrow Down to scroll down
* Cmd+D to duplicate the current line
* Cmd+L to delete the current line
* Cmd+Q to quickly comment-out or uncomment the current line
* Cmd+Q when many lines are selected to comment-out all of them
* Cmd+Q to comment-out a block of code
* Tab key, to auto-indent code in a script

Some of the main differences between ViperCard and HyperCard:
* ViperCard is open source software that can run in any modern web browser
* you can export stacks as a modern json format
* art-stamps feature for adding clip art
* new animation features like save-to-gif
* in ViperCard you have to hit Save to save changes
* but in ViperCard you have extensive undo history and can even undo changes made by a script

A few of the differences between ViperCard and HyperCard:
* You can use `--[[block comments]]` that span many lines.
* You can write `exit to ViperCard` instead of `exit to HyperCard`
* You must specify `cd` or `bg` when referring to a button or field, unless compatibility mode is enabled (Object->Stack Info)
* Currently: message chain for key events is different, on afterkeydown to indicate cannot prevent default action.
* Scripts only run when browse tool is active; you can exit an infinite loop by changing the current tool
* You cannot read a variable that has not been set. `put unsetVar into x` causes a runtime error.
* hilite and checkmark are separate properties
* label and name are separate properties
* You can't have a variable named id, short, long, first, and so on.
* The `choose` command sets the emulated current tool, not the actual tool, and is limited to certain paint operations
* The newline character is \n and not \r




## What's New


New in 0.24
* Script stack trace
* Use `get the shiftKey`, deprecate `get the shiftKey()`
* You can say `the sin of 4`
* You can say `sin of 4`, `sin of cd fld 1`
* Continue lines with logical-not, press `Alt-Enter` in code editor
* Block comments `--[[a comment]]`
* You can use `select`, `mark`, `doMenu` commands
* You can turn on compat mode to allow `put "a" into fld 1`
* Everything is case insensitive, even `cd btn "aBcDe"`
* Improvements to `send` and `do`, script error shown in more helpful line
* Improvements to built in functions like `selectedText`
* Improvements to click features like `wait until the mouseClick`
* You can say `put "card id 2590" into xx; put the name of xx into y`
* You can use values for coords, e.g. `put "3,4" into c; set the loc of cd btn 1 to c`
* Better match subtle differences between `target` and `the target`
* Single-line `if` statements, fewer parentheses needed
* Call custom functions from anywhere
* Better cursors, better rendering on different screen resolutions
* More fonts, all fonts have pixel-perfect spacing
* You can use recursive chunks like `put "a" into char 7 of line 3 of x`
* Improvements to load time by loading some libraries asynchronously
* Common commands in script execution are faster
* Scripts can dynamically create/delete objects, and set scripts
* New features like `set the textstyle of line 3 of cd fld "myFld" to "toggle-bold"`



## Credits



ViperCard

https://github.com/moltenform/vipercard

Copyright (C) 2020 Ben Fisher

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.

ViperCard uses the following libraries:

* Chevrotain
    * https://github.com/SAP/chevrotain
    * Apache License 2.0
* FileSaver.js
    * https://github.com/eligrey/FileSaver.js
    * MIT License
* Golly
    * https://github.com/dannygarcia/golly
    * MIT License
* js-lru
    * https://github.com/rsms/js-lru
    * MIT License
* Clipboard.js
    * https://github.com/zenorocha/clipboard.js
    * MIT License
* base64js
    * https://github.com/beatgammit/base64-js
    * MIT License
* JSGIF
    * https://github.com/antimatter15/jsgif
    * MIT License
* Bresenham easy.filter
    * http://members.chello.at/easyfilter/bresenham.html
    * written permission of author
* lz-string
    * https://github.com/pieroxy/lz-string
    * MIT License
* Pizzicato
    * https://github.com/alemangui/pizzicato
    * MIT License
* Bowser
    * https://github.com/lancedikson/bowser
    * MIT License
* types-text-encoding 
    * https://www.npmjs.com/package/@types/text-encoding
    * MIT License
* deep-freeze
    * https://github.com/substack/deep-freeze
    * Public domain
* pbkdf2 gist by Chris Veness
* description of Mac OS Roman character set
    * https://en.wikipedia.org/wiki/Mac_OS_Roman
    * http://creativecommons.org/licenses/by-sa/3.0/
    * Creative Commons Attribution-ShareAlike
* and a small excerpt from the SciTE code editor,
* ported from C++ to TypeScript by Ben Fisher
* SciTE
    * https://www.scintilla.org/License.txt



================================================
FILE: vipercard/doc/reference_02_commands
================================================


============================================================
========================= add
============================================================

Adds the value of number to the number in a container.

Examples:

put 2 into x
add 3 to x
answer x -- will display "5"

put "1,2,3" into x
add 3 to item 2 of x
answer x -- will display "1,5,3"

add 5 to cd fld "myFld"

============================================================
========================= answer
============================================================

Displays a dialog box.

The button that is pressed (1, 2, or 3) will be assigned to the variable "it".

Examples:

answer "abc" -- will display "abc"

answer "are you sure?" with "OK" or "cancel" 
put it into whichChosen
if whichChosen is 1 then
answer "clicked OK"
else if whichChosen is 2 then
answer "clicked cancel"
end if

answer "many choices" with "btn1" or "btn2"  or "btn3" 
answer whichChosen


============================================================
========================= ask
============================================================

Displays a dialog box allowing the user to type in a response.

The text typed will be assigned to the variable `it`. If the user clicks `Cancel`, the result will be `""`.

You can say `ask "prompt"` or `ask "prompt" with "default text"`.

Examples:

ask "what is your name?" with "ben"
put it into yourName
if yourName is "" then
    answer "you did not type a name"
else
    answer "you typed" && yourName
end if

============================================================
========================= beep
============================================================


Play the system beep sound.

============================================================
========================= choose tool
============================================================


You can use the choose command to programmatically draw shapes and lines.

When a script completes, you'll be taken back to the Browse tool regardless of which tool was chosen within a script.

The form `choose "brush" tool` and `choose tool 3` is also supported.

Examples:

choose pencil tool
click at 10,20
-- this draws a black pixel at the coordinates x=10, y=20

choose line tool
drag from 10,20 to 30,40
-- this draws a line starting at the coordinates (10,20) 
-- ending at (30,40)

-- tools include:
brush
bucket
pencil
line
rect
oval
roundrect
curve
spray
browse

============================================================
========================= click
============================================================

Use the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.

Examples:

choose pencil tool
click at 10,20
-- this draws a pixel at the coordinates x=10, y=20


============================================================
========================= create
============================================================

Use `domenu "new button"` or `domenu "new field"` to create a button.

Examples:

doMenu "New Button"
put the result into newBtn
set the name of cd btn id newBtn to "my new button"
set the loc of cd btn id newBtn to 30, 30

============================================================
========================= do
============================================================

Take a string, and execute it as if it were a ViperCard script.

Similar to eval() in other languages.

Examples:

put "answer " into buildScript
put quote & "abc" & quote after buildScript
do buildScript

============================================================
========================= doMenu
============================================================

Do a menu action.

Supported actions include:

`
doMenu "new card"
doMenu "delete card"
doMenu "first"
doMenu "prev"
doMenu "next"
doMenu "last"
doMenu "new button"
doMenu "new field"
doMenu "duplicate card paint"

-- all items from the Draw menu like
doMenu "black fill"
-- all items from the Font menu like
doMenu "helvetica"
-- all items from the Style menu like
doMenu "14"

`

============================================================
========================= dial
============================================================

The dial command generates touch-tone sounds for the digits in the number, through the speaker. To dial the phone from ViperCard, you must either hold the handset up to the speaker of your computer or use a device that feeds computer audio output to the telephone.

Note: If you include a hypen in the number, place the entire expression in quotation marks. Otherwise, ViperCard performs a subtraction before dialing the number.

The first time the `dial` command is run, the sounds might not be played because they might not have been loaded yet. Use `dial "" ` when your program starts to ensure that the sounds are loaded.

Examples:

dial "" -- begin loading the dial tone sounds
wait 4 seconds
dial "555-1234"

============================================================
========================= disable
============================================================

Disables a button (sets the "enabled" property to true, so that the button no longer responds to clicks).

============================================================
========================= divide
============================================================

Divides the number in a container by a number.

Examples:

put 12 into x
divide x by 3
answer x -- will display "4"

put "1,12,3" into x
divide item 2 of x by 3
answer x -- will display "1,4,3"


============================================================
========================= delete (object or text)
============================================================

^Deleting objects^

`-- delete objects
delete cd btn "myBtn"
delete card 14`

^Deleting text^

`put "abcde" into x
delete char 2 of x
answer x -- shows "acde"`

`put "abcde" into x
delete char 2 to 4 of x
answer x -- shows "ae"`

`put "abcde" into cd fld 1
delete char 2 to 4 of cd fld 1`

Deleting words, lines and items is also supported for compatibility with HyperCard but is not recommended in new code, as HyperCard's behavior can be inconsistent and non-intuitive.

Examples:

-- we support complex expressions
delete char 2 to 4 of item 3 of line 5 of myVar
delete item 3 of line 3 to 5 of myVar
delete first item of myVar
delete second item of myVar
delete last item of myVar
delete item 3 of myVar
delete line 3 of myVar
delete word 3 of myVar

-- we do not support backwards ranges
delete item 3 to 2 of myVar

-- we do not support out-of-order scopes
-- (unless you go Object->Stack Info and turn on compatibility mode)
delete line 3 of item 3 of myVar -- error
delete item 3 of word 3 of myVar -- error
delete word 3 of char 3 of myVar -- error
delete word 3 of word 4 of myVar -- error

-- we do not support deleting a range (unless chars)
delete word 3 to 5 of myVar -- not yet supported



============================================================
========================= drag
============================================================

Use the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.

Examples:

choose line tool
drag from 10,20 to 30,40
-- this draws a line starting at the coordinates (10,20) 
-- ending at (30,40)

choose curve tool
drag from 10,20 to 30,40 to 50,60


============================================================
========================= enable
============================================================

Enables a button (sets the "enabled" property to false, so that the button is no longer disabled).

============================================================
========================= go to card
============================================================

Go to a different card.

Examples:

go to card 1 -- goes to first card
go first -- goes to first card
go last -- goes to last card
go next -- goes to the next card
go prev -- goes to the previous card

The following are supported:
last
middle
any
first
second
third
fourth
fifth
sixth
seventh
eigth
ninth
tenth
next
previous
this
mid
prev

('go back' and 'go forth' are supported for compatibility with old scripts.)


============================================================
========================= hide
============================================================

Hides a button or field.
(sets the "visible" to false)

============================================================
========================= multiply
============================================================

Multiplies the number in a container by a number.

Examples:

put 12 into x
multiply x by 3
answer x -- will display "36"

put "1,12,3" into x
multiply item 2 of x by 3
answer x -- will display "1,36,3"

multiply cd fld 1 by 5

============================================================
========================= lock___screen
============================================================

This feature will arrive in a future version...

============================================================
========================= play
============================================================


Play a sound effect.

For example, to play a chime sound,

`play "glider_1_Extra" load
wait 4 seconds
play "glider_1_Extra"`

You should load the sounds you will use in advance, such as in a game initialize() routine, so that when you play them, there will not be a delay.

You can't say `play ("glider" & x)`, instead do the equivalent `put "glider" & x into tmp; play tmp`

ViperCard can play the following sounds:

`glider_1_Aww
glider_1_Bass
glider_1_BeamIn
glider_1_BlowerOn
glider_1_Bounce
glider_1_Clock
glider_1_Crunch
glider_1_Drip
glider_1_Energize
glider_1_Extra
glider_1_FireBand
glider_1_GetBand
glider_1_GoodMove
glider_1_GreaseFall
glider_1_Guitar
glider_1_Hey!
glider_1_Lightning
glider_1_LightsOn
glider_1_Pop
glider_1_Push
glider_1_Shredder
glider_1_Tick
glider_1_ToastDrop
glider_1_ToastJump
glider_1_Yow!
glider_1_Zap`

============================================================
========================= put
============================================================

Put an expression into a variable or field.

Examples:

put 2+3 into x
answer x -- shows 5

put "hello" into cd fld "message"

put "aa,bb,cc" into x
put "11" into item 2 of x
answer x -- shows "aa,11,cc"

put "abc" into x
put "q" into char 2 of x
answer x -- shows "aqc"

put "appended text" after x
put "prepended text" before x

-- if the message box is open, you can display the contents of a variable into the message box,
-- this is similar to "print" or "writeline" in other languages.
put 2+3 into x
put x into the msg box


============================================================
========================= replace
============================================================

Replace all occurrences of a string.

Examples:
put "a-b-c" into x
replace "-" with "_" in x
answer x -- shows a_b_c


-- you can also use replace in a field.
put "-" into search
put "_" into replacement
replace search with replacement in cd fld "myFld"

============================================================
========================= select
============================================================

Set the selection in a field. For this to take effect, the field must be on the current card.
Examples:

-- set the selection
select char 2 to 4 of cd fld "myFld"
select line 3 of cd fld "myFld"
select item 2 to 3 of cd fld "myFld"

-- set the caret position
select before char 3 of cd fld "myFld"
select before line 3 of cd fld "myFld"
select after char 3 of cd fld "myFld"
select before text of cd fld "myFld"
select after text of cd fld "myFld"

-- select all
select text of cd fld "myFld"

-- clear selection
select empty

-- look up field by string
select char 1 of the selectedField

============================================================
========================= send
============================================================

Take a string, and execute it as if it were a ViperCard script in the context of an object.

Messages in ViperCard automatically travel upwards from button to card, background, and then stack.

But by using the 'send' command, you can send a message to any target -- from a card down to a button, from one card to a different card, and so on. One case where this is helpful is if you have a large amount of code in one script: subroutines can be moved to other objects and called via send.

Examples:

-- sending a message to a different card
send "prepareNextCard" to card "otherCard"

-- simulate a button click
send "mouseUp" to cd btn "myButton"

-- if you have hundreds of lines of code in one script, this
-- can feel disorganized. with "send" you can store code
-- in other objects, for example, moving
-- mathematical computation to a different card or button.
-- in the script of cd btn "mathUtils" of card "otherCard", write
on myCompute a, b
return a * a + b
end myCompute

-- from another script
send "myCompute 3, 4" to cd btn "mathUtils" of card "otherCard"
put the result into x

============================================================
========================= set
============================================================

Use the set command to change a property.
A few examples:

`set the width of cd btn "myButton" to 100
set the topLeft of cd btn "myButton" to 24, 25
put the long name of btn "myButton" into x
set the textsize of char 2 to 4 of cd fld "myFld" to 18 
set the itemdelimiter to "|"`

See the "Properties" section of documentation for more.


============================================================
========================= show
============================================================

Shows a button or field.
(sets the "visible" to true)

============================================================
========================= sort
============================================================

New: 'sort by each' expressions.

Sort styles:
* text sorting (default), compares text, not case sensitive.
* numeric sorting, interpret as numbers, e.g. 10 sorts after 2.
* ascending (default)
* descending

Sort granularity:
* sort items of x
* sort lines of x
* sort chars of x

Examples:

put "aa,cc,bb" into x
sort items of x
answer x -- displays "aa,bb,cc"

put "aa|cc|bb" into x
set the itemDelimiter to "|"
sort items of x
answer x -- displays "aa|b|cc"

put "ac,bb,ca" into x
sort items of x by char 2 of each
answer x -- displays "ca,bb,ac"

-- numeric is needed!
put "12,24,1,5" into x
sort items of x numeric
answer x -- displays "1,5,12,24"

put "12,24,1,5" into x
sort descending items of x numeric
answer x -- displays "24,12,5,1"


============================================================
========================= subtract
============================================================

Subtracts a number from the number in a container.

Examples:

put 12 into x
subtract 3 from x
answer x -- will display "9"

put "1,12,3" into x
subtract 3 from item 2 of x
answer x -- will display "1,9,3"

subtract 1 from cd fld "myFld"

============================================================
========================= unlock___screen
============================================================

This feature will arrive in a future version...


============================================================
========================= wait
============================================================

Pauses the script. By default waits in "ticks", which are 60th of a second.

Examples:

wait 500 ms -- pauses for half a second.

--(A paused script can be terminated by clicking the Stop icon in the
--navigation palette, or by changing to the button or field tool.)

wait until the mouseH > 120
wait until the shiftKey
wait until the mouseClick -- now supported

wait 5 seconds
wait 5 ticks
wait 5 milliseconds
wait 5 ms

============================================================
========================= visual___effect
============================================================

This feature will arrive in a future version...



================================================
FILE: vipercard/doc/reference_02_commands.md
================================================
<!---
this is a generated file, changes will be lost.
-->

[Overview](./reference_01_overview.md) | Commands | [Syntax](./reference_03_syntax.md) | [Properties](./reference_04_properties.md) | [Functions](./reference_05_functions.md) | [Event Handlers](./reference_06_events.md) | [Compatibility](./reference_07_compatibility.md)



## add


Adds the value of number to the number in a container.

Examples:

```


put 2 into x
add 3 to x
answer x -- will display "5"

put "1,2,3" into x
add 3 to item 2 of x
answer x -- will display "1,5,3"

add 5 to cd fld "myFld"


```



## answer


Displays a dialog box.

The button that is pressed (1, 2, or 3) will be assigned to the variable "it".

Examples:

```


answer "abc" -- will display "abc"

answer "are you sure?" with "OK" or "cancel" 
put it into whichChosen
if whichChosen is 1 then
answer "clicked OK"
else if whichChosen is 2 then
answer "clicked cancel"
end if

answer "many choices" with "btn1" or "btn2"  or "btn3" 
answer whichChosen



```



## ask


Displays a dialog box allowing the user to type in a response.

The text typed will be assigned to the variable `it`. If the user clicks `Cancel`, the result will be `""`.

You can say `ask "prompt"` or `ask "prompt" with "default text"`.

Examples:

```


ask "what is your name?" with "ben"
put it into yourName
if yourName is "" then
    answer "you did not type a name"
else
    answer "you typed" && yourName
end if


```



## beep



Play the system beep sound.


## choose tool



You can use the choose command to programmatically draw shapes and lines.

When a script completes, you'll be taken back to the Browse tool regardless of which tool was chosen within a script.

The form `choose "brush" tool` and `choose tool 3` is also supported.

Examples:

```


choose pencil tool
click at 10,20
-- this draws a black pixel at the coordinates x=10, y=20

choose line tool
drag from 10,20 to 30,40
-- this draws a line starting at the coordinates (10,20) 
-- ending at (30,40)

-- tools include:
brush
bucket
pencil
line
rect
oval
roundrect
curve
spray
browse


```



## click


Use the click command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.

Examples:

```


choose pencil tool
click at 10,20
-- this draws a pixel at the coordinates x=10, y=20



```



## create


Use `domenu "new button"` or `domenu "new field"` to create a button.

Examples:

```


doMenu "New Button"
put the result into newBtn
set the name of cd btn id newBtn to "my new button"
set the loc of cd btn id newBtn to 30, 30


```



## do


Take a string, and execute it as if it were a ViperCard script.

Similar to eval() in other languages.

Examples:

```


put "answer " into buildScript
put quote & "abc" & quote after buildScript
do buildScript


```



## doMenu


Do a menu action.

Supported actions include:


```

doMenu "new card"
doMenu "delete card"
doMenu "first"
doMenu "prev"
doMenu "next"
doMenu "last"
doMenu "new button"
doMenu "new field"
doMenu "duplicate card paint"

-- all items from the Draw menu like
doMenu "black fill"
-- all items from the Font menu like
doMenu "helvetica"
-- all items from the Style menu like
doMenu "14"


```



## dial


The dial command generates touch-tone sounds for the digits in the number, through the speaker. To dial the phone from ViperCard, you must either hold the handset up to the speaker of your computer or use a device that feeds computer audio output to the telephone.

Note: If you include a hypen in the number, place the entire expression in quotation marks. Otherwise, ViperCard performs a subtraction before dialing the number.

The first time the `dial` command is run, the sounds might not be played because they might not have been loaded yet. Use `dial "" ` when your program starts to ensure that the sounds are loaded.

Examples:

```


dial "" -- begin loading the dial tone sounds
wait 4 seconds
dial "555-1234"


```



## disable


Disables a button (sets the "enabled" property to true, so that the button no longer responds to clicks).


## divide


Divides the number in a container by a number.

Examples:

```


put 12 into x
divide x by 3
answer x -- will display "4"

put "1,12,3" into x
divide item 2 of x by 3
answer x -- will display "1,4,3"



```



## delete (object or text)


**Deleting objects**


```
-- delete objects
delete cd btn "myBtn"
delete card 14
```


**Deleting text**


```
put "abcde" into x
delete char 2 of x
answer x -- shows "acde"
```



```
put "abcde" into x
delete char 2 to 4 of x
answer x -- shows "ae"
```



```
put "abcde" into cd fld 1
delete char 2 to 4 of cd fld 1
```


Deleting words, lines and items is also supported for compatibility with HyperCard but is not recommended in new code, as HyperCard's behavior can be inconsistent and non-intuitive.

Examples:

```


-- we support complex expressions
delete char 2 to 4 of item 3 of line 5 of myVar
delete item 3 of line 3 to 5 of myVar
delete first item of myVar
delete second item of myVar
delete last item of myVar
delete item 3 of myVar
delete line 3 of myVar
delete word 3 of myVar

-- we do not support backwards ranges
delete item 3 to 2 of myVar

-- we do not support out-of-order scopes
-- (unless you go Object->Stack Info and turn on compatibility mode)
delete line 3 of item 3 of myVar -- error
delete item 3 of word 3 of myVar -- error
delete word 3 of char 3 of myVar -- error
delete word 3 of word 4 of myVar -- error

-- we do not support deleting a range (unless chars)
delete word 3 to 5 of myVar -- not yet supported




```



## drag


Use the drag command for programmatically drawing pictures. Remember to first use the choose command to indicate what to draw.

Examples:

```


choose line tool
drag from 10,20 to 30,40
-- this draws a line starting at the coordinates (10,20) 
-- ending at (30,40)

choose curve tool
drag from 10,20 to 30,40 to 50,60



```



## enable


Enables a button (sets the "enabled" property to false, so that the button is no longer disabled).


## go to card


Go to a different card.

Examples:

```


go to card 1 -- goes to first card
go first -- goes to first card
go last -- goes to last card
go next -- goes to the next card
go prev -- goes to the previous card

The following are supported:
last
middle
any
first
second
third
fourth
fifth
sixth
seventh
eigth
ninth
tenth
next
previous
this
mid
prev

('go back' and 'go forth' are supported for compatibility with old scripts.)



```



## hide


Hides a button or field.

(sets the "visible" to false)


## multiply


Multiplies the number in a container by a number.

Examples:

```


put 12 into x
multiply x by 3
answer x -- will display "36"

put "1,12,3" into x
multiply item 2 of x by 3
answer x -- will display "1,36,3"

multiply cd fld 1 by 5


```



## lock screen


This feature will arrive in a future version...


## play



Play a sound effect.

For example, to play a chime sound,


```
play "glider_1_Extra" load
wait 4 seconds
play "glider_1_Extra"
```


You should load the sounds you will use in advance, such as in a game initialize() routine, so that when you play them, there will not be a delay.

You can't say `play ("glider" & x)`, instead do the equivalent `put "glider" & x into tmp; play tmp`

ViperCard can play the following sounds:


```
glider_1_Aww
glider_1_Bass
glider_1_BeamIn
glider_1_BlowerOn
glider_1_Bounce
glider_1_Clock
glider_1_Crunch
glider_1_Drip
glider_1_Energize
glider_1_Extra
glider_1_FireBand
glider_1_GetBand
glider_1_GoodMove
glider_1_GreaseFall
glider_1_Guitar
glider_1_Hey!
glider_1_Lightning
glider_1_LightsOn
glider_1_Pop
glider_1_Push
glider_1_Shredder
glider_1_Tick
glider_1_ToastDrop
glider_1_ToastJump
glider_1_Yow!
glider_1_Zap
```



## put


Put an expression into a variable or field.

Examples:

```


put 2+3 into x
answer x -- shows 5

put "hello" into cd fld "message"

put "aa,bb,cc" into x
put "11" into item 2 of x
answer x -- shows "aa,11,cc"

put "abc" into x
put "q" into char 2 of x
answer x -- shows "aqc"

put "appended text" after x
put "prepended text" before x

-- if the message box is open, you can display the contents of a variable into the message box,
-- this is similar to "print" or "writeline" in other languages.
put 2+3 into x
put x into the msg box



```



## replace


Replace all occurrences of a string.

Examples:

```

put "a-b-c" into x
replace "-" with "_" in x
answer x -- shows a_b_c


-- you can also use replace in a field.
put "-" into search
put "_" into replacement
replace search with replacement in cd fld "myFld"


```



## select


Set the selection in a field. For this to take effect, the field must be on the current card.

Examples:

```


-- set the selection
select char 2 to 4 of cd fld "myFld"
select line 3 of cd fld "myFld"
select item 2 to 3 of cd fld "myFld"

-- set the caret position
select before char 3 of cd fld "myFld"
select before line 3 of cd fld "myFld"
select after char 3 of cd fld "myFld"
select before text of cd fld "myFld"
select after text of cd fld "myFld"

-- select all
select text of cd fld "myFld"

-- clear selection
select empty

-- look up field by string
select char 1 of the selectedField


```



## send


Take a string, and execute it as if it were a ViperCard script in the context of an object.

Messages in ViperCard automatically travel upwards from button to card, background, and then stack.

But by using the 'send' command, you can send a message to any target -- from a card down to a button, from one card to a different card, and so on. One case where this is helpful is if you have a large amount of code in one script: subroutines can be moved to other objects and called via send.

Examples:

```


-- sending a message to a different card
send "prepareNextCard" to card "otherCard"

-- simulate a button click
send "mouseUp" to cd btn "myButton"

-- if you have hundreds of lines of code in one script, this
-- can feel disorganized. with "send" you can store code
-- in other objects, for example, moving
-- mathematical computation to a different card or button.
-- in the script of cd btn "mathUtils" of card "otherCard", write
on myCompute a, b
return a * a + b
end myCompute

-- from another script
send "myCompute 3, 4" to cd btn "mathUtils" of card "otherCard"
put the result into x


```



## set


Use the set command to change a property.

A few examples:


```
set the width of cd btn "myButton" to 100
set the topLeft of cd btn "myButton" to 24, 25
put the long name of btn "myButton" into x
set the textsize of char 2 to 4 of cd fld "myFld" to 18 
set the itemdelimiter to "|"
```


See the "Properties" section of documentation for more.



## show


Shows a button or field.

(sets the "visible" to true)


## sort


New: 'sort by each' expressions.

Sort styles:
* text sorting (default), compares text, not case sensitive.
* numeric sorting, interpret as numbers, e.g. 10 sorts after 2.
* ascending (default)
* descending

Sort granularity:
* sort items of x
* sort lines of x
* sort chars of x

Examples:

```


put "aa,cc,bb" into x
sort items of x
answer x -- displays "aa,bb,cc"

put "aa|cc|bb" into x
set the itemDelimiter to "|"
sort items of x
answer x -- displays "aa|b|cc"

put "ac,bb,ca" into x
sort items of x by char 2 of each
answer x -- displays "ca,bb,ac"

-- numeric is needed!
put "12,24,1,5" into x
sort items of x numeric
answer x -- displays "1,5,12,24"

put "12,24,1,5" into x
sort descending items of x numeric
answer x -- displays "24,12,5,1"



```



## subtract


Subtracts a number from the number in a container.

Examples:

```


put 12 into x
subtract 3 from x
answer x -- will display "9"

put "1,12,3" into x
subtract 3 from item 2 of x
answer x -- will display "1,9,3"

subtract 1 from cd fld "myFld"


```



## unlock screen


This feature will arrive in a future version...



## wait


Pauses the script. By default waits in "ticks", which are 60th of a second.

Examples:

```


wait 500 ms -- pauses for half a second.

--(A paused script can be terminated by clicking the Stop icon in the
--navigation palette, or by changing to the button or field tool.)

wait until the mouseH > 120
wait until the shiftKey
wait until the mouseClick -- now supported

wait 5 seconds
wait 5 ticks
wait 5 milliseconds
wait 5 ms


```



## visual effect


This feature will arrive in a future version...



================================================
FILE: vipercard/doc/reference_03_syntax
================================================



============================================================
========================= (Operators)
============================================================

Here are the operators that can be used.
`2 * 3`
multiplication
`2 / 3`
division
`2 $caret$ 3`
raise to the third power
`7 div 5`
truncated division
`7 mod 5`
modulo
`2 > 3`
greater than
`2 < 3`
less than
`2 >= 3`
greater than or equal to
`2 <= 3`
less than or equal to
`2  ==  3`
equal to
`2  !=  3`
not equal to
`"abc" is "def"`
equal to
`"abc" is not "def"`
not equal to
`"abc" is in "123abcdef"`
does string contain another string
`"abc" is not in "123abcdef"`
string is not in another string
`2 + 3`
addition
`2 - 3`
subtraction

`&` and `&&` combine two strings (concatenation).
`put "a" & "b" into x
answer x -- displays "ab"
put "a" && "b" into x
answer x -- displays "a b"`

You can also use `a = b`, which is equivalent to `a == b`

^Logical operators^

The constants 'true' and 'false' are used often. Internally there is no distinct boolean type, but the strings "true" and "false" are interpreted as true and false respectively.
`true and false`
logical and
`true or false`
logical or
`not true`
logical not

Logical operations are not guaranteed to be short-circuiting. In other words,
`put (true or myfunction()) into x`
still will call `myfunction`, when it hypothetically could have been skipped.



============================================================
========================= (Constants)
============================================================

The following constants are defined:
`
pi
newline
tab
empty
quote
one
two
three
four
five
six
seven
eight
nine
ten
colon
comma
true
false
up
down
space
return
cr
formfeed
linefeed`


============================================================
========================= global
============================================================

Declares that a variable is a global.
1) it can be accessed from any other script
2) the contents are saved even after the function is complete.
The contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.

Examples:

global currentData1, currentData2
put "stored 1" into currentData1
put "stored 2" into currentData2


============================================================
========================= if/then
============================================================


Use to run certain code based on a condition that can be true or false.

In the example

`
put 2 into x
if x > 0 then
    answer "x is greater than 0"
end if`

First, we'll check the expression `x > 0`. Since it evaluates to true, the code inside is run. 

You can also include an "else" section that will be run only if the expression evaluated to false.

`if x > 0 then
    answer "x is greater than 0"
else
    answer "x is not greater than 0"
end if`

You can chain together many different conditions with "else if". 

`
put 3 into x
if x > 3 then
    answer "x is greater than 3"
else if x < 3 then
    answer "x is less than 3"
else if x is 3 then
    answer "x is 3"
end if`

As soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.

`
if 3+3 is 6 then
    answer "aaa"
else if 2+2 is 4 then
    -- this not run, even though the expression is true
    answer "bbb"
end if
`

============================================================
========================= short if/then
============================================================

Examples:

if 3+3 is 6 then answer "it is"

-- you can even do this

if 3+3 is 7 then answer "it is not"
else answer "it is"

============================================================
========================= exit___repeat
============================================================

Exit the current loop. Equivalent to "break" in C.

Examples:

repeat with x = 1 to 3
    if x == 2 then
        exit repeat
    end if
    answer x
end repeat
-- displays 1
-- and does not display 2 or 3

============================================================
========================= exit
============================================================

Skips to the end of the current handler, skipping over all subsequent lines of code. Similar to return, but does not point to a value.

Examples:

on mouseUp
    put cd fld "fld1" into x
    if x is not a number then
        answer "you did not type a number"
        exit mouseUp
        answer "this will never get called"
    end if
    put x * 2 into cd fld "fld1"
end mouseUp

============================================================
========================= exit to ViperCard
============================================================

Exits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.

For compatibility, `exit to HyperCard` is also accepted. `exit to ViperCard` can also be useful if you have overridden a default message and want to defer to the default behavior.

Examples:

on myHandler
    exit to ViperCard
    answer "this will never get called"
end myHandler
on mouseUp
    myHandler
    answer "and even this will never get called"
end mouseUp

============================================================
========================= next___repeat
============================================================

Inside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to "continue" in C.

Examples:

repeat with x = 1 to 3
    if x == 2 then
        next repeat
    end if
    answer x
end repeat
-- displays 1
-- displays 3
-- and does not display 2

============================================================
========================= pass
============================================================

Exits the current function and calls a function higher in the message hierarchy. For example, if a button has the script
`on mouseUp
    answer "button handling the event"
end mouseUp
-- and the current card has the script
on mouseUp
    answer "card handling the event"
end mouseUp`
and the button is clicked, only the button's code will be run.

If you want both to be run, you can use the pass command. If a button has the script
`on mouseUp
    answer "button handling the event"
    pass mouseUp
    -- any code here will be skipped
end mouseUp
--and the current card has the script
on mouseUp
    answer "card handling the event"
end mouseUp`
and the button is clicked,
both will be run.


============================================================
========================= repeat
============================================================

Use to create a loop.

Examples:

repeat with x = 1 to 5
    answer "x is now" & x
end repeat

repeat with x = 5 down to 1
    answer "x is now" & x
end repeat

repeat 3 times
    answer "hi"
end repeat

repeat forever
    answer "this is an infinite loop"
end repeat

put 0 into counter
repeat forever
    answer "but not this"
    add 1 to counter
    if counter > 3 then
        exit repeat
    end if
end repeat

put 0 into counter
repeat until counter > 3
    add 1 to counter
end repeat

put 0 into counter
repeat while counter <= 3
    add 1 to counter
end repeat

============================================================
========================= return
============================================================

Returns a value from the current function.
Note: no lines of code after the return statement will be run.

Examples:

function myAddition p1, p2
    return p1 + p2
    answer "this line will never be reached"
end myAddition
on mouseUp
    put myAddition(1,2) into x
end mouseUp


================================================
FILE: vipercard/doc/reference_03_syntax.md
================================================
<!---
this is a generated file, changes will be lost.
-->

[Overview](./reference_01_overview.md) | [Commands](./reference_02_commands.md) | Syntax | [Properties](./reference_04_properties.md) | [Functions](./reference_05_functions.md) | [Event Handlers](./reference_06_events.md) | [Compatibility](./reference_07_compatibility.md)



## (Operators)


Here are the operators that can be used.

```
2 * 3
```

multiplication

```
2 / 3
```

division

```
2 ^ 3
```

raise to the third power

```
7 div 5
```

truncated division

```
7 mod 5
```

modulo

```
2 > 3
```

greater than

```
2 < 3
```

less than

```
2 >= 3
```

greater than or equal to

```
2 <= 3
```

less than or equal to

```
2  ==  3
```

equal to

```
2  !=  3
```

not equal to

```
"abc" is "def"
```

equal to

```
"abc" is not "def"
```

not equal to

```
"abc" is in "123abcdef"
```

does string contain another string

```
"abc" is not in "123abcdef"
```

string is not in another string

```
2 + 3
```

addition

```
2 - 3
```

subtraction

`&` and `&&` combine two strings (concatenation).

```
put "a" & "b" into x
answer x -- displays "ab"
put "a" && "b" into x
answer x -- displays "a b"
```


You can also use `a = b`, which is equivalent to `a == b`

**Logical operators**

The constants 'true' and 'false' are used often. Internally there is no distinct boolean type, but the strings "true" and "false" are interpreted as true and false respectively.

```
true and false
```

logical and

```
true or false
```

logical or

```
not true
```

logical not

Logical operations are not guaranteed to be short-circuiting. In other words,

```
put (true or myfunction()) into x
```

still will call `myfunction`, when it hypothetically could have been skipped.




## (Constants)


The following constants are defined:

```

pi
newline
tab
empty
quote
one
two
three
four
five
six
seven
eight
nine
ten
colon
comma
true
false
up
down
space
return
cr
formfeed
linefeed
```




## global


Declares that a variable is a global.

1) it can be accessed from any other script

2) the contents are saved even after the function is complete.

The contents are lost when the stack is exited, however, and are not saved to disk or as part of the stack.

Examples:

```


global currentData1, currentData2
put "stored 1" into currentData1
put "stored 2" into currentData2



```



## if/then



Use to run certain code based on a condition that can be true or false.

In the example


```

put 2 into x
if x > 0 then
    answer "x is greater than 0"
end if
```


First, we'll check the expression `x > 0`. Since it evaluates to true, the code inside is run. 

You can also include an "else" section that will be run only if the expression evaluated to false.


```
if x > 0 then
    answer "x is greater than 0"
else
    answer "x is not greater than 0"
end if
```


You can chain together many different conditions with "else if". 


```

put 3 into x
if x > 3 then
    answer "x is greater than 3"
else if x < 3 then
    answer "x is less than 3"
else if x is 3 then
    answer "x is 3"
end if
```


As soon as one of the branches is taken, all of the remaining branches are skipped -- even if the condition is true.


```

if 3+3 is 6 then
    answer "aaa"
else if 2+2 is 4 then
    -- this not run, even though the expression is true
    answer "bbb"
end if

```



## short if/then


Examples:

```


if 3+3 is 6 then answer "it is"

-- you can even do this

if 3+3 is 7 then answer "it is not"
else answer "it is"


```



## exit repeat


Exit the current loop. Equivalent to "break" in C.

Examples:

```


repeat with x = 1 to 3
    if x == 2 then
        exit repeat
    end if
    answer x
end repeat
-- displays 1
-- and does not display 2 or 3


```



## exit


Skips to the end of the current handler, skipping over all subsequent lines of code. Similar to return, but does not point to a value.

Examples:

```


on mouseUp
    put cd fld "fld1" into x
    if x is not a number then
        answer "you did not type a number"
        exit mouseUp
        answer "this will never get called"
    end if
    put x * 2 into cd fld "fld1"
end mouseUp


```



## exit to ViperCard


Exits the current handler and passes the message up to ViperCard. Typically, this stops code execution completely.

For compatibility, `exit to HyperCard` is also accepted. `exit to ViperCard` can also be useful if you have overridden a default message and want to defer to the default behavior.

Examples:

```


on myHandler
    exit to ViperCard
    answer "this will never get called"
end myHandler
on mouseUp
    myHandler
    answer "and even this will never get called"
end mouseUp


```



## next repeat


Inside a loop, go back to the top of the loop, skipping the next line(s) of code. Equivalent to "continue" in C.

Examples:

```


repeat with x = 1 to 3
    if x == 2 then
        next repeat
    end if
    answer x
end repeat
-- displays 1
-- displays 3
-- and does not display 2


```



## pass


Exits the current function and calls a function higher in the message hierarchy. For example, if a button has the script

```
on mouseUp
    answer "button handling the event"
end mouseUp
-- and the current card has the script
on mouseUp
    answer "card handling the event"
end mouseUp
```

and the button is clicked, only the button's code will be run.

If you want both to be run, you can use the pass command. If a button has the script

```
on mouseUp
    answer "button handling the event"
    pass mouseUp
    -- any code here will be skipped
end mouseUp
--and the current card has the script
on mouseUp
    answer "card handling the event"
end mouseUp
```

and the button is clicked,

both will be run.



## repeat


Use to create a loop.

Examples:

```


repeat with x = 1 to 5
    answer "x is now" & x
end repeat

repeat with x = 5 down to 1
    answer "x is now" & x
end repeat

repeat 3 times
    answer "hi"
end repeat

repeat forever
    answer "this is an infinite loop"
end repeat

put 0 into counter
repeat forever
    answer "but not this"
    add 1 to counter
    if counter > 3 then
        exit repeat
    end if
end repeat

put 0 into counter
repeat until counter > 3
    add 1 to counter
end repeat

put 0 into counter
repeat while counter <= 3
    add 1 to counter
end repeat


```



## return


Returns a value from the current function.

Note: no lines of code after the return statement will be run.

Examples:

```


function myAddition p1, p2
    return p1 + p2
    answer "this line will never be reached"
end myAddition
on mouseUp
    put myAddition(1,2) into x
end mouseUp


```



================================================
FILE: vipercard/doc/reference_04_properties
================================================

 

============================================================
========================= id
============================================================

The id uniquely identifies an object. In ViperCard, all objects will have different ids, even if they are different types or are on different cards.

If you put the long id of an object into a variable, you can use that variable to refer to the object.

`put the long id of card id 1011 into z
set the name of z to "changed"`

The short id of an object is just the number. For example the short id of card id 1011 is 1011.

`put the short id of card id 1011 into z
set the name of cd id z to "changed"`

============================================================
========================= name
============================================================

You can get or set the name of an object.
`
doMenu "New Button"
set the name of the result to "my new button"

set the name of cd btn id 1011 to "changed"
answer the short name of cd btn id 1011 -- "changed"
`

============================================================
========================= number
============================================================

You can get the number of an object.
`
answer the number of cd fld 2 -- 2
answer the number of cd btn 3 -- 3
answer the number of card 4 -- 4
`

============================================================
========================= owner
============================================================

Gets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.

Examples:

put the owner of cd btn "myBtn" into z
set the name of the owner of cd btn "myBtn" to "changed"

============================================================
========================= script
============================================================

It's unlikely to be useful, but a script can dynamically change the contents of another script.
Examples:

put return & "on newCode" & return & "answer 234" & \
    return & "end newCode" into newCode
put the script of cd btn id 123 into oldCode
set the script of cd btn id 123 to oldCode & newCode
send "newCode" to cd btn id 123

============================================================
========================= btn: autohilite
============================================================

Does the button turn black when you click on it?

Examples:

put the autohilite of cd btn "myBtn" into z


============================================================
========================= btn: checkmark
============================================================


Examples:

set the checkmark of cd btn "myBtn" to true.

============================================================
========================= btn: enabled
============================================================

If a button is not enabled, it is greyed out and can't be clicked.

Examples:

set the enabled of cd btn "myBtn" to true
set the enabled of cd btn "myBtn" to false


============================================================
========================= btn: left
============================================================

The x coordinate of the top left corner of the object, in pixels. I.e. the distance from the left of the screen to the object.

Examples:

set the left of cd btn "myBtn" to 4


============================================================
========================= btn: loc, location
============================================================

The coordinates of the center of the object.
Examples:

put the location of cd btn "myBtn" into z


============================================================
========================= btn: height
============================================================

The height of the object on screen, in pixels.
Examples:

put the height of cd btn "myBtn" into z


============================================================
========================= btn: hilite
============================================================


Examples:

put the hilite of cd btn "myBtn" into z

============================================================
========================= btn: label
============================================================


Examples:

put the label of cd btn "myBtn" into z


============================================================
========================= btn: icon
============================================================

Number of the icon.
Examples:

put the icon of cd btn "myBtn" into z

============================================================
========================= btn: rect, rectangle
============================================================

Four numbers representing the left, top, bottom, and right coordinates. I.e. the first two numbers are the coordinates of the top left corner, and the last two numbers are the coordinates of the bottom right corner.
Examples:

set the rect of cd btn "myBtn" to 45,56,67,78
set the rectangle of cd btn "myBtn" to 45,56,67,78


============================================================
========================= btn: showlabel
============================================================

Is the label text shown?
Examples:

put the showlabel of cd btn "myBtn" into z

============================================================
========================= btn: style
============================================================

Styles include:
Transparent
Rectangle
Opaque
Roundrect
Plain
Shadow
OsStandard
OsDefault
OsBoxmodal
Checkbox
Radio

Examples:

set the style of cd btn "myBtn" to "Shadow"

============================================================
========================= btn: textalign
============================================================

Set alignment of the label text.
Examples:

set the textalign of cd btn "myBtn" to "left"
set the textalign of cd btn "myBtn" to "center"


============================================================
========================= btn: textfont
============================================================

Set typeface of the label text.

Examples:

set the textfont of cd btn "myBtn" to "courier"


============================================================
========================= btn: textsize
============================================================

Set size of the label text.

Examples:

set the textsize of cd btn "myBtn" to 24


============================================================
========================= btn: textstyle
============================================================

Set style of the label text.

Examples:

set the textstyle of cd btn "myBtn" to "bold"


============================================================
========================= btn: top
============================================================

The y coordinate of the top left corner of the object, in pixels. I.e. the distance from the top of the screen to the object.
Examples:

put the top of cd btn "myBtn" into z



============================================================
========================= btn: topleft
============================================================

The x,y coordinates of the upper left corner.
Examples:

set the topleft of cd btn "myBtn" to 34, 56

============================================================
========================= btn: visible
============================================================

Hide or show the object.
Examples:

set the visible of cd btn "myBtn" to false

============================================================
========================= btn: width
============================================================

The width of the object on screen, in pixels.
Examples:

put the width of cd btn "myBtn" into z


============================================================
========================= fld: alltext
============================================================

Get or set all contents of the field.
Examples:

put the alltext of cd fld "myFld" into z


============================================================
========================= fld: dontwrap
============================================================

Wrap text onto different lines.
Examples:

put the dontwrap of cd fld "myFld" into z

============================================================
========================= fld: enabled
============================================================

A disabled field is greyed out and can't be edited.
Examples:

put the enabled of cd fld "myFld" into z

============================================================
========================= fld: defaulttextfont
============================================================


If the user deletes all text in a field and then types a letter, the font of this letter will be determined by the defaulttextfont.

Examples:

put the defaulttextfont of cd fld "myFld" into z


============================================================
========================= fld: defaulttextsize
============================================================


If the user deletes all text in a field and then types a letter, the size of this letter will be determined by the defaulttextsize.

Examples:

put the defaulttextsize of cd fld "myFld" into z

============================================================
========================= fld: defaulttextstyle
============================================================


If the user deletes all text in a field and then types a letter, the style of this letter will be determined by the defaulttextstyle.

Examples:

put the defaulttextstyle of cd fld "myFld" into z


============================================================
========================= fld: left
============================================================

The x coordinate of the top left corner of the object, in pixels. I.e. the distance from the left of the screen to the object.
Examples:

set the left of cd fld "myFld" to 4


============================================================
========================= fld: loc, location
============================================================

The coordinates of the center of the object.
Examples:

put the location of cd fld "myFld" into z


============================================================
========================= fld: locktext
============================================================

You can't type new text into a 'locked' field. You can still set the contents via a script.
Examples:

set the locktext of cd fld "myFld" to true
put "still can change" into cd fld "myFld"

============================================================
========================= fld: height
============================================================

The height of the object on screen, in pixels.
Examples:

put the height of cd fld "myFld" into z

============================================================
========================= fld: rect, rectangle
============================================================

Four numbers representing the left, top, bottom, and right coordinates. I.e. the first two numbers are the coordinates of the top left corner, and the last two numbers are the coordinates of the bottom right corner.
Examples:

set the rect of cd fld "myFld" to 45,56,67,78
set the rectangle of cd fld "myFld" to 45,56,67,78


============================================================
========================= fld: scroll
============================================================

The vertical scroll position.
Examples:

put the scroll of cd fld "myFld" into z

============================================================
========================= fld: singleline
============================================================

Field is a single line, cannot contain newlines.
Examples:

put the singleline of cd fld "myFld" into z



============================================================
========================= fld: style
============================================================

Styles include:
Opaque
Transparent
Rectangle
Shadow
Scrolling

Examples:

set the style of cd fld "myFld" to "shadow"

============================================================
========================= fld: textalign
============================================================

Set alignment of text
Examples:

set the textalign of cd fld "myFld" to "left"
set the textalign of cd fld "myFld" to "center"


============================================================
========================= fld: textfont
============================================================


By default, applies the property to the entire field.
`set the textfont of cd fld "myFld" to "chicago"
put the textfont of cd fld "myFld" into z`

We now support getting and setting by chunk!
`set the textfont of char 3 to 4 of cd fld "myFld" to "geneva"
put the textfont of char 3 to 4 of cd fld "myFld" into z`

When querying for a property and there are multiple values, returns the string "mixed".


============================================================
========================= fld: textsize
============================================================


By default, applies the property to the entire field.
`set the textsize of cd fld "myFld" to "chicago"
put the textsize of cd fld "myFld" into z`

We now support getting and setting by chunk!
`set the textsize of char 3 to 4 of cd fld "myFld" to "geneva"
put the textsize of char 3 to 4 of cd fld "myFld" into z`

When querying for a property and there are multiple values, returns the string "mixed".


============================================================
========================= fld: textstyle
============================================================


By default, applies the property to the entire field.
`set the textstyle of cd fld "myFld" to "bold"
set the textstyle of cd fld "myFld" to "bold,italic"
set the textstyle of cd fld "myFld" to "plain"
put the textstyle of cd fld "myFld" into z`

We now support getting and setting by chunk!
`set the textstyle of char 3 to 4 of cd fld "myFld" to "bold"
put the textstyle of char 3 to 4 of cd fld "myFld" into z`

When querying for a property and there are multiple values, returns the string "mixed".

You can also do the following:
`set the textstyle of cd fld "myFld" to "add-bold"
set the textstyle of cd fld "myFld" to "subtract-italic"
set the textstyle of cd fld "myFld" to "toggle-outline"
set the textstyle of line 2 of cd fld "myFld" to "add-bold"
set the textstyle of line 2 of cd fld "myFld" to "subtract-italic"
set the textstyle of line 2 of cd fld "myFld" to "toggle-outline"`

============================================================
========================= fld: top
============================================================

The y coordinate of the top left corner of the object, in pixels. I.e. the distance from the top of the screen to the object.
Examples:

put the top of cd fld "myFld" into z



============================================================
========================= fld: topleft
============================================================

The x,y coordinates of the upper left corner.
Examples:

set the topleft of cd fld "myFld" to 34, 56

============================================================
========================= fld: width
============================================================

The width of the object on screen, in pixels.
Examples:

put the width of cd fld "myFld" into z

============================================================
========================= fld: visible
============================================================

Show or hide the object.
Examples:

put the visible of cd fld "myFld" into z


============================================================
========================= cursor
============================================================

Sets the current cursor.

Examples:

-- show the watch
set the cursor to "watch"
wait 2 seconds

-- spinning ball
repeat with x = 1 to 30
    set the cursor to "busy"
    wait 0.2 seconds
end repeat


============================================================
========================= filled
============================================================

The color/opacity for drawing. Currently can be "true" for black, "false" for transparent, or "white" for white.
Examples:

set the filled to "white"

============================================================
========================= lineColor
============================================================

The lineColor for drawing. Currently can be 0 (black) or 1 (white).
Examples:

set the lineSize to 1

============================================================
========================= lineSize
============================================================

The linesize for drawing. Currently can be 1 (thin) or 2 (thicker).

Examples:

set the lineSize to 2

============================================================
========================= itemdelimiter
============================================================


Examples:

put the itemdelimiter into z
set the itemdel to tab
answer item 2 of "a"&tab&"b"&tab&"c"
set the itemdel to ","


============================================================
========================= idlerate
============================================================

The speed at which `on idle` is called.

Examples:

set the idlerate to "default"
set the idlerate to "faster"
set the idlerate to "faster2"

============================================================
========================= multiple
============================================================

The "draw multiple" setting for drawing. Does not yet affect script drawing.

Examples:

set the multiple to true

============================================================
========================= pattern
============================================================

The current pattern number.



================================================
FILE: vipercard/doc/reference_04_properties.md
================================================
<!---
this is a generated file, changes will be lost.
-->

[Overview](./reference_01_overview.md) | [Commands](./reference_02_commands.md) | [Syntax](./reference_03_syntax.md) | Properties | [Functions](./reference_05_functions.md) | [Event Handlers](./reference_06_events.md) | [Compatibility](./reference_07_compatibility.md)



## id


The id uniquely identifies an object. In ViperCard, all objects will have different ids, even if they are different types or are on different cards.

If you put the long id of an object into a variable, you can use that variable to refer to the object.


```
put the long id of card id 1011 into z
set the name of z to "changed"
```


The short id of an object is just the number. For example the short id of card id 1011 is 1011.


```
put the short id of card id 1011 into z
set the name of cd id z to "changed"
```



## name


You can get or set the name of an object.

```

doMenu "New Button"
set the name of the result to "my new button"

set the name of cd btn id 1011 to "changed"
answer the short name of cd btn id 1011 -- "changed"

```



## number


You can get the number of an object.

```

answer the number of cd fld 2 -- 2
answer the number of cd btn 3 -- 3
answer the number of card 4 -- 4

```



## owner


Gets the parent object. Btns and flds belong to cards, cards belong to backgrounds, and backgrounds belong to the stack.

Examples:

```


put the owner of cd btn "myBtn" into z
set the name of the owner of cd btn "myBtn" to "changed"


```



## script


It's unlikely to be useful, but a script can dynamically change the contents of another script.

Examples:

```


put return & "on newCode" & return & "answer 234" & \
    return & "end newCode" into newCode
put the script of cd btn id 123 into oldCode
set the script of cd btn id 123 to oldCode & newCode
send "newCode" to cd btn id 123


```



## btn: autohilite


Does the button turn black when you click on it?

Examples:

```


put the autohilite of cd btn "myBtn" into z



```



## btn: checkmark



Examples:

```


set the checkmark of cd btn "myBtn" to true.


```



## btn: enabled


If a button is not enabled, it is greyed out and can't be clicked.

Examples:

```


set the enabled of cd btn "myBtn" to true
set the enabled of cd btn "myBtn" to false



```



## btn: left


The x coordinate of the top left corner of the object, in pixels. I.e. the distance from the left of the screen to the object.

Examples:

```


set the left of cd btn "myBtn" to 4



```



## btn: loc, location


The coordinates of the center of the object.

Examples:

```


put the location of cd btn "myBtn" into z



```



## btn: height


The height of the object on screen, in pixels.

Examples:

```


put the height of cd btn "myBtn" into z



```



## btn: hilite



Examples:

```


put the hilite of cd btn "myBtn" into z


```



## btn: label



Examples:

```


put the label of cd btn "myBtn" into z



```



## btn: icon


Number of the icon.

Examples:

```


put the icon of cd btn "myBtn" into z


```



## btn: rect, rectangle


Four numbers representing the left, top, bottom, and right coordinates. I.e. the first two numbers are the coordinates of the top left corner, and the last two numbers are the coordinates of the bottom right corner.

Examples:

```


set the rect of cd btn "myBtn" to 45,56,67,78
set the rectangle of cd btn "myBtn" to 45,56,67,78



```



## btn: showlabel


Is the label text shown?

Examples:

```


put the showlabel of cd btn "myBtn" into z


```



## btn: style


Styles include:

Transparent

Rectangle

Opaque

Roundrect

Plain

Shadow

OsStandard

OsDefault

OsBoxmodal

Checkbox

Radio

Examples:

```


set the style of cd btn "myBtn" to "Shadow"


```



## btn: textalign


Set alignment of the label text.

Examples:

```


set the textalign of cd btn "myBtn" to "left"
set the textalign of cd btn "myBtn" to "center"



```



## btn: textfont


Set typeface of the label text.

Examples:

```


set the textfo
Download .txt
gitextract_cc7lxjo_/

├── README.md
└── vipercard/
    ├── .gitignore
    ├── LICENSE
    ├── building.md
    ├── doc/
    │   ├── gendocs.py
    │   ├── gendocs_to_md.py
    │   ├── gendocs_tovipercard.py
    │   ├── libraries.txt
    │   ├── page_404.md
    │   ├── page_terms.md
    │   ├── page_video.md
    │   ├── page_video1.md
    │   ├── page_video2.md
    │   ├── page_video3.md
    │   ├── page_why.md
    │   ├── readme.md
    │   ├── reference_01_overview
    │   ├── reference_01_overview.md
    │   ├── reference_02_commands
    │   ├── reference_02_commands.md
    │   ├── reference_03_syntax
    │   ├── reference_03_syntax.md
    │   ├── reference_04_properties
    │   ├── reference_04_properties.md
    │   ├── reference_05_functions
    │   ├── reference_05_functions.md
    │   ├── reference_06_events
    │   ├── reference_06_events.md
    │   ├── reference_07_compatibility
    │   └── reference_07_compatibility.md
    └── vipercard/
        ├── .eslintrc.js
        ├── .gitignore
        ├── .prettierrc.js
        ├── .prettierrc_longer.js
        ├── .vscode/
        │   ├── launch.json
        │   ├── settings.json
        │   └── tasks.json
        ├── 0.3/
        │   ├── html/
        │   │   ├── 404.html
        │   │   ├── script_reference/
        │   │   │   ├── github-markdown.css
        │   │   │   ├── reference_01_overview.html
        │   │   │   ├── reference_02_commands.html
        │   │   │   ├── reference_03_syntax.html
        │   │   │   ├── reference_04_properties.html
        │   │   │   ├── reference_05_functions.html
        │   │   │   ├── reference_06_events.html
        │   │   │   ├── reference_07_compatibility.html
        │   │   │   └── smalltheme.css
        │   │   ├── terms.html
        │   │   ├── video.html
        │   │   ├── video1.html
        │   │   ├── video2.html
        │   │   ├── video3.html
        │   │   └── why.html
        │   ├── index.dev.html
        │   └── style.css
        ├── BingSiteAuth.xml
        ├── external/
        │   ├── FileSaver.js-2.0.2/
        │   │   ├── CHANGELOG.md
        │   │   ├── FileSaver.d.ts
        │   │   ├── FileSaver.js
        │   │   ├── LICENSE.md
        │   │   └── README.md
        │   ├── base64-js-1.3.1/
        │   │   ├── LICENSE
        │   │   ├── README.md
        │   │   └── base64js.js
        │   ├── bowser-2.9/
        │   │   ├── LICENSE
        │   │   ├── README.md
        │   │   ├── bowser-2.9-bundled.js
        │   │   └── bowser.d.ts
        │   ├── chevrotain-6.5.0/
        │   │   ├── LICENSE.txt
        │   │   ├── README.md
        │   │   ├── chevrotain.js
        │   │   └── chevrotaintyping.d.ts
        │   ├── clipboard.js-2.0.6-notbundled/
        │   │   ├── LICENSE
        │   │   ├── clipboard.js
        │   │   └── readme.md
        │   ├── easyfilter-notbundled/
        │   │   ├── (already in typescript)
        │   │   ├── LICENSE
        │   │   └── bresenham.js
        │   ├── externaldelaybundlebig.js
        │   ├── externaldelaybundlemin.js
        │   ├── externalmanualbundlebig.js
        │   ├── externalmanualbundlemin.js
        │   ├── golly/
        │   │   ├── golly.js
        │   │   ├── golly.txt
        │   │   └── license.txt
        │   ├── js-lru/
        │   │   ├── js-lru.d.ts
        │   │   ├── js-lru.js
        │   │   └── license.txt
        │   ├── jsgif-dynamic/
        │   │   ├── (loaded dynamically)
        │   │   ├── LICENSE
        │   │   ├── jsgif.txt
        │   │   ├── jsgifcombined.js
        │   │   └── modified_to_expose_getblob.txt
        │   ├── lz-string-1.4.4/
        │   │   ├── LICENSE.txt
        │   │   ├── README.md
        │   │   ├── base64-string.js
        │   │   ├── lz-string.js
        │   │   └── lzstring.d.ts
        │   ├── manualbundle.py
        │   ├── pbkdf2/
        │   │   └── pbkdf2.txt
        │   ├── pizzicato-dynamic/
        │   │   ├── LICENSE
        │   │   ├── Pizzicato.js
        │   │   └── README.md
        │   └── text-encoding-types-notbundled/
        │       ├── index.d.ts
        │       └── license.txt
        ├── index.html
        ├── package.json
        ├── resources03a/
        │   ├── docs/
        │   │   ├── demo_anim.json
        │   │   ├── demo_game.json
        │   │   ├── demo_glider.json
        │   │   ├── demo_graphics.json
        │   │   ├── demo_spacegame.json
        │   │   ├── refcommands.json
        │   │   ├── refcompatibility.json
        │   │   ├── refevents.json
        │   │   ├── reffunctions.json
        │   │   ├── refoverview.json
        │   │   ├── refproperties.json
        │   │   └── refsyntax.json
        │   ├── fonts/
        │   │   ├── 00_10_+b+iu+osdce.json
        │   │   ├── 00_10_+b+iuosdce.json
        │   │   ├── 00_10_+biu+osdce.json
        │   │   ├── 00_10_+biuosdce.json
        │   │   ├── 00_10_b+iu+osdce.json
        │   │   ├── 00_10_b+iuosdce.json
        │   │   ├── 00_10_biu+osdce.json
        │   │   ├── 00_10_biuosdce.json
        │   │   ├── 00_12_+b+iu+osdce.json
        │   │   ├── 00_12_+b+iuosdce.json
        │   │   ├── 00_12_+biu+osdce.json
        │   │   ├── 00_12_+biuosdce.json
        │   │   ├── 00_12_b+iu+osdce.json
        │   │   ├── 00_12_b+iuosdce.json
        │   │   ├── 00_12_biu+osdce.json
        │   │   ├── 00_12_biuos+dce.json
        │   │   ├── 00_12_biuosdce.json
        │   │   ├── 00_14_+b+iu+osdce.json
        │   │   ├── 00_14_+b+iuosdce.json
        │   │   ├── 00_14_+biu+osdce.json
        │   │   ├── 00_14_+biuosdce.json
        │   │   ├── 00_14_b+iu+osdce.json
        │   │   ├── 00_14_b+iuosdce.json
        │   │   ├── 00_14_biu+osdce.json
        │   │   ├── 00_14_biuosdce.json
        │   │   ├── 00_18_+b+iu+osdce.json
        │   │   ├── 00_18_+b+iuosdce.json
        │   │   ├── 00_18_+biu+osdce.json
        │   │   ├── 00_18_+biuosdce.json
        │   │   ├── 00_18_b+iu+osdce.json
        │   │   ├── 00_18_b+iuosdce.json
        │   │   ├── 00_18_biu+osdce.json
        │   │   ├── 00_18_biuosdce.json
        │   │   ├── 00_24_+b+iu+osdce.json
        │   │   ├── 00_24_+b+iuosdce.json
        │   │   ├── 00_24_+biu+osdce.json
        │   │   ├── 00_24_+biuosdce.json
        │   │   ├── 00_24_b+iu+osdce.json
        │   │   ├── 00_24_b+iuosdce.json
        │   │   ├── 00_24_biu+osdce.json
        │   │   ├── 00_24_biuosdce.json
        │   │   ├── 00_9_+b+iu+osdce.json
        │   │   ├── 00_9_+b+iuosdce.json
        │   │   ├── 00_9_+biu+osdce.json
        │   │   ├── 00_9_+biuosdce.json
        │   │   ├── 00_9_b+iu+osdce.json
        │   │   ├── 00_9_b+iuosdce.json
        │   │   ├── 00_9_biu+osdce.json
        │   │   ├── 00_9_biuosdce.json
        │   │   ├── 01_10_+b+iu+osdce.json
        │   │   ├── 01_10_+b+iuosdce.json
        │   │   ├── 01_10_+biu+osdce.json
        │   │   ├── 01_10_+biuosdce.json
        │   │   ├── 01_10_b+iu+osdce.json
        │   │   ├── 01_10_b+iuosdce.json
        │   │   ├── 01_10_biu+osdce.json
        │   │   ├── 01_10_biuosdce.json
        │   │   ├── 01_12_+b+iu+osdce.json
        │   │   ├── 01_12_+b+iuosdce.json
        │   │   ├── 01_12_+biu+osdce.json
        │   │   ├── 01_12_+biuosdce.json
        │   │   ├── 01_12_b+iu+osdce.json
        │   │   ├── 01_12_b+iuosdce.json
        │   │   ├── 01_12_biu+osdce.json
        │   │   ├── 01_12_biuosdce.json
        │   │   ├── 01_14_+b+iu+osdce.json
        │   │   ├── 01_14_+b+iuosdce.json
        │   │   ├── 01_14_+biu+osdce.json
        │   │   ├── 01_14_+biuosdce.json
        │   │   ├── 01_14_b+iu+osdce.json
        │   │   ├── 01_14_b+iuosdce.json
        │   │   ├── 01_14_biu+osdce.json
        │   │   ├── 01_14_biuosdce.json
        │   │   ├── 01_18_+b+iu+osdce.json
        │   │   ├── 01_18_+b+iuosdce.json
        │   │   ├── 01_18_+biu+osdce.json
        │   │   ├── 01_18_+biuosdce.json
        │   │   ├── 01_18_b+iu+osdce.json
        │   │   ├── 01_18_b+iuosdce.json
        │   │   ├── 01_18_biu+osdce.json
        │   │   ├── 01_18_biuosdce.json
        │   │   ├── 01_24_+b+iu+osdce.json
        │   │   ├── 01_24_+b+iuosdce.json
        │   │   ├── 01_24_+biu+osdce.json
        │   │   ├── 01_24_+biuosdce.json
        │   │   ├── 01_24_b+iu+osdce.json
        │   │   ├── 01_24_b+iuosdce.json
        │   │   ├── 01_24_biu+osdce.json
        │   │   ├── 01_24_biuosdce.json
        │   │   ├── 01_9_+b+iu+osdce.json
        │   │   ├── 01_9_+b+iuosdce.json
        │   │   ├── 01_9_+biu+osdce.json
        │   │   ├── 01_9_+biuosdce.json
        │   │   ├── 01_9_b+iu+osdce.json
        │   │   ├── 01_9_b+iuosdce.json
        │   │   ├── 01_9_biu+osdce.json
        │   │   ├── 01_9_biuosdce.json
        │   │   ├── 02_10_+b+iu+osdce.json
        │   │   ├── 02_10_+b+iuosdce.json
        │   │   ├── 02_10_+biu+osdce.json
        │   │   ├── 02_10_+biuosdce.json
        │   │   ├── 02_10_b+iu+osdce.json
        │   │   ├── 02_10_b+iuosdce.json
        │   │   ├── 02_10_biu+osdce.json
        │   │   ├── 02_10_biuosdce.json
        │   │   ├── 02_12_+b+iu+osdce.json
        │   │   ├── 02_12_+b+iuosdce.json
        │   │   ├── 02_12_+biu+osdce.json
        │   │   ├── 02_12_+biuosdce.json
        │   │   ├── 02_12_b+iu+osdce.json
        │   │   ├── 02_12_b+iuosdce.json
        │   │   ├── 02_12_biu+osdce.json
        │   │   ├── 02_12_biuosdce.json
        │   │   ├── 02_14_+b+iu+osdce.json
        │   │   ├── 02_14_+b+iuosdce.json
        │   │   ├── 02_14_+biu+osdce.json
        │   │   ├── 02_14_+biuosdce.json
        │   │   ├── 02_14_b+iu+osdce.json
        │   │   ├── 02_14_b+iuosdce.json
        │   │   ├── 02_14_biu+osdce.json
        │   │   ├── 02_14_biuosdce.json
        │   │   ├── 02_18_+b+iu+osdce.json
        │   │   ├── 02_18_+b+iuosdce.json
        │   │   ├── 02_18_+biu+osdce.json
        │   │   ├── 02_18_+biuosdce.json
        │   │   ├── 02_18_b+iu+osdce.json
        │   │   ├── 02_18_b+iuosdce.json
        │   │   ├── 02_18_biu+osdce.json
        │   │   ├── 02_18_biuosdce.json
        │   │   ├── 02_24_+b+iu+osdce.json
        │   │   ├── 02_24_+b+iuosdce.json
        │   │   ├── 02_24_+biu+osdce.json
        │   │   ├── 02_24_+biuosdce.json
        │   │   ├── 02_24_b+iu+osdce.json
        │   │   ├── 02_24_b+iuosdce.json
        │   │   ├── 02_24_biu+osdce.json
        │   │   ├── 02_24_biuosdce.json
        │   │   ├── 02_9_+b+iu+osdce.json
        │   │   ├── 02_9_+b+iuosdce.json
        │   │   ├── 02_9_+biu+osdce.json
        │   │   ├── 02_9_+biuosdce.json
        │   │   ├── 02_9_b+iu+osdce.json
        │   │   ├── 02_9_b+iuosdce.json
        │   │   ├── 02_9_biu+osdce.json
        │   │   ├── 02_9_biuos+dce.json
        │   │   ├── 02_9_biuosdce.json
        │   │   ├── 03_10_+b+iu+osdce.json
        │   │   ├── 03_10_+b+iuosdce.json
        │   │   ├── 03_10_+biu+osdce.json
        │   │   ├── 03_10_+biuosdce.json
        │   │   ├── 03_10_b+iu+osdce.json
        │   │   ├── 03_10_b+iuosdce.json
        │   │   ├── 03_10_biu+osdce.json
        │   │   ├── 03_10_biuosdce.json
        │   │   ├── 03_12_+b+iu+osdce.json
        │   │   ├── 03_12_+b+iuosdce.json
        │   │   ├── 03_12_+biu+osdce.json
        │   │   ├── 03_12_+biuosdce.json
        │   │   ├── 03_12_b+iu+osdce.json
        │   │   ├── 03_12_b+iuosdce.json
        │   │   ├── 03_12_biu+osdce.json
        │   │   ├── 03_12_biuosdce.json
        │   │   ├── 03_14_+b+iu+osdce.json
        │   │   ├── 03_14_+b+iuosdce.json
        │   │   ├── 03_14_+biu+osdce.json
        │   │   ├── 03_14_+biuosdce.json
        │   │   ├── 03_14_b+iu+osdce.json
        │   │   ├── 03_14_b+iuosdce.json
        │   │   ├── 03_14_biu+osdce.json
        │   │   ├── 03_14_biuosdce.json
        │   │   ├── 03_18_+b+iu+osdce.json
        │   │   ├── 03_18_+b+iuosdce.json
        │   │   ├── 03_18_+biu+osdce.json
        │   │   ├── 03_18_+biuosdce.json
        │   │   ├── 03_18_b+iu+osdce.json
        │   │   ├── 03_18_b+iuosdce.json
        │   │   ├── 03_18_biu+osdce.json
        │   │   ├── 03_18_biuosdce.json
        │   │   ├── 03_24_+b+iu+osdce.json
        │   │   ├── 03_24_+b+iuosdce.json
        │   │   ├── 03_24_+biu+osdce.json
        │   │   ├── 03_24_+biuosdce.json
        │   │   ├── 03_24_b+iu+osdce.json
        │   │   ├── 03_24_b+iuosdce.json
        │   │   ├── 03_24_biu+osdce.json
        │   │   ├── 03_24_biuosdce.json
        │   │   ├── 03_9_+b+iu+osdce.json
        │   │   ├── 03_9_+b+iuosdce.json
        │   │   ├── 03_9_+biu+osdce.json
        │   │   ├── 03_9_+biuosdce.json
        │   │   ├── 03_9_b+iu+osdce.json
        │   │   ├── 03_9_b+iuosdce.json
        │   │   ├── 03_9_biu+osdce.json
        │   │   ├── 03_9_biuosdce.json
        │   │   ├── 04_10_+b+iu+osdce.json
        │   │   ├── 04_10_+b+iuosdce.json
        │   │   ├── 04_10_+biu+osdce.json
        │   │   ├── 04_10_+biuosdce.json
        │   │   ├── 04_10_b+iu+osdce.json
        │   │   ├── 04_10_b+iuosdce.json
        │   │   ├── 04_10_biu+osdce.json
        │   │   ├── 04_10_biuosdce.json
        │   │   ├── 04_12_+b+iu+osdce.json
        │   │   ├── 04_12_+b+iuosdce.json
        │   │   ├── 04_12_+biu+osdce.json
        │   │   ├── 04_12_+biuosdce.json
        │   │   ├── 04_12_b+iu+osdce.json
        │   │   ├── 04_12_b+iuosdce.json
        │   │   ├── 04_12_biu+osdce.json
        │   │   ├── 04_12_biuosdce.json
        │   │   ├── 04_14_+b+iu+osdce.json
        │   │   ├── 04_14_+b+iuosdce.json
        │   │   ├── 04_14_+biu+osdce.json
        │   │   ├── 04_14_+biuosdce.json
        │   │   ├── 04_14_b+iu+osdce.json
        │   │   ├── 04_14_b+iuosdce.json
        │   │   ├── 04_14_biu+osdce.json
        │   │   ├── 04_14_biuosdce.json
        │   │   ├── 04_18_+b+iu+osdce.json
        │   │   ├── 04_18_+b+iuosdce.json
        │   │   ├── 04_18_+biu+osdce.json
        │   │   ├── 04_18_+biuosdce.json
        │   │   ├── 04_18_b+iu+osdce.json
        │   │   ├── 04_18_b+iuosdce.json
        │   │   ├── 04_18_biu+osdce.json
        │   │   ├── 04_18_biuosdce.json
        │   │   ├── 04_24_+b+iu+osdce.json
        │   │   ├── 04_24_+b+iuosdce.json
        │   │   ├── 04_24_+biu+osdce.json
        │   │   ├── 04_24_+biuosdce.json
        │   │   ├── 04_24_b+iu+osdce.json
        │   │   ├── 04_24_b+iuosdce.json
        │   │   ├── 04_24_biu+osdce.json
        │   │   ├── 04_24_biuosdce.json
        │   │   ├── 04_9_+b+iu+osdce.json
        │   │   ├── 04_9_+b+iuosdce.json
        │   │   ├── 04_9_+biu+osdce.json
        │   │   ├── 04_9_+biuosdce.json
        │   │   ├── 04_9_b+iu+osdce.json
        │   │   ├── 04_9_b+iuosdce.json
        │   │   ├── 04_9_biu+osdce.json
        │   │   ├── 04_9_biuosdce.json
        │   │   ├── 05_10_+b+iu+osdce.json
        │   │   ├── 05_10_+b+iuosdce.json
        │   │   ├── 05_10_+biu+osdce.json
        │   │   ├── 05_10_+biuosdce.json
        │   │   ├── 05_10_b+iu+osdce.json
        │   │   ├── 05_10_b+iuosdce.json
        │   │   ├── 05_10_biu+osdce.json
        │   │   ├── 05_10_biuosdce.json
        │   │   ├── 05_12_+b+iu+osdce.json
        │   │   ├── 05_12_+b+iuosdce.json
        │   │   ├── 05_12_+biu+osdce.json
        │   │   ├── 05_12_+biuosdce.json
        │   │   ├── 05_12_b+iu+osdce.json
        │   │   ├── 05_12_b+iuosdce.json
        │   │   ├── 05_12_biu+osdce.json
        │   │   ├── 05_12_biuosdce.json
        │   │   ├── 05_14_+b+iu+osdce.json
        │   │   ├── 05_14_+b+iuosdce.json
        │   │   ├── 05_14_+biu+osdce.json
        │   │   ├── 05_14_+biuosdce.json
        │   │   ├── 05_14_b+iu+osdce.json
        │   │   ├── 05_14_b+iuosdce.json
        │   │   ├── 05_14_biu+osdce.json
        │   │   ├── 05_14_biuosdce.json
        │   │   ├── 05_18_+b+iu+osdce.json
        │   │   ├── 05_18_+b+iuosdce.json
        │   │   ├── 05_18_+biu+osdce.json
        │   │   ├── 05_18_+biuosdce.json
        │   │   ├── 05_18_b+iu+osdce.json
        │   │   ├── 05_18_b+iuosdce.json
        │   │   ├── 05_18_biu+osdce.json
        │   │   ├── 05_18_biuosdce.json
        │   │   ├── 05_24_+b+iu+osdce.json
        │   │   ├── 05_24_+b+iuosdce.json
        │   │   ├── 05_24_+biu+osdce.json
        │   │   ├── 05_24_+biuosdce.json
        │   │   ├── 05_24_b+iu+osdce.json
        │   │   ├── 05_24_b+iuosdce.json
        │   │   ├── 05_24_biu+osdce.json
        │   │   ├── 05_24_biuosdce.json
        │   │   ├── 05_9_+b+iu+osdce.json
        │   │   ├── 05_9_+b+iuosdce.json
        │   │   ├── 05_9_+biu+osdce.json
        │   │   ├── 05_9_+biuosdce.json
        │   │   ├── 05_9_b+iu+osdce.json
        │   │   ├── 05_9_b+iuosdce.json
        │   │   ├── 05_9_biu+osdce.json
        │   │   ├── 05_9_biuosdce.json
        │   │   ├── 06_10_+b+iu+osdce.json
        │   │   ├── 06_10_+b+iuosdce.json
        │   │   ├── 06_10_+biu+osdce.json
        │   │   ├── 06_10_+biuosdce.json
        │   │   ├── 06_10_b+iu+osdce.json
        │   │   ├── 06_10_b+iuosdce.json
        │   │   ├── 06_10_biu+osdce.json
        │   │   ├── 06_10_biuosdce.json
        │   │   ├── 06_12_+b+iu+osdce.json
        │   │   ├── 06_12_+b+iuosdce.json
        │   │   ├── 06_12_+biu+osdce.json
        │   │   ├── 06_12_+biuosdce.json
        │   │   ├── 06_12_b+iu+osdce.json
        │   │   ├── 06_12_b+iuosdce.json
        │   │   ├── 06_12_biu+osdce.json
        │   │   ├── 06_12_biuosdce.json
        │   │   ├── 06_14_+b+iu+osdce.json
        │   │   ├── 06_14_+b+iuosdce.json
        │   │   ├── 06_14_+biu+osdce.json
        │   │   ├── 06_14_+biuosdce.json
        │   │   ├── 06_14_b+iu+osdce.json
        │   │   ├── 06_14_b+iuosdce.json
        │   │   ├── 06_14_biu+osdce.json
        │   │   ├── 06_14_biuosdce.json
        │   │   ├── 06_18_+b+iu+osdce.json
        │   │   ├── 06_18_+b+iuosdce.json
        │   │   ├── 06_18_+biu+osdce.json
        │   │   ├── 06_18_+biuosdce.json
        │   │   ├── 06_18_b+iu+osdce.json
        │   │   ├── 06_18_b+iuosdce.json
        │   │   ├── 06_18_biu+osdce.json
        │   │   ├── 06_18_biuosdce.json
        │   │   ├── 06_24_+b+iu+osdce.json
        │   │   ├── 06_24_+b+iuosdce.json
        │   │   ├── 06_24_+biu+osdce.json
        │   │   ├── 06_24_+biuosdce.json
        │   │   ├── 06_24_b+iu+osdce.json
        │   │   ├── 06_24_b+iuosdce.json
        │   │   ├── 06_24_biu+osdce.json
        │   │   ├── 06_24_biuosdce.json
        │   │   ├── 06_9_+b+iu+osdce.json
        │   │   ├── 06_9_+b+iuosdce.json
        │   │   ├── 06_9_+biu+osdce.json
        │   │   ├── 06_9_+biuosdce.json
        │   │   ├── 06_9_b+iu+osdce.json
        │   │   ├── 06_9_b+iuosdce.json
        │   │   ├── 06_9_biu+osdce.json
        │   │   ├── 06_9_biuosdce.json
        │   │   ├── 07_10_+b+iu+osdce.json
        │   │   ├── 07_10_+b+iuosdce.json
        │   │   ├── 07_10_+biu+osdce.json
        │   │   ├── 07_10_+biuosdce.json
        │   │   ├── 07_10_b+iu+osdce.json
        │   │   ├── 07_10_b+iuosdce.json
        │   │   ├── 07_10_biu+osdce.json
        │   │   ├── 07_10_biuosdce.json
        │   │   ├── 07_12_+b+iu+osdce.json
        │   │   ├── 07_12_+b+iuosdce.json
        │   │   ├── 07_12_+biu+osdce.json
        │   │   ├── 07_12_+biuosdce.json
        │   │   ├── 07_12_b+iu+osdce.json
        │   │   ├── 07_12_b+iuosdce.json
        │   │   ├── 07_12_biu+osdce.json
        │   │   ├── 07_12_biuosdce.json
        │   │   ├── 07_14_+b+iu+osdce.json
        │   │   ├── 07_14_+b+iuosdce.json
        │   │   ├── 07_14_+biu+osdce.json
        │   │   ├── 07_14_+biuosdce.json
        │   │   ├── 07_14_b+iu+osdce.json
        │   │   ├── 07_14_b+iuosdce.json
        │   │   ├── 07_14_biu+osdce.json
        │   │   ├── 07_14_biuosdce.json
        │   │   ├── 07_18_+b+iu+osdce.json
        │   │   ├── 07_18_+b+iuosdce.json
        │   │   ├── 07_18_+biu+osdce.json
        │   │   ├── 07_18_+biuosdce.json
        │   │   ├── 07_18_b+iu+osdce.json
        │   │   ├── 07_18_b+iuosdce.json
        │   │   ├── 07_18_biu+osdce.json
        │   │   ├── 07_18_biuosdce.json
        │   │   ├── 07_1_biuosdce.json
        │   │   ├── 07_24_+b+iu+osdce.json
        │   │   ├── 07_24_+b+iuosdce.json
        │   │   ├── 07_24_+biu+osdce.json
        │   │   ├── 07_24_+biuosdce.json
        │   │   ├── 07_24_b+iu+osdce.json
        │   │   ├── 07_24_b+iuosdce.json
        │   │   ├── 07_24_biu+osdce.json
        │   │   ├── 07_24_biuosdce.json
        │   │   ├── 07_9_+b+iu+osdce.json
        │   │   ├── 07_9_+b+iuosdce.json
        │   │   ├── 07_9_+biu+osdce.json
        │   │   ├── 07_9_+biuosdce.json
        │   │   ├── 07_9_b+iu+osdce.json
        │   │   ├── 07_9_b+iuosdce.json
        │   │   ├── 07_9_biu+osdce.json
        │   │   └── 07_9_biuosdce.json
        │   ├── intro/
        │   │   ├── introjs.js
        │   │   ├── script_reference/
        │   │   │   └── github-markdown.css
        │   │   └── style.css
        │   ├── sound/
        │   │   ├── sound.m4a
        │   │   └── sound.ogg
        │   └── test/
        │       ├── prevVersionStacks/
        │       │   ├── demo_anim.json
        │       │   ├── demo_game.json
        │       │   ├── demo_glider.json
        │       │   ├── demo_graphics.json
        │       │   ├── demo_spacegame.json
        │       │   ├── ref_commands.json
        │       │   ├── ref_event_handlers.json
        │       │   ├── ref_functions.json
        │       │   ├── ref_fundamentals.json
        │       │   └── ref_properties.json
        │       ├── testScriptExtensiveChunkTests.txt
        │       ├── testScriptExtensiveConditionalsCollateral.txt
        │       └── testScriptExtensiveConditionalsExpected.txt
        ├── src/
        │   ├── bridge/
        │   │   ├── bridgeBase64Js.ts
        │   │   ├── bridgeBrowserInfo.ts
        │   │   ├── bridgeChevrotain.ts
        │   │   ├── bridgeFileSaver.ts
        │   │   ├── bridgeJsGif.ts
        │   │   ├── bridgeJsLru.ts
        │   │   ├── bridgeLzString.ts
        │   │   ├── bridgePbkdf2.ts
        │   │   ├── bridgePizzicato.ts
        │   │   └── bridgeTextEncoding.ts
        │   ├── internaldocs.md
        │   ├── layers.cfg
        │   ├── test/
        │   │   ├── in-app-tests/
        │   │   │   ├── card1.script
        │   │   │   ├── card4.script
        │   │   │   ├── card4btn.script
        │   │   │   ├── inapptest.json
        │   │   │   ├── stackscript.script
        │   │   │   └── undotest.script
        │   │   ├── testUtils/
        │   │   │   ├── testTop.ts
        │   │   │   ├── testUtils.ts
        │   │   │   └── testUtilsCanvas.ts
        │   │   ├── ui512demo/
        │   │   │   ├── uiDemoBasic.ts
        │   │   │   ├── uiDemoButtons.ts
        │   │   │   ├── uiDemoComposites.ts
        │   │   │   ├── uiDemoMenus.ts
        │   │   │   ├── uiDemoPaint.ts
        │   │   │   ├── uiDemoText.ts
        │   │   │   └── uiDemoTextEdit.ts
        │   │   ├── util512/
        │   │   │   ├── testExternalLibs.ts
        │   │   │   ├── testUtil512.ts
        │   │   │   ├── testUtil512Assert.ts
        │   │   │   ├── testUtil512Class.ts
        │   │   │   ├── testUtil512Higher.ts
        │   │   │   ├── testUtilsCanvasWrapper.ts
        │   │   │   └── testUtilsDraw.ts
        │   │   ├── util512ui/
        │   │   │   ├── testUI512CodeEditor.ts
        │   │   │   ├── testUI512Composites.ts
        │   │   │   ├── testUI512DrawText.ts
        │   │   │   ├── testUI512Elements.ts
        │   │   │   ├── testUI512ElementsViewButtons.ts
        │   │   │   ├── testUI512FormattedText.ts
        │   │   │   ├── testUI512MenuRender.ts
        │   │   │   ├── testUI512Paint.ts
        │   │   │   ├── testUI512PaintFlood.ts
        │   │   │   ├── testUI512TextEdit.ts
        │   │   │   ├── testUI512TextEditInteractions.ts
        │   │   │   ├── testUI512TextModify.ts
        │   │   │   └── testUI512TextSelectEvents.ts
        │   │   ├── vpc/
        │   │   │   ├── vpcTestChunkResolution.ts
        │   │   │   ├── vpcTestElements.ts
        │   │   │   ├── vpcTestScriptEval.ts
        │   │   │   ├── vpcTestScriptExprLvl.ts
        │   │   │   ├── vpcTestScriptExtensiveChunk.ts
        │   │   │   ├── vpcTestScriptExtensiveIf.ts
        │   │   │   ├── vpcTestScriptParseCmd.ts
        │   │   │   ├── vpcTestScriptParseExpr.ts
        │   │   │   ├── vpcTestScriptRewrites.ts
        │   │   │   ├── vpcTestScriptRunBase.ts
        │   │   │   ├── vpcTestScriptRunCmd.ts
        │   │   │   ├── vpcTestScriptRunCustomFns.ts
        │   │   │   ├── vpcTestScriptRunSyntax.ts
        │   │   │   ├── vpcTestVpcVal.ts
        │   │   │   ├── vpcuiTestIntroProvider.ts
        │   │   │   └── vpcuiTestMsgBox.ts
        │   │   └── vpc03/
        │   │       ├── cmds/
        │   │       │   └── test03go.ts
        │   │       ├── fns/
        │   │       │   └── test03standalone.ts
        │   │       ├── props/
        │   │       │   ├── test03chunk.ts
        │   │       │   └── test03computed.ts
        │   │       ├── test03chunkAdditional.ts
        │   │       ├── test03chunkBasic.ts
        │   │       ├── test03exprObjectRef.ts
        │   │       ├── test03exprPseudoObjects.ts
        │   │       ├── test03lexer.ts
        │   │       └── test03objectRenderName.ts
        │   ├── ui512/
        │   │   ├── composites/
        │   │   │   ├── ui512ButtonGroup.ts
        │   │   │   ├── ui512CodeEditor.ts
        │   │   │   ├── ui512CodeEditorAutoIndent.ts
        │   │   │   ├── ui512Composites.ts
        │   │   │   ├── ui512ModalDialog.ts
        │   │   │   └── ui512Toolbox.ts
        │   │   ├── draw/
        │   │   │   ├── ui512DrawBorders.ts
        │   │   │   ├── ui512DrawIconClasses.ts
        │   │   │   ├── ui512DrawIconManager.ts
        │   │   │   ├── ui512DrawPaintDispatch.ts
        │   │   │   ├── ui512DrawPainter.ts
        │   │   │   ├── ui512DrawPainterClasses.ts
        │   │   │   ├── ui512DrawPatterns.ts
        │   │   │   ├── ui512ImageCollection.ts
        │   │   │   ├── ui512ImageDissolve.ts
        │   │   │   ├── ui512ImageSerialization.ts
        │   │   │   └── ui512Interfaces.ts
        │   │   ├── drawtext/
        │   │   │   ├── ui512ComplexFontChanges.ts
        │   │   │   ├── ui512DrawText.ts
        │   │   │   ├── ui512DrawTextArgs.ts
        │   │   │   ├── ui512DrawTextChar.ts
        │   │   │   ├── ui512DrawTextCharGrayed.ts
        │   │   │   ├── ui512DrawTextClasses.ts
        │   │   │   ├── ui512DrawTextFontRequest.ts
        │   │   │   ├── ui512FormattedText.ts
        │   │   │   └── ui512TranslateCharset.ts
        │   │   ├── elements/
        │   │   │   ├── ui512Element.ts
        │   │   │   ├── ui512ElementApp.ts
        │   │   │   ├── ui512ElementButton.ts
        │   │   │   ├── ui512ElementCanvasPiece.ts
        │   │   │   ├── ui512ElementGettable.ts
        │   │   │   ├── ui512ElementGroup.ts
        │   │   │   ├── ui512ElementLabel.ts
        │   │   │   ├── ui512ElementMenu.ts
        │   │   │   ├── ui512ElementTextField.ts
        │   │   │   └── ui512ElementView.ts
        │   │   ├── lang/
        │   │   │   └── langBase.ts
        │   │   ├── menu/
        │   │   │   ├── ui512Events.ts
        │   │   │   ├── ui512MenuAnimation.ts
        │   │   │   ├── ui512MenuListeners.ts
        │   │   │   ├── ui512MenuPositioning.ts
        │   │   │   ├── ui512PresenterWithMenu.ts
        │   │   │   └── ui512SuspendEvents.ts
        │   │   ├── presentation/
        │   │   │   ├── ui512Presenter.ts
        │   │   │   └── ui512PresenterBase.ts
        │   │   ├── root/
        │   │   │   ├── rootSetupHelpers.ts
        │   │   │   ├── rootStartCanvas.ts
        │   │   │   └── rootUI512.ts
        │   │   ├── textedit/
        │   │   │   ├── ui512BasicHandlers.ts
        │   │   │   ├── ui512ClipManager.ts
        │   │   │   ├── ui512GenericField.ts
        │   │   │   ├── ui512Scrollbar.ts
        │   │   │   ├── ui512TextEvents.ts
        │   │   │   ├── ui512TextLines.ts
        │   │   │   ├── ui512TextSelModify.ts
        │   │   │   └── ui512TextSelModifyImpl.ts
        │   │   └── utils/
        │   │       ├── util512.ts
        │   │       ├── util512Assert.ts
        │   │       ├── util512Base.ts
        │   │       ├── util512Higher.ts
        │   │       ├── util512Serialize.ts
        │   │       ├── utilsCanvasDraw.ts
        │   │       ├── utilsCursors.ts
        │   │       ├── utilsDrawConstants.ts
        │   │       └── utilsKeypressHelpers.ts
        │   ├── vpc/
        │   │   ├── codeexec/
        │   │   │   ├── vpcScriptCaches.ts
        │   │   │   ├── vpcScriptExecAsync.ts
        │   │   │   ├── vpcScriptExecFrame.ts
        │   │   │   ├── vpcScriptExecFrameStack.ts
        │   │   │   ├── vpcScriptExecInternalDirective.ts
        │   │   │   ├── vpcScriptExecStatement.ts
        │   │   │   ├── vpcScriptExecStatementHelpers.ts
        │   │   │   └── vpcScriptExecTop.ts
        │   │   ├── codeparse/
        │   │   │   ├── vpcParser.ts
        │   │   │   ├── vpcTokens.ts
        │   │   │   ├── vpcVisitor.ts
        │   │   │   ├── vpcVisitorInterface.ts
        │   │   │   └── vpcVisitorMixin.ts
        │   │   ├── codepreparse/
        │   │   │   ├── vpcBuiltinFunctions.ts
        │   │   │   ├── vpcBuiltinFunctionsUtils.ts
        │   │   │   ├── vpcCheckReserved.ts
        │   │   │   ├── vpcLineToCodeObj.ts
        │   │   │   ├── vpcPreparseCommon.ts
        │   │   │   ├── vpcProcessBranchAndLoops.ts
        │   │   │   ├── vpcRewritesCommands.ts
        │   │   │   ├── vpcRewritesConditions.ts
        │   │   │   ├── vpcRewritesCustomFunctions.ts
        │   │   │   ├── vpcRewritesGlobal.ts
        │   │   │   ├── vpcRewritesLoops.ts
        │   │   │   └── vpcTopPreparse.ts
        │   │   ├── request/
        │   │   │   ├── vpcRequest.ts
        │   │   │   ├── vpcRequestBase.ts
        │   │   │   └── vpcSigned.ts
        │   │   ├── vel/
        │   │   │   ├── velBase.ts
        │   │   │   ├── velBg.ts
        │   │   │   ├── velButton.ts
        │   │   │   ├── velCard.ts
        │   │   │   ├── velField.ts
        │   │   │   ├── velFieldChangeFont.ts
        │   │   │   ├── velModelTop.ts
        │   │   │   ├── velOutsideInterfaces.ts
        │   │   │   ├── velProductOpts.ts
        │   │   │   ├── velRenderName.ts
        │   │   │   ├── velResolveContainer.ts
        │   │   │   ├── velResolveReference.ts
        │   │   │   ├── velSerialization.ts
        │   │   │   ├── velStack.ts
        │   │   │   └── velStackOrderHelpers.ts
        │   │   └── vpcutils/
        │   │       ├── vpcAudio.ts
        │   │       ├── vpcChunkResolution.ts
        │   │       ├── vpcChunkResolutionSort.ts
        │   │       ├── vpcChunkResolutionUtils.ts
        │   │       ├── vpcEnums.ts
        │   │       ├── vpcInitIcons.ts
        │   │       ├── vpcRequestedReference.ts
        │   │       ├── vpcStandardLibDoMenu.ts
        │   │       ├── vpcStandardLibScript.ts
        │   │       ├── vpcTables.ts
        │   │       ├── vpcUtils.ts
        │   │       ├── vpcVal.ts
        │   │       ├── vpcValEval.ts
        │   │       └── vpcVarCollection.ts
        │   └── vpcui/
        │       ├── intro/
        │       │   ├── vpcInterfaceImpl.ts
        │       │   ├── vpcIntro.ts
        │       │   ├── vpcIntroInterface.ts
        │       │   ├── vpcIntroPageBase.ts
        │       │   ├── vpcIntroPageFirst.ts
        │       │   ├── vpcIntroPageLoading.ts
        │       │   ├── vpcIntroPageOpen.ts
        │       │   ├── vpcIntroPagePickFile.ts
        │       │   └── vpcIntroProvider.ts
        │       ├── menu/
        │       │   ├── vpcAboutDialog.ts
        │       │   ├── vpcAppMenuActions.ts
        │       │   ├── vpcMenu.ts
        │       │   └── vpcMenuStructure.ts
        │       ├── modelrender/
        │       │   ├── vpcGifExport.ts
        │       │   ├── vpcModelRender.ts
        │       │   └── vpcPaintRender.ts
        │       ├── nonmodaldialogs/
        │       │   ├── vpcDocViewer.ts
        │       │   ├── vpcFormLogin.ts
        │       │   ├── vpcFormNewUser.ts
        │       │   ├── vpcFormSendReport.ts
        │       │   ├── vpcLyrNonModalHolder.ts
        │       │   └── vpcReplMessageBox.ts
        │       ├── panels/
        │       │   ├── vpcEditPanelsBase.ts
        │       │   ├── vpcEditPanelsBtn.ts
        │       │   ├── vpcEditPanelsCard.ts
        │       │   ├── vpcEditPanelsEmpty.ts
        │       │   ├── vpcEditPanelsFld.ts
        │       │   ├── vpcEditPanelsStack.ts
        │       │   ├── vpcLyrDragHandles.ts
        │       │   ├── vpcLyrNotification.ts
        │       │   ├── vpcLyrPanels.ts
        │       │   ├── vpcLyrToolbox.ts
        │       │   ├── vpcPanelsInterface.ts
        │       │   ├── vpcScriptEditor.ts
        │       │   ├── vpcToolboxMain.ts
        │       │   ├── vpcToolboxNav.ts
        │       │   └── vpcToolboxPatterns.ts
        │       ├── presentation/
        │       │   ├── vpcInternalDirectiveImpl.ts
        │       │   ├── vpcPresenter.ts
        │       │   ├── vpcPresenterEvents.ts
        │       │   ├── vpcPresenterInit.ts
        │       │   ├── vpcPresenterInterface.ts
        │       │   └── vpcSave.ts
        │       ├── state/
        │       │   ├── vpcCreateOrDelVel.ts
        │       │   ├── vpcInterface.ts
        │       │   ├── vpcOutsideImpl.ts
        │       │   ├── vpcState.ts
        │       │   ├── vpcStateSerialize.ts
        │       │   └── vpcUndo.ts
        │       └── tools/
        │           ├── vpcToolBase.ts
        │           ├── vpcToolBrowse.ts
        │           ├── vpcToolBucket.ts
        │           ├── vpcToolCurve.ts
        │           ├── vpcToolEdit.ts
        │           ├── vpcToolLasso.ts
        │           ├── vpcToolSelect.ts
        │           ├── vpcToolSelectBase.ts
        │           ├── vpcToolShape.ts
        │           ├── vpcToolSmear.ts
        │           └── vpcToolStamp.ts
        ├── tools/
        │   ├── add-assert-markers/
        │   │   ├── assertmarkerutils.py
        │   │   ├── base90.py
        │   │   ├── config.cfg
        │   │   ├── current_assert_id.txt
        │   │   ├── main.py
        │   │   └── readconfig.py
        │   ├── genparse/
        │   │   ├── bgrammar_01.ccc
        │   │   ├── bgrammarcmds_01.ccc
        │   │   ├── list-all.ccc
        │   │   ├── main.py
        │   │   ├── produceparser.py
        │   │   ├── producetokens.py
        │   │   ├── producevisitor.py
        │   │   └── readgrammarinput.py
        │   ├── prettier-except-long-imports/
        │   │   ├── check_for_long_lines.py
        │   │   ├── check_for_null_coalesce.py
        │   │   ├── check_more.py
        │   │   ├── check_tests_referenced.py
        │   │   ├── config.cfg
        │   │   ├── find_missing_comments.py
        │   │   ├── help_fix_long_lines.py
        │   │   ├── main.py
        │   │   ├── place_imports_one_line.py
        │   │   └── readconfig.py
        │   ├── readme.md
        │   ├── releasetools/
        │   │   ├── minify.txt
        │   │   └── release steps.txt
        │   ├── set_tsconfig_flavor.js
        │   └── typescript-super-auto-import/
        │       ├── README.md
        │       ├── config.cfg
        │       ├── main.py
        │       ├── readconfig.py
        │       ├── ts_add_copyright.py
        │       ├── ts_exports_read.py
        │       ├── ts_layers_read.py
        │       └── ts_parsing.py
        ├── tsconfig.development.json
        ├── tsconfig.json
        ├── tsconfig.production.json
        ├── webpack.config.development.js
        └── webpack.config.production.js
Download .txt
Showing preview only (337K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3915 symbols across 278 files)

FILE: vipercard/doc/gendocs.py
  function parseSection (line 18) | def parseSection(txt):
  function parseBody (line 41) | def parseBody(txt, title):
  function parseAll (line 59) | def parseAll(f):

FILE: vipercard/doc/gendocs_to_md.py
  function addFormattingMarkdown (line 5) | def addFormattingMarkdown(s):
  function goSection (line 41) | def goSection(section, sectionfulltitle, outname, outfile, myHeaderLinks):
  function makeHeaderLinks (line 58) | def makeHeaderLinks(data, mapIt, outname1):
  function goToMarkdown (line 70) | def goToMarkdown(indir):
  function transformToHtml (line 90) | def transformToHtml(indir, outdir):
  function fixuphtml (line 192) | def fixuphtml(short, alltxt, headerfragment):
  function fixuphtmlpage (line 212) | def fixuphtmlpage(alltxt):
  function movePagesUp (line 222) | def movePagesUp(outdir):

FILE: vipercard/doc/gendocs_tovipercard.py
  function goItem (line 9) | def goItem(item):
  function goSection (line 41) | def goSection(section, sectionfulltitle, outname, outfile):
  function goTsIndexSection (line 53) | def goTsIndexSection(section, sectionfulltitle, outname):
  function goToVipercard (line 67) | def goToVipercard(indir, outdir):

FILE: vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.d.ts
  type FileSaver (line 11) | interface FileSaver {

FILE: vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.js
  function bom (line 29) | function bom(blob, opts) {
  function download (line 49) | function download(url, name, opts) {
  function corsEnabled (line 65) | function corsEnabled(url) {
  function click (line 78) | function click(node) {

FILE: vipercard/vipercard/external/base64-js-1.3.1/base64js.js
  function getLens (line 22) | function getLens (b64) {
  function byteLength (line 42) | function byteLength (b64) {
  function _byteLength (line 49) | function _byteLength (b64, validLen, placeHoldersLen) {
  function toByteArray (line 53) | function toByteArray (b64) {
  function tripletToBase64 (line 99) | function tripletToBase64 (num) {
  function encodeChunk (line 106) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 119) | function fromByteArray (uint8) {

FILE: vipercard/vipercard/external/bowser-2.9/bowser-2.9-bundled.js
  function e (line 1) | function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{...
  function t (line 1) | function t(){}
  function I (line 1) | function I(t,n,e){var r,i,o,u=new Array(e),a=8*e-n-1,c=(1<<a)-1,s=c>>1,f...
  function j (line 1) | function j(t,n,e){var r,i=8*e-n-1,o=(1<<i)-1,u=o>>1,a=i-7,c=e-1,s=t[c--]...
  function L (line 1) | function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}
  function B (line 1) | function B(t){return[255&t]}
  function C (line 1) | function C(t){return[255&t,t>>8&255]}
  function W (line 1) | function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}
  function V (line 1) | function V(t){return I(t,52,8)}
  function G (line 1) | function G(t){return I(t,23,4)}
  function D (line 1) | function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}
  function U (line 1) | function U(t,n,e,r){var i=d(+e);if(i+n>t[k])throw M(b);var o=t[R]._b,u=i...
  function z (line 1) | function z(t,n,e,r,i,o){var u=d(+e);if(u+n>t[k])throw M(b);for(var a=t[R...
  function u (line 1) | function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.en...
  function t (line 1) | function t(){}
  function c (line 1) | function c(t){return t&&t.__esModule?t:{default:t}}
  function t (line 1) | function t(t,n){if(void 0===n&&(n=!1),null==t||""===t)throw new Error("U...
  function i (line 1) | function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||v...
  function t (line 1) | function t(){}
  function v (line 1) | function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==...
  function t (line 1) | function t(){}
  function c (line 1) | function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.creat...
  function s (line 1) | function s(t,n,e){try{return{type:"normal",arg:t.call(n,e)}}catch(t){ret...
  function v (line 1) | function v(){}
  function g (line 1) | function g(){}
  function y (line 1) | function y(){}
  function _ (line 1) | function _(t){["next","throw","return"].forEach((function(n){t[n]=functi...
  function M (line 1) | function M(t){var n;this._invoke=function(e,i){function o(){return new P...
  function x (line 1) | function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,...
  function P (line 1) | function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.f...
  function O (line 1) | function O(t){var n=t.completion||{};n.type="normal",delete n.arg,t.comp...
  function A (line 1) | function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(P,this),this.r...
  function F (line 1) | function F(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==type...
  function E (line 1) | function E(){return{value:n,done:!0}}
  function i (line 1) | function i(r,i){return a.type="throw",a.arg=t,e.next=r,i&&(e.method="nex...

FILE: vipercard/vipercard/external/bowser-2.9/bowser.d.ts
  type Parser (line 34) | interface Parser {
  type ParsedResult (line 212) | interface ParsedResult {
  type Details (line 219) | interface Details {
  type OSDetails (line 224) | interface OSDetails extends Details {
  type PlatformDetails (line 228) | interface PlatformDetails {
  type BrowserDetails (line 234) | type BrowserDetails = Details;
  type EngineDetails (line 235) | type EngineDetails = Details;
  type checkTree (line 237) | interface checkTree {

FILE: vipercard/vipercard/external/chevrotain-6.5.0/chevrotain.js
  function __webpack_require__ (line 17) | function __webpack_require__(moduleId) {
  function isEmpty (line 114) | function isEmpty(arr) {
  function keys (line 118) | function keys(obj) {
  function values (line 125) | function values(obj) {
  function mapValues (line 134) | function mapValues(obj, callback) {
  function map (line 144) | function map(arr, callback) {
  function flatten (line 152) | function flatten(arr) {
  function first (line 166) | function first(arr) {
  function last (line 170) | function last(arr) {
  function forEach (line 175) | function forEach(collection, iteratorCallback) {
  function isString (line 195) | function isString(item) {
  function isUndefined (line 199) | function isUndefined(item) {
  function isFunction (line 203) | function isFunction(item) {
  function drop (line 207) | function drop(arr, howMuch) {
  function dropRight (line 212) | function dropRight(arr, howMuch) {
  function filter (line 217) | function filter(arr, predicate) {
  function reject (line 230) | function reject(arr, predicate) {
  function pick (line 234) | function pick(obj, predicate) {
  function has (line 247) | function has(obj, prop) {
  function contains (line 254) | function contains(arr, item) {
  function cloneArr (line 261) | function cloneArr(arr) {
  function cloneObj (line 272) | function cloneObj(obj) {
  function find (line 283) | function find(arr, predicate) {
  function findAll (line 293) | function findAll(arr, predicate) {
  function reduce (line 304) | function reduce(arrOrObj, iterator, initial) {
  function compact (line 315) | function compact(arr) {
  function uniq (line 319) | function uniq(arr, identity) {
  function partial (line 334) | function partial(func) {
  function isArray (line 344) | function isArray(obj) {
  function isRegExp (line 348) | function isRegExp(obj) {
  function isObject (line 352) | function isObject(obj) {
  function every (line 356) | function every(arr, predicate) {
  function difference (line 365) | function difference(arr, values) {
  function some (line 369) | function some(arr, predicate) {
  function indexOf (line 378) | function indexOf(arr, value) {
  function sortBy (line 387) | function sortBy(arr, orderFunc) {
  function zipObject (line 393) | function zipObject(keys, values) {
  function assign (line 407) | function assign(target) {
  function assignNoOverwrite (line 426) | function assignNoOverwrite(target) {
  function defaults (line 447) | function defaults() {
  function groupBy (line 455) | function groupBy(arr, groupKeyFunc) {
  function merge (line 474) | function merge(obj1, obj2) {
  function NOOP (line 485) | function NOOP() { }
  function IDENTITY (line 487) | function IDENTITY(item) {
  function packArray (line 494) | function packArray(holeyArr) {
  function PRINT_ERROR (line 503) | function PRINT_ERROR(msg) {
  function PRINT_WARNING (line 510) | function PRINT_WARNING(msg) {
  function isES2015MapSupported (line 518) | function isES2015MapSupported() {
  function applyMixins (line 522) | function applyMixins(derivedCtor, baseCtors) {
  function toFastProperties (line 543) | function toFastProperties(toBecomeFast) {
  function peek (line 562) | function peek(arr) {
  function timer (line 567) | function timer(func) {
  function __ (line 592) | function __() { this.constructor = d; }
  function AbstractProduction (line 600) | function AbstractProduction(definition) {
  function NonTerminal (line 614) | function NonTerminal(options) {
  function Rule (line 642) | function Rule(options) {
  function Flat (line 656) | function Flat(options) {
  function Option (line 667) | function Option(options) {
  function RepetitionMandatory (line 678) | function RepetitionMandatory(options) {
  function RepetitionMandatoryWithSeparator (line 689) | function RepetitionMandatoryWithSeparator(options) {
  function Repetition (line 700) | function Repetition(options) {
  function RepetitionWithSeparator (line 711) | function RepetitionWithSeparator(options) {
  function Alternation (line 722) | function Alternation(options) {
  function Terminal (line 734) | function Terminal(options) {
  function serializeGrammar (line 744) | function serializeGrammar(topRules) {
  function serializeProduction (line 748) | function serializeProduction(node) {
  function __ (line 860) | function __() { this.constructor = d; }
  function EMPTY_ALT (line 916) | function EMPTY_ALT(value) {
  function Parser (line 924) | function Parser(tokenVocabulary, config) {
  function CstParser (line 1060) | function CstParser(tokenVocabulary, config) {
  function EmbeddedActionsParser (line 1073) | function EmbeddedActionsParser(tokenVocabulary, config) {
  function tokenLabel (line 1096) | function tokenLabel(tokType) {
  function tokenName (line 1105) | function tokenName(tokType) {
  function hasTokenLabel (line 1109) | function hasTokenLabel(obj) {
  function createToken (line 1122) | function createToken(config) {
  function createTokenInternal (line 1126) | function createTokenInternal(config) {
  function createTokenInstance (line 1167) | function createTokenInstance(tokType, image, startOffset, endOffset, sta...
  function tokenMatcher (line 1181) | function tokenMatcher(token, tokType) {
  function GAstVisitor (line 1196) | function GAstVisitor() {
  function tokenStructuredMatcher (line 1249) | function tokenStructuredMatcher(tokInstance, tokConstructor) {
  function tokenStructuredMatcherNoCategories (line 1262) | function tokenStructuredMatcherNoCategories(token, tokType) {
  function augmentTokenTypes (line 1268) | function augmentTokenTypes(tokenTypes) {
  function expandCategories (line 1281) | function expandCategories(tokenTypes) {
  function assignTokenDefaultProps (line 1299) | function assignTokenDefaultProps(tokenTypes) {
  function assignCategoriesTokensProp (line 1325) | function assignCategoriesTokensProp(tokenTypes) {
  function assignCategoriesMapProp (line 1335) | function assignCategoriesMapProp(tokenTypes) {
  function singleAssignCategoriesToksMap (line 1341) | function singleAssignCategoriesToksMap(path, nextNode) {
  function hasShortKeyProperty (line 1354) | function hasShortKeyProperty(tokType) {
  function hasCategoriesProperty (line 1358) | function hasCategoriesProperty(tokType) {
  function hasExtendingTokensTypesProperty (line 1362) | function hasExtendingTokensTypesProperty(tokType) {
  function hasExtendingTokensTypesMapProperty (line 1366) | function hasExtendingTokensTypesMapProperty(tokType) {
  function isTokenType (line 1370) | function isTokenType(tokType) {
  function __ (line 1391) | function __() { this.constructor = d; }
  function isSequenceProd (line 1399) | function isSequenceProd(prod) {
  function isOptionalProd (line 1410) | function isOptionalProd(prod, alreadyVisited) {
  function isBranchingProd (line 1444) | function isBranchingProd(prod) {
  function getProductionDslName (line 1448) | function getProductionDslName(prod) {
  function DslMethodsCollectorVisitor (line 1481) | function DslMethodsCollectorVisitor() {
  function collectMethods (line 1541) | function collectMethods(rule) {
  function getKeyForAutomaticLookahead (line 1582) | function getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {
  function getKeyForAltIndex (line 1589) | function getKeyForAltIndex(ruleIdx, dslMethodIdx, occurrence, altIdx) {
  function isRecognitionException (line 1620) | function isRecognitionException(error) {
  function MismatchedTokenException (line 1625) | function MismatchedTokenException(message, token, previousToken) {
  function NoViableAltException (line 1636) | function NoViableAltException(message, token, previousToken) {
  function NotAllInputParsedException (line 1645) | function NotAllInputParsedException(message, token) {
  function EarlyExitException (line 1653) | function EarlyExitException(message, token, previousToken) {
  function Lexer (line 1709) | function Lexer(lexerDefinition, config) {
  function getPossiblePatternsSlow (line 1947) | function getPossiblePatternsSlow() {
  function getPossiblePatternsOptimized (line 1950) | function getPossiblePatternsOptimized(charCode) {
  function push_mode (line 1998) | function push_mode(newMode) {
  function getExtraProductionArgument (line 2427) | function getExtraProductionArgument(prod) {
  function __ (line 2570) | function __() { this.constructor = d; }
  function validateGrammar (line 2584) | function validateGrammar(topLevels, globalMaxLookahead, tokenTypes, igno...
  function validateNestedRulesNames (line 2623) | function validateNestedRulesNames(topLevels, errMsgProvider) {
  function validateDuplicateProductions (line 2635) | function validateDuplicateProductions(topLevelRule, errMsgProvider) {
  function identifyProductionForDuplicates (line 2662) | function identifyProductionForDuplicates(prod) {
  function getExtraProductionArgument (line 2666) | function getExtraProductionArgument(prod) {
  function OccurrenceValidationCollector (line 2679) | function OccurrenceValidationCollector() {
  function validateRuleName (line 2714) | function validateRuleName(rule, errMsgProvider) {
  function validateNestedRuleName (line 2731) | function validateNestedRuleName(topLevel, nestedProd, errMsgProvider) {
  function validateTokenName (line 2746) | function validateTokenName(tokenType, errMsgProvider) {
  function validateRuleDoesNotAlreadyExist (line 2761) | function validateRuleDoesNotAlreadyExist(rule, allRules, className, errM...
  function validateRuleIsOverridden (line 2786) | function validateRuleIsOverridden(ruleName, definedRulesNames, className) {
  function validateNoLeftRecursion (line 2802) | function validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) {
  function getFirstNoneTerminal (line 2834) | function getFirstNoneTerminal(definition) {
  function OrCollector (line 2877) | function OrCollector() {
  function validateEmptyOrAlternative (line 2887) | function validateEmptyOrAlternative(topLevelRule, errMsgProvider) {
  function validateAmbiguousAlternationAlternatives (line 2917) | function validateAmbiguousAlternationAlternatives(topLevelRule, globalMa...
  function RepetionCollector (line 2946) | function RepetionCollector() {
  function validateTooManyAlts (line 2966) | function validateTooManyAlts(topLevelRule, errMsgProvider) {
  function validateSomeNonEmptyLookaheadPath (line 2987) | function validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, ...
  function checkAlternativesAmbiguities (line 3015) | function checkAlternativesAmbiguities(alternatives, alternation, rule, e...
  function checkPrefixAlternativesAmbiguities (line 3062) | function checkPrefixAlternativesAmbiguities(alternatives, alternation, r...
  function checkTerminalAndNoneTerminalsNameSpace (line 3112) | function checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, e...
  function validateDuplicateNestedRules (line 3128) | function validateDuplicateNestedRules(topLevelRules, errMsgProvider) {
  function __ (line 3166) | function __() { this.constructor = d; }
  function getProdType (line 3186) | function getProdType(prod) {
  function buildLookaheadFuncForOr (line 3211) | function buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, ...
  function buildLookaheadFuncForOptionalProd (line 3231) | function buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, d...
  function buildAlternativesLookAheadFunc (line 3239) | function buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatche...
  function buildSingleAlternativeLookaheadFunction (line 3348) | function buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dyna...
  function RestDefinitionFinderWalker (line 3403) | function RestDefinitionFinderWalker(topProd, targetOccurrence, targetPro...
  function InsideDefinitionFinderVisitor (line 3455) | function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType,...
  function initializeArrayOfArrays (line 3490) | function initializeArrayOfArrays(size) {
  function pathToHashKeys (line 3502) | function pathToHashKeys(path) {
  function isUniquePrefixHash (line 3522) | function isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {
  function lookAheadSequenceFromAlternatives (line 3539) | function lookAheadSequenceFromAlternatives(altsDefs, k) {
  function getLookaheadPathsForOr (line 3602) | function getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {
  function getLookaheadPathsForOptionalProd (line 3608) | function getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodT...
  function containsPath (line 3619) | function containsPath(alternative, searchPath) {
  function isStrictPrefixOfPath (line 3640) | function isStrictPrefixOfPath(prefix, other) {
  function areTokenCategoriesNotUsed (line 3649) | function areTokenCategoriesNotUsed(lookAheadPaths) {
  function __ (line 3674) | function __() { this.constructor = d; }
  function AbstractNextPossibleTokensWalker (line 3685) | function AbstractNextPossibleTokensWalker(topProd, path) {
  function NextAfterTokenWalker (line 3746) | function NextAfterTokenWalker(topProd, path) {
  function AbstractNextTerminalAfterProductionWalker (line 3775) | function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) {
  function NextTerminalAfterManyWalker (line 3795) | function NextTerminalAfterManyWalker() {
  function NextTerminalAfterManySepWalker (line 3816) | function NextTerminalAfterManySepWalker() {
  function NextTerminalAfterAtLeastOneWalker (line 3837) | function NextTerminalAfterAtLeastOneWalker() {
  function NextTerminalAfterAtLeastOneSepWalker (line 3859) | function NextTerminalAfterAtLeastOneSepWalker() {
  function possiblePathsFrom (line 3880) | function possiblePathsFrom(targetDef, maxLength, currPath) {
  function nextPossibleTokensAfter (line 3972) | function nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, ma...
  function expandTopLevelRule (line 4198) | function expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurre...
  function RestWalker (line 4226) | function RestWalker() {
  function restForRepetitionWithSeparator (line 4318) | function restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {
  function RegExpParser (line 4353) | function RegExpParser() {}
  function cc (line 5117) | function cc(char) {
  function insertToSet (line 5121) | function insertToSet(item, set) {
  function addFlag (line 5131) | function addFlag(flagObj, flagKey) {
  function ASSERT_EXISTS (line 5139) | function ASSERT_EXISTS(obj) {
  function ASSERT_NEVER_REACH_HERE (line 5147) | function ASSERT_NEVER_REACH_HERE() {
  function BaseRegExpVisitor (line 5196) | function BaseRegExpVisitor() {}
  function getRegExpAst (line 5317) | function getRegExpAst(regExp) {
  function clearRegExpParserCache (line 5329) | function clearRegExpParserCache() {
  function __ (line 5350) | function __() { this.constructor = d; }
  function setNodeLocationOnlyOffset (line 5366) | function setNodeLocationOnlyOffset(currNodeLocation, newLocationInfo) {
  function setNodeLocationFull (line 5391) | function setNodeLocationFull(currNodeLocation, newLocationInfo) {
  function addTerminalToCst (line 5415) | function addTerminalToCst(node, token, tokenTypeName) {
  function addNoneTerminalToCst (line 5424) | function addNoneTerminalToCst(node, ruleName, ruleResult) {
  function NamedDSLMethodsCollectorVisitor (line 5435) | function NamedDSLMethodsCollectorVisitor(ruleIdx) {
  function expandAllNestedRuleNames (line 5516) | function expandAllNestedRuleNames(topRules, fullToShortName) {
  function clearCache (line 5598) | function clearCache() {
  function __ (line 5639) | function __() { this.constructor = d; }
  function disableSticky (line 5653) | function disableSticky() {
  function enableSticky (line 5657) | function enableSticky() {
  function analyzeTokenTypes (line 5661) | function analyzeTokenTypes(tokenTypes, options) {
  function validatePatterns (line 5912) | function validatePatterns(tokenTypes, validModesNames) {
  function validateRegExpPattern (line 5926) | function validateRegExpPattern(tokenTypes) {
  function findMissingPatterns (line 5938) | function findMissingPatterns(tokenTypes) {
  function findInvalidPatterns (line 5955) | function findInvalidPatterns(tokenTypes) {
  function findEndOfInputAnchor (line 5978) | function findEndOfInputAnchor(tokenTypes) {
  function findEmptyMatchRegExps (line 6020) | function findEmptyMatchRegExps(tokenTypes) {
  function findStartOfInputAnchor (line 6038) | function findStartOfInputAnchor(tokenTypes) {
  function findUnsupportedFlags (line 6080) | function findUnsupportedFlags(tokenTypes) {
  function findDuplicatePatterns (line 6098) | function findDuplicatePatterns(tokenTypes) {
  function findInvalidGroupType (line 6133) | function findInvalidGroupType(tokenTypes) {
  function findModesThatDoNotExist (line 6153) | function findModesThatDoNotExist(tokenTypes, validModes) {
  function findUnreachablePatterns (line 6170) | function findUnreachablePatterns(tokenTypes) {
  function testTokenType (line 6206) | function testTokenType(str, pattern) {
  function noMetaChar (line 6227) | function noMetaChar(regExp) {
  function addStartOfInput (line 6247) | function addStartOfInput(pattern) {
  function addStickyFlag (line 6254) | function addStickyFlag(pattern) {
  function performRuntimeChecks (line 6261) | function performRuntimeChecks(lexerDefinition, trackLines, lineTerminato...
  function performWarningRuntimeChecks (line 6305) | function performWarningRuntimeChecks(lexerDefinition, trackLines, lineTe...
  function cloneEmptyGroups (line 6351) | function cloneEmptyGroups(emptyGroups) {
  function isCustomPattern (line 6368) | function isCustomPattern(tokenType) {
  function isShortPattern (line 6390) | function isShortPattern(pattern) {
  function checkLineBreaksIssues (line 6426) | function checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {
  function buildLineBreakIssueMessage (line 6460) | function buildLineBreakIssueMessage(tokType, details) {
  function getCharCodes (line 6478) | function getCharCodes(charsOrCodes) {
  function addToMapOfArrays (line 6489) | function addToMapOfArrays(map, key, value) {
  function charCodeToOptimizedIndex (line 6513) | function charCodeToOptimizedIndex(charCode) {
  function initCharCodeToOptimizedIndexMap (line 6528) | function initCharCodeToOptimizedIndexMap() {
  function first (line 6567) | function first(prod) {
  function firstForSequence (line 6594) | function firstForSequence(prod) {
  function firstForBranching (line 6613) | function firstForBranching(prod) {
  function firstForTerminal (line 6620) | function firstForTerminal(terminal) {
  function resolveGrammar (line 6649) | function resolveGrammar(options) {
  function validateGrammar (line 6660) | function validateGrammar(options) {
  function assignOccurrenceIndices (line 6668) | function assignOccurrenceIndices(options) {
  function InRuleRecoveryException (line 6696) | function InRuleRecoveryException(message) {
  function Recoverable (line 6706) | function Recoverable() {
  function attemptInRepetitionRecovery (line 6966) | function attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslM...
  function classNameFromInstance (line 7005) | function classNameFromInstance(instance) {
  function functionName (line 7012) | function functionName(func) {
  function defineNameProp (line 7027) | function defineNameProp(obj, nameValue) {
  function __ (line 7060) | function __() { this.constructor = d; }
  function ResyncFollowsWalker (line 7074) | function ResyncFollowsWalker(topProd) {
  function computeAllProdsFollows (line 7098) | function computeAllProdsFollows(topProductions) {
  function buildBetweenProdsFollowPrefix (line 7107) | function buildBetweenProdsFollowPrefix(inner, occurenceInParent) {
  function buildInProdFollowPrefix (line 7111) | function buildInProdFollowPrefix(terminal) {
  function __ (line 7133) | function __() { this.constructor = d; }
  function getOptimizedStartCodesIndices (line 7144) | function getOptimizedStartCodesIndices(regExp, ensureOptimizations) {
  function firstCharOptimizedIndices (line 7181) | function firstCharOptimizedIndices(ast, result, ignoreCase) {
  function addOptimizedIdxToResult (line 7281) | function addOptimizedIdxToResult(code, result, ignoreCase) {
  function handleIgnoreCase (line 7288) | function handleIgnoreCase(code, result) {
  function findCode (line 7304) | function findCode(setNode, targetCharCodes) {
  function isWholeOptional (line 7318) | function isWholeOptional(ast) {
  function CharCodeFinder (line 7331) | function CharCodeFinder(targetCharCodes) {
  function canMatchCharCode (line 7373) | function canMatchCharCode(charCodes, pattern) {
  function __ (line 7404) | function __() { this.constructor = d; }
  function resolveGrammar (line 7412) | function resolveGrammar(topLevels, errMsgProvider) {
  function GastRefResolverVisitor (line 7420) | function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {
  function LooksAhead (line 7470) | function LooksAhead() {
  function TreeBuilder (line 7584) | function TreeBuilder() {
  function defaultVisit (line 7874) | function defaultVisit(ctx, param) {
  function createBaseSemanticVisitorConstructor (line 7898) | function createBaseSemanticVisitorConstructor(grammarName, ruleNames) {
  function createBaseVisitorConstructorWithDefaults (line 7938) | function createBaseVisitorConstructorWithDefaults(grammarName, ruleNames...
  function validateVisitor (line 7958) | function validateVisitor(visitorInstance, ruleNames) {
  function validateMissingCstMethods (line 7964) | function validateMissingCstMethods(visitorInstance, ruleNames) {
  function validateRedundantMethods (line 7978) | function validateRedundantMethods(visitorInstance, ruleNames) {
  function LexerAdapter (line 8015) | function LexerAdapter() {
  function RecognizerApi (line 8103) | function RecognizerApi() {
  function RecognizerEngine (line 8452) | function RecognizerEngine() {
  function invokeRuleWithTry (line 8544) | function invokeRuleWithTry(args) {
  function ErrorHandler (line 9096) | function ErrorHandler() {
  function ContentAssist (line 9180) | function ContentAssist() {
  function GastRecorder (line 9242) | function GastRecorder() {
  function recordProd (line 9449) | function recordProd(prodConstructor, mainProdArg, occurrence, handleSep) {
  function recordOrProd (line 9472) | function recordOrProd(mainProdArg, occurrence) {
  function getIdxSuffix (line 9512) | function getIdxSuffix(idx) {
  function assertMethodIdxIsValid (line 9515) | function assertMethodIdxIsValid(idx) {
  function PerformanceTracer (line 9541) | function PerformanceTracer() {
  function createSyntaxDiagramsCode (line 9595) | function createSyntaxDiagramsCode(grammar, _a) {
  function generateParserFactory (line 9616) | function generateParserFactory(options) {
  function generateParserModule (line 9629) | function generateParserModule(options) {
  function genUmdModule (line 9651) | function genUmdModule(options) {
  function genWrapperFunction (line 9655) | function genWrapperFunction(options) {
  function genClass (line 9659) | function genClass(options) {
  function genAllRules (line 9665) | function genAllRules(rules) {
  function genRule (line 9672) | function genRule(prod, n) {
  function genTerminal (line 9679) | function genTerminal(prod, n) {
  function genNonTerminal (line 9685) | function genNonTerminal(prod, n) {
  function genAlternation (line 9689) | function genAlternation(prod, n) {
  function genSingleAlt (line 9697) | function genSingleAlt(prod, n) {
  function genProd (line 9709) | function genProd(prod, n) {
  function genDSLRule (line 9742) | function genDSLRule(dslName, prod, n) {
  function genDefFunction (line 9764) | function genDefFunction(definition, n) {
  function genDefinition (line 9770) | function genDefinition(def, n) {
  function indent (line 9777) | function indent(howMuch, text) {

FILE: vipercard/vipercard/external/chevrotain-6.5.0/chevrotaintyping.d.ts
  class Parser (line 913) | class Parser extends BaseParser {
  class CstParser (line 1039) | class CstParser extends BaseParser {
  class EmbeddedActionsParser (line 1189) | class EmbeddedActionsParser extends BaseParser {
  type ParserDefinitionErrorType (line 1334) | enum ParserDefinitionErrorType {
  type ILexerDefinitionError (line 1352) | interface ILexerDefinitionError {
  class Lexer (line 1358) | class Lexer {
  type ILexingResult (line 1422) | interface ILexingResult {
  type ILexingError (line 1430) | interface ILexingError {
  type ILexerConfig (line 1438) | interface ILexerConfig {
  type ILexerErrorMessageProvider (line 1548) | interface ILexerErrorMessageProvider {
  type ILineTerminatorsTester (line 1596) | interface ILineTerminatorsTester {
  type TokenPattern (line 1610) | type TokenPattern =
  type ITokenConfig (line 1616) | interface ITokenConfig {
  type CustomPatternMatcherFunc (line 1744) | type CustomPatternMatcherFunc = (
  type CustomPatternMatcherReturn (line 1765) | type CustomPatternMatcherReturn = [string] & { payload?: any }
  type TokenType (line 1767) | interface TokenType {
  type ICustomPattern (line 1789) | interface ICustomPattern {
  type IToken (line 1803) | interface IToken {
  type MultiModesDefinition (line 1889) | type MultiModesDefinition = {
  type IMultiModeLexerDefinition (line 1893) | interface IMultiModeLexerDefinition {
  type TokenTypeDictionary (line 1898) | type TokenTypeDictionary = { [tokenName: string]: TokenType }
  type TokenVocabulary (line 1900) | type TokenVocabulary =
  type IRuleConfig (line 1905) | interface IRuleConfig<T> {
  type DSLMethodOpts (line 1917) | interface DSLMethodOpts<T> {
  type DSLMethodOptsWithErr (line 1946) | interface DSLMethodOptsWithErr<T> extends DSLMethodOpts<T> {
  type OrMethodOpts (line 1956) | interface OrMethodOpts {
  type ManySepMethodOpts (line 1996) | interface ManySepMethodOpts<T> {
  type AtLeastOneSepMethodOpts (line 2013) | interface AtLeastOneSepMethodOpts<T> extends ManySepMethodOpts<T> {
  type ConsumeMethodOpts (line 2023) | interface ConsumeMethodOpts {
  type SubruleMethodOpts (line 2035) | interface SubruleMethodOpts {
  type GrammarAction (line 2047) | type GrammarAction<OUT> = () => OUT
  type IAnyOrAlt (line 2053) | type IAnyOrAlt = any
  type IOrAlt (line 2055) | interface IOrAlt {
  type IOrAltWithGate (line 2069) | interface IOrAltWithGate extends IOrAlt {
  type ICstVisitor (line 2073) | interface ICstVisitor<IN, OUT> {
  type CstNode (line 2087) | interface CstNode {
  type CstNodeLocation (line 2110) | interface CstNodeLocation {
  type CstChildrenDictionary (line 2119) | type CstChildrenDictionary = {
  type CstElement (line 2123) | type CstElement = IToken | CstNode
  type nodeLocationTrackingOptions (line 2125) | type nodeLocationTrackingOptions = "full" | "onlyOffset" | "none"
  type IParserConfig (line 2127) | interface IParserConfig {
  type IgnoredParserIssues (line 2226) | type IgnoredParserIssues = {
  type IgnoredRuleIssues (line 2233) | type IgnoredRuleIssues = {
  type IParserErrorMessageProvider (line 2237) | interface IParserErrorMessageProvider {
  type IRecognizerContext (line 2318) | interface IRecognizerContext {
  type ISeparatedIterationResult (line 2331) | type ISeparatedIterationResult<OUT> = {
  type ISerializedGast (line 2336) | interface ISerializedGast {
  type IGrammarPath (line 2355) | interface IGrammarPath {
  type ISyntacticContentAssistPath (line 2367) | interface ISyntacticContentAssistPath extends IGrammarPath {
  type ITokenGrammarPath (line 2372) | interface ITokenGrammarPath extends IGrammarPath {
  type LexerDefinitionErrorType (line 2377) | enum LexerDefinitionErrorType {
  type IRecognitionException (line 2457) | interface IRecognitionException {
  class MismatchedTokenException (line 2484) | class MismatchedTokenException extends Error {
  class NoViableAltException (line 2492) | class NoViableAltException extends Error {
  class NotAllInputParsedException (line 2500) | class NotAllInputParsedException extends Error {
  class EarlyExitException (line 2508) | class EarlyExitException extends Error {
  type IOptionallyNamedProduction (line 2512) | interface IOptionallyNamedProduction {
  type IProduction (line 2515) | interface IProduction {
  type IProductionWithOccurrence (line 2519) | interface IProductionWithOccurrence extends IProduction {
  class Rule (line 2559) | class Rule {
  class NonTerminal (line 2576) | class NonTerminal implements IProductionWithOccurrence {
  class Flat (line 2594) | class Flat implements IOptionallyNamedProduction {
  class Option (line 2606) | class Option
  class RepetitionMandatory (line 2624) | class RepetitionMandatory
  class RepetitionMandatoryWithSeparator (line 2642) | class RepetitionMandatoryWithSeparator
  class Repetition (line 2662) | class Repetition
  class RepetitionWithSeparator (line 2681) | class RepetitionWithSeparator
  class Alternation (line 2701) | class Alternation
  class Terminal (line 2719) | class Terminal implements IProductionWithOccurrence {
  type IGASTVisitor (line 2726) | interface IGASTVisitor {
  type IGrammarValidatorErrorMessageProvider (line 2812) | interface IGrammarValidatorErrorMessageProvider {
  type IGrammarResolverErrorMessageProvider (line 2875) | interface IGrammarResolverErrorMessageProvider {
  type IParserDefinitionError (line 2887) | interface IParserDefinitionError {
  type ICreateSyntaxDiagramsConfig (line 2903) | interface ICreateSyntaxDiagramsConfig {

FILE: vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/clipboard.js
  function __webpack_require__ (line 22) | function __webpack_require__(moduleId) {
  function select (line 107) | function select(element) {
  function E (line 156) | function E () {
  function listener (line 175) | function listener () {
  function listen (line 241) | function listen(target, type, callback) {
  function listenNode (line 277) | function listenNode(node, type, callback) {
  function listenNodeList (line 296) | function listenNodeList(nodeList, type, callback) {
  function listenSelector (line 319) | function listenSelector(selector, type, callback) {
  function _delegate (line 397) | function _delegate(element, selector, type, callback, useCapture) {
  function delegate (line 419) | function delegate(elements, selector, type, callback, useCapture) {
  function listener (line 452) | function listener(element, selector, type, callback) {
  function closest (line 491) | function closest (element, selector) {
  function defineProperties (line 518) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 520) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function ClipboardAction (line 533) | function ClipboardAction(options) {
  function defineProperties (line 784) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function clipboard_classCallCheck (line 786) | function clipboard_classCallCheck(instance, Constructor) { if (!(instanc...
  function _possibleConstructorReturn (line 788) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
  function _inherits (line 790) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function Clipboard (line 808) | function Clipboard(trigger, options) {
  function getAttributeValue (line 959) | function getAttributeValue(suffix, element) {

FILE: vipercard/vipercard/external/easyfilter-notbundled/bresenham.js
  function assert (line 9) | function assert(a) {
  function plotLine (line 14) | function plotLine(x0, y0, x1, y1)
  function plotEllipse (line 29) | function plotEllipse(xm, ym, a, b)
  function plotCircle (line 51) | function plotCircle(xm, ym, r)
  function plotEllipseRect (line 65) | function plotEllipseRect(x0, y0, x1, y1)
  function plotQuadBezierSeg (line 94) | function plotQuadBezierSeg(x0, y0, x1, y1, x2, y2)
  function plotQuadBezier (line 126) | function plotQuadBezier(x0, y0, x1, y1, x2, y2)
  function plotQuadRationalBezierSeg (line 157) | function plotQuadRationalBezierSeg(x0, y0, x1, y1, x2, y2, w)
  function plotQuadRationalBezier (line 203) | function plotQuadRationalBezier(x0, y0, x1, y1, x2, y2, w)
  function plotRotatedEllipse (line 253) | function plotRotatedEllipse(x, y, a, b, angle)
  function plotRotatedEllipseRect (line 262) | function plotRotatedEllipseRect(x0, y0, x1, y1, zd)
  function plotCubicBezierSeg (line 275) | function plotCubicBezierSeg(x0, y0, x1, y1, x2, y2, x3, y3)
  function plotCubicBezier (line 335) | function plotCubicBezier(x0, y0, x1, y1, x2, y2, x3, y3)
  function plotLineAA (line 381) | function plotLineAA(x0, y0, x1, y1)
  function plotCircleAA (line 404) | function plotCircleAA(xm, ym, r)
  function plotEllipseRectAA (line 440) | function plotEllipseRectAA(x0, y0, x1, y1)
  function plotQuadBezierSegAA (line 487) | function plotQuadBezierSegAA(x0, y0, x1, y1, x2, y2)
  function plotQuadBezierAA (line 529) | function plotQuadBezierAA(x0, y0, x1, y1, x2, y2)
  function plotQuadRationalBezierSegAA (line 560) | function plotQuadRationalBezierSegAA(x0, y0, x1, y1, x2, y2, w)
  function plotQuadRationalBezierAA (line 614) | function plotQuadRationalBezierAA(x0, y0, x1, y1, x2, y2, w)
  function plotRotatedEllipseAA (line 664) | function plotRotatedEllipseAA(x, y, a, b, angle)
  function plotRotatedEllipseRectAA (line 673) | function plotRotatedEllipseRectAA(x0, y0, x1, y1, zd)
  function plotCubicBezierSegAA (line 685) | function plotCubicBezierSegAA(x0, y0, x1, y1, x2, y2, x3, y3)
  function plotCubicBezierAA (line 767) | function plotCubicBezierAA(x0, y0, x1, y1, x2, y2, x3, y3)
  function plotLineWidth (line 813) | function plotLineWidth(x0, y0, x1, y1, th)
  function plotEllipseRectWidth (line 849) | function plotEllipseRectWidth(x0, y0, x1, y1, th)
  function plotQuadRationalBezierWidthSeg (line 909) | function plotQuadRationalBezierWidthSeg(x0, y0, x1, y1, x2, y2, w, th)
  function plotQuadRationalBezierWidth (line 1001) | function plotQuadRationalBezierWidth(x0, y0, x1, y1, x2, y2, w, th)
  function plotRotatedEllipseWidth (line 1051) | function plotRotatedEllipseWidth(x, y, a, b, angle, th)
  function plotRotatedEllipseRectWidth (line 1060) | function plotRotatedEllipseRectWidth(x0, y0, x1, y1, zd, th)
  function plotCubicBezierWidth (line 1072) | function plotCubicBezierWidth(x0, y0, x1, y1, x2, y2, x3, y3, th)
  function plotCubicBezierSegWidth (line 1125) | function plotCubicBezierSegWidth(x0,y0, x1,y1, x2,y2, x3,y3, th)

FILE: vipercard/vipercard/external/externaldelaybundlebig.js
  function __webpack_require__ (line 24) | function __webpack_require__(moduleId) {
  function isEmpty (line 121) | function isEmpty(arr) {
  function keys (line 125) | function keys(obj) {
  function values (line 132) | function values(obj) {
  function mapValues (line 141) | function mapValues(obj, callback) {
  function map (line 151) | function map(arr, callback) {
  function flatten (line 159) | function flatten(arr) {
  function first (line 173) | function first(arr) {
  function last (line 177) | function last(arr) {
  function forEach (line 182) | function forEach(collection, iteratorCallback) {
  function isString (line 202) | function isString(item) {
  function isUndefined (line 206) | function isUndefined(item) {
  function isFunction (line 210) | function isFunction(item) {
  function drop (line 214) | function drop(arr, howMuch) {
  function dropRight (line 219) | function dropRight(arr, howMuch) {
  function filter (line 224) | function filter(arr, predicate) {
  function reject (line 237) | function reject(arr, predicate) {
  function pick (line 241) | function pick(obj, predicate) {
  function has (line 254) | function has(obj, prop) {
  function contains (line 261) | function contains(arr, item) {
  function cloneArr (line 268) | function cloneArr(arr) {
  function cloneObj (line 279) | function cloneObj(obj) {
  function find (line 290) | function find(arr, predicate) {
  function findAll (line 300) | function findAll(arr, predicate) {
  function reduce (line 311) | function reduce(arrOrObj, iterator, initial) {
  function compact (line 322) | function compact(arr) {
  function uniq (line 326) | function uniq(arr, identity) {
  function partial (line 341) | function partial(func) {
  function isArray (line 351) | function isArray(obj) {
  function isRegExp (line 355) | function isRegExp(obj) {
  function isObject (line 359) | function isObject(obj) {
  function every (line 363) | function every(arr, predicate) {
  function difference (line 372) | function difference(arr, values) {
  function some (line 376) | function some(arr, predicate) {
  function indexOf (line 385) | function indexOf(arr, value) {
  function sortBy (line 394) | function sortBy(arr, orderFunc) {
  function zipObject (line 400) | function zipObject(keys, values) {
  function assign (line 414) | function assign(target) {
  function assignNoOverwrite (line 433) | function assignNoOverwrite(target) {
  function defaults (line 454) | function defaults() {
  function groupBy (line 462) | function groupBy(arr, groupKeyFunc) {
  function merge (line 481) | function merge(obj1, obj2) {
  function NOOP (line 492) | function NOOP() { }
  function IDENTITY (line 494) | function IDENTITY(item) {
  function packArray (line 501) | function packArray(holeyArr) {
  function PRINT_ERROR (line 510) | function PRINT_ERROR(msg) {
  function PRINT_WARNING (line 517) | function PRINT_WARNING(msg) {
  function isES2015MapSupported (line 525) | function isES2015MapSupported() {
  function applyMixins (line 529) | function applyMixins(derivedCtor, baseCtors) {
  function toFastProperties (line 550) | function toFastProperties(toBecomeFast) {
  function peek (line 569) | function peek(arr) {
  function timer (line 574) | function timer(func) {
  function __ (line 599) | function __() { this.constructor = d; }
  function AbstractProduction (line 607) | function AbstractProduction(definition) {
  function NonTerminal (line 621) | function NonTerminal(options) {
  function Rule (line 649) | function Rule(options) {
  function Flat (line 663) | function Flat(options) {
  function Option (line 674) | function Option(options) {
  function RepetitionMandatory (line 685) | function RepetitionMandatory(options) {
  function RepetitionMandatoryWithSeparator (line 696) | function RepetitionMandatoryWithSeparator(options) {
  function Repetition (line 707) | function Repetition(options) {
  function RepetitionWithSeparator (line 718) | function RepetitionWithSeparator(options) {
  function Alternation (line 729) | function Alternation(options) {
  function Terminal (line 741) | function Terminal(options) {
  function serializeGrammar (line 751) | function serializeGrammar(topRules) {
  function serializeProduction (line 755) | function serializeProduction(node) {
  function __ (line 867) | function __() { this.constructor = d; }
  function EMPTY_ALT (line 923) | function EMPTY_ALT(value) {
  function Parser (line 931) | function Parser(tokenVocabulary, config) {
  function CstParser (line 1067) | function CstParser(tokenVocabulary, config) {
  function EmbeddedActionsParser (line 1080) | function EmbeddedActionsParser(tokenVocabulary, config) {
  function tokenLabel (line 1103) | function tokenLabel(tokType) {
  function tokenName (line 1112) | function tokenName(tokType) {
  function hasTokenLabel (line 1116) | function hasTokenLabel(obj) {
  function createToken (line 1129) | function createToken(config) {
  function createTokenInternal (line 1133) | function createTokenInternal(config) {
  function createTokenInstance (line 1174) | function createTokenInstance(tokType, image, startOffset, endOffset, sta...
  function tokenMatcher (line 1188) | function tokenMatcher(token, tokType) {
  function GAstVisitor (line 1203) | function GAstVisitor() {
  function tokenStructuredMatcher (line 1256) | function tokenStructuredMatcher(tokInstance, tokConstructor) {
  function tokenStructuredMatcherNoCategories (line 1269) | function tokenStructuredMatcherNoCategories(token, tokType) {
  function augmentTokenTypes (line 1275) | function augmentTokenTypes(tokenTypes) {
  function expandCategories (line 1288) | function expandCategories(tokenTypes) {
  function assignTokenDefaultProps (line 1306) | function assignTokenDefaultProps(tokenTypes) {
  function assignCategoriesTokensProp (line 1332) | function assignCategoriesTokensProp(tokenTypes) {
  function assignCategoriesMapProp (line 1342) | function assignCategoriesMapProp(tokenTypes) {
  function singleAssignCategoriesToksMap (line 1348) | function singleAssignCategoriesToksMap(path, nextNode) {
  function hasShortKeyProperty (line 1361) | function hasShortKeyProperty(tokType) {
  function hasCategoriesProperty (line 1365) | function hasCategoriesProperty(tokType) {
  function hasExtendingTokensTypesProperty (line 1369) | function hasExtendingTokensTypesProperty(tokType) {
  function hasExtendingTokensTypesMapProperty (line 1373) | function hasExtendingTokensTypesMapProperty(tokType) {
  function isTokenType (line 1377) | function isTokenType(tokType) {
  function __ (line 1398) | function __() { this.constructor = d; }
  function isSequenceProd (line 1406) | function isSequenceProd(prod) {
  function isOptionalProd (line 1417) | function isOptionalProd(prod, alreadyVisited) {
  function isBranchingProd (line 1451) | function isBranchingProd(prod) {
  function getProductionDslName (line 1455) | function getProductionDslName(prod) {
  function DslMethodsCollectorVisitor (line 1488) | function DslMethodsCollectorVisitor() {
  function collectMethods (line 1548) | function collectMethods(rule) {
  function getKeyForAutomaticLookahead (line 1589) | function getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {
  function getKeyForAltIndex (line 1596) | function getKeyForAltIndex(ruleIdx, dslMethodIdx, occurrence, altIdx) {
  function isRecognitionException (line 1627) | function isRecognitionException(error) {
  function MismatchedTokenException (line 1632) | function MismatchedTokenException(message, token, previousToken) {
  function NoViableAltException (line 1643) | function NoViableAltException(message, token, previousToken) {
  function NotAllInputParsedException (line 1652) | function NotAllInputParsedException(message, token) {
  function EarlyExitException (line 1660) | function EarlyExitException(message, token, previousToken) {
  function Lexer (line 1716) | function Lexer(lexerDefinition, config) {
  function getPossiblePatternsSlow (line 1954) | function getPossiblePatternsSlow() {
  function getPossiblePatternsOptimized (line 1957) | function getPossiblePatternsOptimized(charCode) {
  function push_mode (line 2005) | function push_mode(newMode) {
  function getExtraProductionArgument (line 2434) | function getExtraProductionArgument(prod) {
  function __ (line 2577) | function __() { this.constructor = d; }
  function validateGrammar (line 2591) | function validateGrammar(topLevels, globalMaxLookahead, tokenTypes, igno...
  function validateNestedRulesNames (line 2630) | function validateNestedRulesNames(topLevels, errMsgProvider) {
  function validateDuplicateProductions (line 2642) | function validateDuplicateProductions(topLevelRule, errMsgProvider) {
  function identifyProductionForDuplicates (line 2669) | function identifyProductionForDuplicates(prod) {
  function getExtraProductionArgument (line 2673) | function getExtraProductionArgument(prod) {
  function OccurrenceValidationCollector (line 2686) | function OccurrenceValidationCollector() {
  function validateRuleName (line 2721) | function validateRuleName(rule, errMsgProvider) {
  function validateNestedRuleName (line 2738) | function validateNestedRuleName(topLevel, nestedProd, errMsgProvider) {
  function validateTokenName (line 2753) | function validateTokenName(tokenType, errMsgProvider) {
  function validateRuleDoesNotAlreadyExist (line 2768) | function validateRuleDoesNotAlreadyExist(rule, allRules, className, errM...
  function validateRuleIsOverridden (line 2793) | function validateRuleIsOverridden(ruleName, definedRulesNames, className) {
  function validateNoLeftRecursion (line 2809) | function validateNoLeftRecursion(topRule, currRule, errMsgProvider, path) {
  function getFirstNoneTerminal (line 2841) | function getFirstNoneTerminal(definition) {
  function OrCollector (line 2884) | function OrCollector() {
  function validateEmptyOrAlternative (line 2894) | function validateEmptyOrAlternative(topLevelRule, errMsgProvider) {
  function validateAmbiguousAlternationAlternatives (line 2924) | function validateAmbiguousAlternationAlternatives(topLevelRule, globalMa...
  function RepetionCollector (line 2953) | function RepetionCollector() {
  function validateTooManyAlts (line 2973) | function validateTooManyAlts(topLevelRule, errMsgProvider) {
  function validateSomeNonEmptyLookaheadPath (line 2994) | function validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, ...
  function checkAlternativesAmbiguities (line 3022) | function checkAlternativesAmbiguities(alternatives, alternation, rule, e...
  function checkPrefixAlternativesAmbiguities (line 3069) | function checkPrefixAlternativesAmbiguities(alternatives, alternation, r...
  function checkTerminalAndNoneTerminalsNameSpace (line 3119) | function checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, e...
  function validateDuplicateNestedRules (line 3135) | function validateDuplicateNestedRules(topLevelRules, errMsgProvider) {
  function __ (line 3173) | function __() { this.constructor = d; }
  function getProdType (line 3193) | function getProdType(prod) {
  function buildLookaheadFuncForOr (line 3218) | function buildLookaheadFuncForOr(occurrence, ruleGrammar, maxLookahead, ...
  function buildLookaheadFuncForOptionalProd (line 3238) | function buildLookaheadFuncForOptionalProd(occurrence, ruleGrammar, k, d...
  function buildAlternativesLookAheadFunc (line 3246) | function buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatche...
  function buildSingleAlternativeLookaheadFunction (line 3355) | function buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dyna...
  function RestDefinitionFinderWalker (line 3410) | function RestDefinitionFinderWalker(topProd, targetOccurrence, targetPro...
  function InsideDefinitionFinderVisitor (line 3462) | function InsideDefinitionFinderVisitor(targetOccurrence, targetProdType,...
  function initializeArrayOfArrays (line 3497) | function initializeArrayOfArrays(size) {
  function pathToHashKeys (line 3509) | function pathToHashKeys(path) {
  function isUniquePrefixHash (line 3529) | function isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {
  function lookAheadSequenceFromAlternatives (line 3546) | function lookAheadSequenceFromAlternatives(altsDefs, k) {
  function getLookaheadPathsForOr (line 3609) | function getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {
  function getLookaheadPathsForOptionalProd (line 3615) | function getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodT...
  function containsPath (line 3626) | function containsPath(alternative, searchPath) {
  function isStrictPrefixOfPath (line 3647) | function isStrictPrefixOfPath(prefix, other) {
  function areTokenCategoriesNotUsed (line 3656) | function areTokenCategoriesNotUsed(lookAheadPaths) {
  function __ (line 3681) | function __() { this.constructor = d; }
  function AbstractNextPossibleTokensWalker (line 3692) | function AbstractNextPossibleTokensWalker(topProd, path) {
  function NextAfterTokenWalker (line 3753) | function NextAfterTokenWalker(topProd, path) {
  function AbstractNextTerminalAfterProductionWalker (line 3782) | function AbstractNextTerminalAfterProductionWalker(topRule, occurrence) {
  function NextTerminalAfterManyWalker (line 3802) | function NextTerminalAfterManyWalker() {
  function NextTerminalAfterManySepWalker (line 3823) | function NextTerminalAfterManySepWalker() {
  function NextTerminalAfterAtLeastOneWalker (line 3844) | function NextTerminalAfterAtLeastOneWalker() {
  function NextTerminalAfterAtLeastOneSepWalker (line 3866) | function NextTerminalAfterAtLeastOneSepWalker() {
  function possiblePathsFrom (line 3887) | function possiblePathsFrom(targetDef, maxLength, currPath) {
  function nextPossibleTokensAfter (line 3979) | function nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, ma...
  function expandTopLevelRule (line 4205) | function expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurre...
  function RestWalker (line 4233) | function RestWalker() {
  function restForRepetitionWithSeparator (line 4325) | function restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {
  function RegExpParser (line 4360) | function RegExpParser() {}
  function cc (line 5124) | function cc(char) {
  function insertToSet (line 5128) | function insertToSet(item, set) {
  function addFlag (line 5138) | function addFlag(flagObj, flagKey) {
  function ASSERT_EXISTS (line 5146) | function ASSERT_EXISTS(obj) {
  function ASSERT_NEVER_REACH_HERE (line 5154) | function ASSERT_NEVER_REACH_HERE() {
  function BaseRegExpVisitor (line 5203) | function BaseRegExpVisitor() {}
  function getRegExpAst (line 5324) | function getRegExpAst(regExp) {
  function clearRegExpParserCache (line 5336) | function clearRegExpParserCache() {
  function __ (line 5357) | function __() { this.constructor = d; }
  function setNodeLocationOnlyOffset (line 5373) | function setNodeLocationOnlyOffset(currNodeLocation, newLocationInfo) {
  function setNodeLocationFull (line 5398) | function setNodeLocationFull(currNodeLocation, newLocationInfo) {
  function addTerminalToCst (line 5422) | function addTerminalToCst(node, token, tokenTypeName) {
  function addNoneTerminalToCst (line 5431) | function addNoneTerminalToCst(node, ruleName, ruleResult) {
  function NamedDSLMethodsCollectorVisitor (line 5442) | function NamedDSLMethodsCollectorVisitor(ruleIdx) {
  function expandAllNestedRuleNames (line 5523) | function expandAllNestedRuleNames(topRules, fullToShortName) {
  function clearCache (line 5605) | function clearCache() {
  function __ (line 5646) | function __() { this.constructor = d; }
  function disableSticky (line 5660) | function disableSticky() {
  function enableSticky (line 5664) | function enableSticky() {
  function analyzeTokenTypes (line 5668) | function analyzeTokenTypes(tokenTypes, options) {
  function validatePatterns (line 5919) | function validatePatterns(tokenTypes, validModesNames) {
  function validateRegExpPattern (line 5933) | function validateRegExpPattern(tokenTypes) {
  function findMissingPatterns (line 5945) | function findMissingPatterns(tokenTypes) {
  function findInvalidPatterns (line 5962) | function findInvalidPatterns(tokenTypes) {
  function findEndOfInputAnchor (line 5985) | function findEndOfInputAnchor(tokenTypes) {
  function findEmptyMatchRegExps (line 6027) | function findEmptyMatchRegExps(tokenTypes) {
  function findStartOfInputAnchor (line 6045) | function findStartOfInputAnchor(tokenTypes) {
  function findUnsupportedFlags (line 6087) | function findUnsupportedFlags(tokenTypes) {
  function findDuplicatePatterns (line 6105) | function findDuplicatePatterns(tokenTypes) {
  function findInvalidGroupType (line 6140) | function findInvalidGroupType(tokenTypes) {
  function findModesThatDoNotExist (line 6160) | function findModesThatDoNotExist(tokenTypes, validModes) {
  function findUnreachablePatterns (line 6177) | function findUnreachablePatterns(tokenTypes) {
  function testTokenType (line 6213) | function testTokenType(str, pattern) {
  function noMetaChar (line 6234) | function noMetaChar(regExp) {
  function addStartOfInput (line 6254) | function addStartOfInput(pattern) {
  function addStickyFlag (line 6261) | function addStickyFlag(pattern) {
  function performRuntimeChecks (line 6268) | function performRuntimeChecks(lexerDefinition, trackLines, lineTerminato...
  function performWarningRuntimeChecks (line 6312) | function performWarningRuntimeChecks(lexerDefinition, trackLines, lineTe...
  function cloneEmptyGroups (line 6358) | function cloneEmptyGroups(emptyGroups) {
  function isCustomPattern (line 6375) | function isCustomPattern(tokenType) {
  function isShortPattern (line 6397) | function isShortPattern(pattern) {
  function checkLineBreaksIssues (line 6433) | function checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {
  function buildLineBreakIssueMessage (line 6467) | function buildLineBreakIssueMessage(tokType, details) {
  function getCharCodes (line 6485) | function getCharCodes(charsOrCodes) {
  function addToMapOfArrays (line 6496) | function addToMapOfArrays(map, key, value) {
  function charCodeToOptimizedIndex (line 6520) | function charCodeToOptimizedIndex(charCode) {
  function initCharCodeToOptimizedIndexMap (line 6535) | function initCharCodeToOptimizedIndexMap() {
  function first (line 6574) | function first(prod) {
  function firstForSequence (line 6601) | function firstForSequence(prod) {
  function firstForBranching (line 6620) | function firstForBranching(prod) {
  function firstForTerminal (line 6627) | function firstForTerminal(terminal) {
  function resolveGrammar (line 6656) | function resolveGrammar(options) {
  function validateGrammar (line 6667) | function validateGrammar(options) {
  function assignOccurrenceIndices (line 6675) | function assignOccurrenceIndices(options) {
  function InRuleRecoveryException (line 6703) | function InRuleRecoveryException(message) {
  function Recoverable (line 6713) | function Recoverable() {
  function attemptInRepetitionRecovery (line 6973) | function attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslM...
  function classNameFromInstance (line 7012) | function classNameFromInstance(instance) {
  function functionName (line 7019) | function functionName(func) {
  function defineNameProp (line 7034) | function defineNameProp(obj, nameValue) {
  function __ (line 7067) | function __() { this.constructor = d; }
  function ResyncFollowsWalker (line 7081) | function ResyncFollowsWalker(topProd) {
  function computeAllProdsFollows (line 7105) | function computeAllProdsFollows(topProductions) {
  function buildBetweenProdsFollowPrefix (line 7114) | function buildBetweenProdsFollowPrefix(inner, occurenceInParent) {
  function buildInProdFollowPrefix (line 7118) | function buildInProdFollowPrefix(terminal) {
  function __ (line 7140) | function __() { this.constructor = d; }
  function getOptimizedStartCodesIndices (line 7151) | function getOptimizedStartCodesIndices(regExp, ensureOptimizations) {
  function firstCharOptimizedIndices (line 7188) | function firstCharOptimizedIndices(ast, result, ignoreCase) {
  function addOptimizedIdxToResult (line 7288) | function addOptimizedIdxToResult(code, result, ignoreCase) {
  function handleIgnoreCase (line 7295) | function handleIgnoreCase(code, result) {
  function findCode (line 7311) | function findCode(setNode, targetCharCodes) {
  function isWholeOptional (line 7325) | function isWholeOptional(ast) {
  function CharCodeFinder (line 7338) | function CharCodeFinder(targetCharCodes) {
  function canMatchCharCode (line 7380) | function canMatchCharCode(charCodes, pattern) {
  function __ (line 7411) | function __() { this.constructor = d; }
  function resolveGrammar (line 7419) | function resolveGrammar(topLevels, errMsgProvider) {
  function GastRefResolverVisitor (line 7427) | function GastRefResolverVisitor(nameToTopRule, errMsgProvider) {
  function LooksAhead (line 7477) | function LooksAhead() {
  function TreeBuilder (line 7591) | function TreeBuilder() {
  function defaultVisit (line 7881) | function defaultVisit(ctx, param) {
  function createBaseSemanticVisitorConstructor (line 7905) | function createBaseSemanticVisitorConstructor(grammarName, ruleNames) {
  function createBaseVisitorConstructorWithDefaults (line 7945) | function createBaseVisitorConstructorWithDefaults(grammarName, ruleNames...
  function validateVisitor (line 7965) | function validateVisitor(visitorInstance, ruleNames) {
  function validateMissingCstMethods (line 7971) | function validateMissingCstMethods(visitorInstance, ruleNames) {
  function validateRedundantMethods (line 7985) | function validateRedundantMethods(visitorInstance, ruleNames) {
  function LexerAdapter (line 8022) | function LexerAdapter() {
  function RecognizerApi (line 8110) | function RecognizerApi() {
  function RecognizerEngine (line 8459) | function RecognizerEngine() {
  function invokeRuleWithTry (line 8551) | function invokeRuleWithTry(args) {
  function ErrorHandler (line 9103) | function ErrorHandler() {
  function ContentAssist (line 9187) | function ContentAssist() {
  function GastRecorder (line 9249) | function GastRecorder() {
  function recordProd (line 9456) | function recordProd(prodConstructor, mainProdArg, occurrence, handleSep) {
  function recordOrProd (line 9479) | function recordOrProd(mainProdArg, occurrence) {
  function getIdxSuffix (line 9519) | function getIdxSuffix(idx) {
  function assertMethodIdxIsValid (line 9522) | function assertMethodIdxIsValid(idx) {
  function PerformanceTracer (line 9548) | function PerformanceTracer() {
  function createSyntaxDiagramsCode (line 9602) | function createSyntaxDiagramsCode(grammar, _a) {
  function generateParserFactory (line 9623) | function generateParserFactory(options) {
  function generateParserModule (line 9636) | function generateParserModule(options) {
  function genUmdModule (line 9658) | function genUmdModule(options) {
  function genWrapperFunction (line 9662) | function genWrapperFunction(options) {
  function genClass (line 9666) | function genClass(options) {
  function genAllRules (line 9672) | function genAllRules(rules) {
  function genRule (line 9679) | function genRule(prod, n) {
  function genTerminal (line 9686) | function genTerminal(prod, n) {
  function genNonTerminal (line 9692) | function genNonTerminal(prod, n) {
  function genAlternation (line 9696) | function genAlternation(prod, n) {
  function genSingleAlt (line 9704) | function genSingleAlt(prod, n) {
  function genProd (line 9716) | function genProd(prod, n) {
  function genDSLRule (line 9749) | function genDSLRule(dslName, prod, n) {
  function genDefFunction (line 9771) | function genDefFunction(definition, n) {
  function genDefinition (line 9777) | function genDefinition(def, n) {
  function indent (line 9784) | function indent(howMuch, text) {
  function bom (line 9823) | function bom(blob, opts) {
  function download (line 9843) | function download(url, name, opts) {
  function corsEnabled (line 9859) | function corsEnabled(url) {
  function click (line 9872) | function click(node) {
  function LRUMap (line 10011) | function LRUMap(limit, entries) {
  function Entry (line 10033) | function Entry(key, value) {
  function getBaseValue (line 10186) | function getBaseValue(alphabet, character) {

FILE: vipercard/vipercard/external/externaldelaybundlemin.js
  function n (line 9) | function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{...
  function r (line 9) | function r(t){return t&&0===t.length}
  function i (line 9) | function i(t){return null==t?[]:Object.keys(t)}
  function o (line 9) | function o(t){for(var e=[],n=Object.keys(t),r=0;r<n.length;r++)e.push(t[...
  function a (line 9) | function a(t,e){for(var n=[],r=i(t),o=0;o<r.length;o++){var a=r[o];n.pus...
  function s (line 9) | function s(t,e){for(var n=[],r=0;r<t.length;r++)n.push(e.call(null,t[r],...
  function c (line 9) | function c(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];Array.isArray(...
  function u (line 9) | function u(t){return r(t)?void 0:t[0]}
  function l (line 9) | function l(t){var e=t&&t.length;return e?t[e-1]:void 0}
  function p (line 9) | function p(t,e){if(Array.isArray(t))for(var n=0;n<t.length;n++)e.call(nu...
  function h (line 9) | function h(t){return"string"==typeof t}
  function f (line 9) | function f(t){return void 0===t}
  function d (line 9) | function d(t){return t instanceof Function}
  function m (line 9) | function m(t,e){return void 0===e&&(e=1),t.slice(e,t.length)}
  function E (line 9) | function E(t,e){return void 0===e&&(e=1),t.slice(0,t.length-e)}
  function T (line 9) | function T(t,e){var n=[];if(Array.isArray(t))for(var r=0;r<t.length;r++)...
  function y (line 9) | function y(t,e){return T(t,function(t){return!e(t)})}
  function v (line 9) | function v(t,e){for(var n=Object.keys(t),r={},i=0;i<n.length;i++){var o=...
  function R (line 9) | function R(t,e){return!!x(t)&&t.hasOwnProperty(e)}
  function A (line 9) | function A(t,e){return void 0!==N(t,function(t){return t===e})}
  function _ (line 9) | function _(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n]);return e}
  function g (line 9) | function g(t){var e={};for(var n in t)Object.prototype.hasOwnProperty.ca...
  function N (line 9) | function N(t,e){for(var n=0;n<t.length;n++){var r=t[n];if(e.call(null,r)...
  function I (line 9) | function I(t,e){for(var n=[],r=0;r<t.length;r++){var i=t[r];e.call(null,...
  function O (line 9) | function O(t,e,n){for(var r=Array.isArray(t),a=r?t:o(t),s=r?[]:i(t),c=n,...
  function S (line 9) | function S(t){return y(t,function(t){return null==t})}
  function L (line 9) | function L(t,e){void 0===e&&(e=function(t){return t});var n=[];return O(...
  function P (line 9) | function P(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n...
  function C (line 9) | function C(t){return Array.isArray(t)}
  function k (line 9) | function k(t){return t instanceof RegExp}
  function x (line 9) | function x(t){return t instanceof Object}
  function M (line 9) | function M(t,e){for(var n=0;n<t.length;n++)if(!e(t[n],n))return!1;return!0}
  function F (line 9) | function F(t,e){return y(t,function(t){return A(e,t)})}
  function b (line 9) | function b(t,e){for(var n=0;n<t.length;n++)if(e(t[n]))return!0;return!1}
  function D (line 9) | function D(t,e){for(var n=0;n<t.length;n++)if(t[n]===e)return n;return-1}
  function U (line 9) | function U(t,e){var n=_(t);return n.sort(function(t,n){return e(t)-e(n)}...
  function w (line 9) | function w(t,e){if(t.length!==e.length)throw Error("can't zipObject with...
  function G (line 9) | function G(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n...
  function K (line 9) | function K(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n...
  function B (line 9) | function B(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];r...
  function W (line 9) | function W(t,e){var n={};return p(t,function(t){var r=e(t),i=n[r];i?i.pu...
  function j (line 9) | function j(t,e){for(var n=g(t),r=i(e),o=0;o<r.length;o++){var a=r[o],s=e...
  function V (line 9) | function V(){}
  function Y (line 9) | function Y(t){return t}
  function X (line 9) | function X(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];e.push(void 0!...
  function z (line 9) | function z(t){console&&console.error&&console.error("Error: "+t)}
  function H (line 9) | function H(t){console&&console.warn&&console.warn("Warning: "+t)}
  function q (line 9) | function q(){return"function"==typeof Map}
  function $ (line 9) | function $(t,e){e.forEach(function(e){var n=e.prototype;Object.getOwnPro...
  function Z (line 9) | function Z(t){function e(){}e.prototype=t;var n=new e;function r(){retur...
  function Q (line 9) | function Q(t){return t[t.length-1]}
  function J (line 9) | function J(t){var e=(new Date).getTime(),n=t();return{time:(new Date).ge...
  function n (line 9) | function n(){this.constructor=t}
  function t (line 9) | function t(t){this.definition=t}
  function e (line 9) | function e(e){var n=t.call(this,[])||this;return n.idx=1,o.assign(n,o.pi...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.orgText="",...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.ignoreAmbig...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.ass...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.ass...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.ass...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.ass...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,o.ass...
  function e (line 9) | function e(e){var n=t.call(this,e.definition)||this;return n.idx=1,n.ign...
  function t (line 9) | function t(t){this.idx=1,o.assign(this,o.pick(t,function(t){return void ...
  function y (line 9) | function y(t){function e(t){return o.map(t,y)}if(t instanceof c)return{t...
  function n (line 9) | function n(){this.constructor=t}
  function t (line 9) | function t(t,n){void 0===n&&(n=e.DEFAULT_PARSER_CONFIG),this.ignoredIssu...
  function n (line 9) | function n(n,r){void 0===r&&(r=e.DEFAULT_PARSER_CONFIG);var i=o.cloneObj...
  function n (line 9) | function n(n,r){void 0===r&&(r=e.DEFAULT_PARSER_CONFIG);var i=o.cloneObj...
  function a (line 9) | function a(t){return r.isString(t.LABEL)&&""!==t.LABEL}
  function E (line 9) | function E(t){return function(t){var e=t.pattern,n={};n.name=t.name,r.is...
  function t (line 9) | function t(){}
  function i (line 9) | function i(t){for(var e=r.cloneArr(t),n=t,i=!0;i;){n=r.compact(r.flatten...
  function o (line 9) | function o(t){r.forEach(t,function(t){u(t)||(e.tokenIdxToClass[e.tokenSh...
  function a (line 9) | function a(t){r.forEach(t,function(t){t.categoryMatches=[],r.forEach(t.c...
  function s (line 9) | function s(t){r.forEach(t,function(t){c([],t)})}
  function c (line 9) | function c(t,e){r.forEach(t,function(t){e.categoryMatchesMap[t.tokenType...
  function u (line 9) | function u(t){return r.has(t,"tokenTypeIdx")}
  function l (line 9) | function l(t){return r.has(t,"CATEGORIES")}
  function p (line 9) | function p(t){return r.has(t,"categoryMatches")}
  function h (line 9) | function h(t){return r.has(t,"categoryMatchesMap")}
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.sepa...
  function r (line 9) | function r(t,e,n){return n|e|t}
  function u (line 9) | function u(t,e,n){this.name=i,this.message=t,this.token=e,this.previousT...
  function l (line 9) | function l(t,e,n){this.name=o,this.message=t,this.token=e,this.previousT...
  function p (line 9) | function p(t,e){this.name=s,this.message=t,this.token=e,this.resyncedTok...
  function h (line 9) | function h(t,e,n){this.name=a,this.message=t,this.token=e,this.previousT...
  function t (line 9) | function t(t,e){var n=this;if(void 0===e&&(e=c),this.lexerDefinition=t,t...
  function U (line 9) | function U(){return x}
  function w (line 9) | function w(t){var e=r.charCodeToOptimizedIndex(t),n=M[e];return void 0==...
  function B (line 9) | function B(t){F.push(t),M=this.charCodeToPatternIdxToConfig[t],x=this.pa...
  function n (line 9) | function n(){this.constructor=t}
  function d (line 9) | function d(t){return c.getProductionDslName(t)+"_#_"+t.idx+"_#_"+m(t)}
  function m (line 9) | function m(t){return t instanceof h.Terminal?t.terminalType.name:t insta...
  function e (line 9) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allP...
  function T (line 9) | function T(t,n){var r=[],i=t.name;return i.match(e.validTermsPattern)||r...
  function y (line 9) | function y(t,n,r){var i,o=[];return n.name.match(e.validNestedRuleName)|...
  function v (line 9) | function v(t,n){var r=[];return t.name.match(e.validTermsPattern)||r.pus...
  function R (line 9) | function R(t,e,n,r){var i=[];if(a.reduce(e,function(e,n){return n.name==...
  function A (line 9) | function A(t,e,n,r){void 0===r&&(r=[]);var i=[],a=_(e.definition);if(o.i...
  function _ (line 9) | function _(t){var e=[];if(o.isEmpty(t))return e;var n=o.first(t);if(n in...
  function e (line 9) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.alte...
  function N (line 9) | function N(t,e){var n=new g;t.accept(n);var r=n.alternations;return o.re...
  function I (line 9) | function I(t,e,n,r){var i=new g;t.accept(i);var l=i.alternations,p=n[t.n...
  function e (line 9) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.allP...
  function S (line 9) | function S(t,e){var n=new g;t.accept(n);var r=n.alternations;return o.re...
  function L (line 9) | function L(t,e,n){var r=[];return a.forEach(t,function(t){var i=new O;t....
  function P (line 9) | function P(t,e,n,r){var i=[],o=a.reduce(t,function(t,e,n){var r=a.map(e,...
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(e,n,r){var i=t.call(this)||this;return i.topProd=e,i.targetOc...
  function e (line 9) | function e(e,n,r){var i=t.call(this)||this;return i.targetOccurrence=e,i...
  function d (line 9) | function d(t){for(var e=new Array(t),n=0;n<t;n++)e[n]=[];return e}
  function m (line 9) | function m(t){for(var e=[""],n=0;n<t.length;n++){for(var r=t[n],i=[],o=0...
  function E (line 9) | function E(t,e,n){for(var r=0;r<t.length;r++)if(r!==n)for(var i=t[r],o=0...
  function T (line 9) | function T(t,e){for(var n=a.map(t,function(t){return s.possiblePathsFrom...
  function y (line 9) | function y(t,e,n,r){var i=new f(t,o.ALTERNATION,r);return e.accept(i),T(...
  function v (line 9) | function v(t,e,n,r){var i=new f(t,n);e.accept(i);var o=i.result,a=new h(...
  function R (line 9) | function R(t,e){t:for(var n=0;n<t.length;n++){var r=t[n];if(r.length===e...
  function A (line 9) | function A(t){return a.every(t,function(t){return a.every(t,function(t){...
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(e,n){var r=t.call(this)||this;return r.topProd=e,r.path=n,r.p...
  function e (line 9) | function e(e,n){var r=t.call(this,e,n)||this;return r.path=n,r.nextTermi...
  function e (line 9) | function e(e,n){var r=t.call(this)||this;return r.topRule=e,r.occurrence...
  function e (line 9) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 9) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 9) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 9) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function E (line 9) | function E(t,e,n,r){var i=a.cloneArr(n);i.push(t.name);var o=a.cloneArr(...
  function s (line 9) | function s(s){var c=t(s.concat(a.drop(e,o+1)),n,r);return i.concat(c)}
  function t (line 9) | function t(){}
  function a (line 9) | function a(t,e,n){return[new i.Option({definition:[new i.Terminal({termi...
  function t (line 9) | function t(){}
  function o (line 9) | function o(t){return t.charCodeAt(0)}
  function a (line 9) | function a(t,e){void 0!==t.length?t.forEach(function(t){e.push(t)}):e.pu...
  function s (line 9) | function s(t,e){if(!0===t[e])throw"duplicate flag "+e;t[e]=!0}
  function c (line 9) | function c(t){if(void 0===t)throw Error("Internal Error - Should never g...
  function h (line 9) | function h(){}
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(e){var n=t.call(this)||this;return n.result=[],n.ruleIdx=e,n}
  function n (line 9) | function n(){this.constructor=t}
  function p (line 9) | function p(t){var e=s.filter(t,function(t){return!s.has(t,l)});return{er...
  function h (line 9) | function h(t){var e=s.filter(t,function(t){var e=t[l];return!(s.isRegExp...
  function d (line 9) | function d(t){var e=function(t){function e(){var e=null!==t&&t.apply(thi...
  function m (line 9) | function m(t){var e=s.filter(t,function(t){return t[l].test("")});return...
  function T (line 9) | function T(t){var e=function(t){function e(){var e=null!==t&&t.apply(thi...
  function y (line 9) | function y(t){var e=s.filter(t,function(t){var e=t[l];return e instanceo...
  function v (line 9) | function v(t){var e=[],n=s.map(t,function(n){return s.reduce(t,function(...
  function R (line 9) | function R(t){var e=s.filter(t,function(t){if(!s.has(t,"GROUP"))return!1...
  function A (line 9) | function A(t,e){var n=s.filter(t,function(t){return void 0!==t.PUSH_MODE...
  function _ (line 9) | function _(t){var e=[],n=s.reduce(t,function(t,e,n){var r,i=e.PATTERN;re...
  function g (line 9) | function g(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:"+t.sourc...
  function N (line 9) | function N(t){var e=t.ignoreCase?"iy":"y";return new RegExp(""+t.source,e)}
  function I (line 9) | function I(t){var e=t.PATTERN;if(s.isRegExp(e))return!1;if(s.isFunction(...
  function O (line 9) | function O(t){return!(!s.isString(t)||1!==t.length)&&t.charCodeAt(0)}
  function S (line 9) | function S(t,e){if(s.has(t,"LINE_BREAKS"))return!1;if(s.isRegExp(t.PATTE...
  function L (line 9) | function L(t,e){if(e.issue===a.LexerDefinitionErrorType.IDENTIFY_TERMINA...
  function P (line 9) | function P(t){return s.map(t,function(t){return s.isString(t)&&t.length>...
  function C (line 9) | function C(t,e,n){void 0===t[e]?t[e]=[n]:t[e].push(n)}
  function k (line 9) | function k(t){return t<e.minOptimizationVal?t:x[t]}
  function a (line 9) | function a(t){if(t instanceof i.NonTerminal)return a(t.referencedRule);i...
  function s (line 9) | function s(t){for(var e,n=[],i=t.definition,s=0,c=i.length>s,u=!0;c&&u;)...
  function c (line 9) | function c(t){var e=r.map(t.definition,function(t){return a(t)});return ...
  function u (line 9) | function u(t){return[t.terminalType]}
  function c (line 9) | function c(t){this.name=e.IN_RULE_RECOVERY_EXCEPTION,this.message=t}
  function t (line 9) | function t(){}
  function l (line 9) | function l(t,e,n,i,o,a,s){var c=this.getKeyForAutomaticLookahead(i,o),u=...
  function a (line 9) | function a(t){var e=t.name;return e||t.toString().match(i)[1]}
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(e){var n=t.call(this)||this;return n.topProd=e,n.follows={},n}
  function p (line 9) | function p(t,e){return t.name+e+c.IN}
  function n (line 9) | function n(){this.constructor=t}
  function l (line 9) | function l(t,e,n){switch(t.type){case"Disjunction":for(var r=0;r<t.value...
  function p (line 9) | function p(t,e,n){var r=c.charCodeToOptimizedIndex(t);e[r]=r,!0===n&&fun...
  function h (line 9) | function h(t,e){return a.find(t.value,function(t){if("number"==typeof t)...
  function f (line 9) | function f(t){return!(!t.quantifier||0!==t.quantifier.atLeast)||!!t.valu...
  function e (line 9) | function e(e){var n=t.call(this)||this;return n.targetCharCodes=e,n.foun...
  function n (line 9) | function n(){this.constructor=t}
  function e (line 9) | function e(e,n){var r=t.call(this)||this;return r.nameToTopRule=e,r.errM...
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function s (line 9) | function s(t,e){for(var n=i.keys(t),r=n.length,o=0;o<r;o++)for(var a=t[n...
  function c (line 9) | function c(t,e){var n=u(t,e),r=p(t,e);return n.concat(r)}
  function u (line 9) | function u(t,e){var n=i.map(e,function(e){if(!i.isFunction(t[e]))return{...
  function p (line 9) | function p(t,e){var n=[];for(var s in t)a.validTermsPattern.test(s)&&i.i...
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function t (line 9) | function t(){}
  function E (line 9) | function E(t,e,n,i){void 0===i&&(i=!1),y(n);var o=r.peek(this.recordingP...
  function T (line 9) | function T(t){return 0===t?"":""+t}
  function y (line 9) | function y(t){if(t<0||t>p){var e=new Error("Invalid DSL Method idx value...
  function t (line 9) | function t(){}
  function a (line 9) | function a(t){return"\nfunction "+t.name+"(tokenVocabulary, config) {\n ...
  function s (line 9) | function s(t){return r.map(t,function(t){return c(t,1)}).join("\n")}
  function c (line 9) | function c(t,e){var n=E(e,'$.RULE("'+t.name+'", function() {')+o;return ...
  function u (line 9) | function u(t,e){var n=t.terminalType.name;return E(e,"$.CONSUME"+t.idx+"...
  function l (line 9) | function l(t,e){return E(e,"$.SUBRULE"+t.idx+"($."+t.nonTerminalName+")"...
  function p (line 9) | function p(t,e){var n=E(e,"$.OR"+t.idx+"([")+o;return n+=r.map(t.definit...
  function h (line 9) | function h(t,e){var n=E(e,"{")+o;return t.name&&(n+=E(e+1,'NAME: "'+t.na...
  function f (line 9) | function f(t,e,n){var r=E(n,"$."+(t+e.idx)+"(");return e.name||e.separat...
  function d (line 9) | function d(t,e){var n="function() {"+o;return n+=m(t,e),n+=E(e,"}")+o}
  function m (line 9) | function m(t,e){var n="";return r.forEach(t,function(t){n+=function(t,e)...
  function E (line 9) | function E(t,e){return Array(4*t+1).join(" ")+e}
  function b (line 12) | function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typ...
  function c (line 12) | function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseTyp...
  function d (line 12) | function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}...
  function e (line 12) | function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var ...
  function LRUMap (line 46) | function LRUMap(limit, entries) {
  function Entry (line 68) | function Entry(key, value) {
  function o (line 204) | function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.char...

FILE: vipercard/vipercard/external/externalmanualbundlebig.js
  function r (line 8) | function r(e,n,t){function o(f,i){if(!n[f]){if(!e[f]){var u="function"==...
  function v (line 8) | function v(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. ...
  function d (line 8) | function d(r){var e=v(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}
  function c (line 8) | function c(r,e,n){return(e+n)*3/4-n}
  function h (line 8) | function h(r){var e;var n=v(r);var t=n[0];var f=n[1];var i=new a(c(r,t,f...
  function s (line 8) | function s(r){return t[r>>18&63]+t[r>>12&63]+t[r>>6&63]+t[r&63]}
  function l (line 8) | function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711...
  function p (line 8) | function p(r){var e;var n=r.length;var o=n%3;var a=[];var f=16383;for(va...
  function e (line 12) | function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{...
  function t (line 12) | function t(){}
  function I (line 12) | function I(t,n,e){var r,i,o,u=new Array(e),a=8*e-n-1,c=(1<<a)-1,s=c>>1,f...
  function j (line 12) | function j(t,n,e){var r,i=8*e-n-1,o=(1<<i)-1,u=o>>1,a=i-7,c=e-1,s=t[c--]...
  function L (line 12) | function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}
  function B (line 12) | function B(t){return[255&t]}
  function C (line 12) | function C(t){return[255&t,t>>8&255]}
  function W (line 12) | function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}
  function V (line 12) | function V(t){return I(t,52,8)}
  function G (line 12) | function G(t){return I(t,23,4)}
  function D (line 12) | function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}
  function U (line 12) | function U(t,n,e,r){var i=d(+e);if(i+n>t[k])throw M(b);var o=t[R]._b,u=i...
  function z (line 12) | function z(t,n,e,r,i,o){var u=d(+e);if(u+n>t[k])throw M(b);for(var a=t[R...
  function u (line 12) | function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.en...
  function t (line 12) | function t(){}
  function c (line 12) | function c(t){return t&&t.__esModule?t:{default:t}}
  function t (line 12) | function t(t,n){if(void 0===n&&(n=!1),null==t||""===t)throw new Error("U...
  function i (line 12) | function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||v...
  function t (line 12) | function t(){}
  function v (line 12) | function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==...
  function t (line 12) | function t(){}
  function c (line 12) | function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.creat...
  function s (line 12) | function s(t,n,e){try{return{type:"normal",arg:t.call(n,e)}}catch(t){ret...
  function v (line 12) | function v(){}
  function g (line 12) | function g(){}
  function y (line 12) | function y(){}
  function _ (line 12) | function _(t){["next","throw","return"].forEach((function(n){t[n]=functi...
  function M (line 12) | function M(t){var n;this._invoke=function(e,i){function o(){return new P...
  function x (line 12) | function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,...
  function P (line 12) | function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.f...
  function O (line 12) | function O(t){var n=t.completion||{};n.type="normal",delete n.arg,t.comp...
  function A (line 12) | function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(P,this),this.r...
  function F (line 12) | function F(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==type...
  function E (line 12) | function E(){return{value:n,done:!0}}
  function i (line 12) | function i(r,i){return a.type="throw",a.arg=t,e.next=r,i&&(e.method="nex...

FILE: vipercard/vipercard/external/externalmanualbundlemin.js
  function r (line 8) | function r(e,n,t){function o(f,i){if(!n[f]){if(!e[f]){var u="function"==...
  function v (line 8) | function v(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. ...
  function d (line 8) | function d(r){var e=v(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}
  function c (line 8) | function c(r,e,n){return(e+n)*3/4-n}
  function h (line 8) | function h(r){var e;var n=v(r);var t=n[0];var f=n[1];var i=new a(c(r,t,f...
  function s (line 8) | function s(r){return t[r>>18&63]+t[r>>12&63]+t[r>>6&63]+t[r&63]}
  function l (line 8) | function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711...
  function p (line 8) | function p(r){var e;var n=r.length;var o=n%3;var a=[];var f=16383;for(va...
  function e (line 12) | function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{...
  function t (line 12) | function t(){}
  function I (line 12) | function I(t,n,e){var r,i,o,u=new Array(e),a=8*e-n-1,c=(1<<a)-1,s=c>>1,f...
  function j (line 12) | function j(t,n,e){var r,i=8*e-n-1,o=(1<<i)-1,u=o>>1,a=i-7,c=e-1,s=t[c--]...
  function L (line 12) | function L(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}
  function B (line 12) | function B(t){return[255&t]}
  function C (line 12) | function C(t){return[255&t,t>>8&255]}
  function W (line 12) | function W(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}
  function V (line 12) | function V(t){return I(t,52,8)}
  function G (line 12) | function G(t){return I(t,23,4)}
  function D (line 12) | function D(t,n,e){v(t[m],n,{get:function(){return this[e]}})}
  function U (line 12) | function U(t,n,e,r){var i=d(+e);if(i+n>t[k])throw M(b);var o=t[R]._b,u=i...
  function z (line 12) | function z(t,n,e,r,i,o){var u=d(+e);if(u+n>t[k])throw M(b);for(var a=t[R...
  function u (line 12) | function u(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.en...
  function t (line 12) | function t(){}
  function c (line 12) | function c(t){return t&&t.__esModule?t:{default:t}}
  function t (line 12) | function t(t,n){if(void 0===n&&(n=!1),null==t||""===t)throw new Error("U...
  function i (line 12) | function i(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||v...
  function t (line 12) | function t(){}
  function v (line 12) | function v(t,n,r,o,u,a){var c=r+t.length,s=o.length,f=d;return void 0!==...
  function t (line 12) | function t(){}
  function c (line 12) | function c(t,n,e,r){var i=n&&n.prototype instanceof v?n:v,o=Object.creat...
  function s (line 12) | function s(t,n,e){try{return{type:"normal",arg:t.call(n,e)}}catch(t){ret...
  function v (line 12) | function v(){}
  function g (line 12) | function g(){}
  function y (line 12) | function y(){}
  function _ (line 12) | function _(t){["next","throw","return"].forEach((function(n){t[n]=functi...
  function M (line 12) | function M(t){var n;this._invoke=function(e,i){function o(){return new P...
  function x (line 12) | function x(t,e){var r=t.iterator[e.method];if(r===n){if(e.delegate=null,...
  function P (line 12) | function P(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.f...
  function O (line 12) | function O(t){var n=t.completion||{};n.type="normal",delete n.arg,t.comp...
  function A (line 12) | function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(P,this),this.r...
  function F (line 12) | function F(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==type...
  function E (line 12) | function E(){return{value:n,done:!0}}
  function i (line 12) | function i(r,i){return a.type="throw",a.arg=t,e.next=r,i&&(e.method="nex...

FILE: vipercard/vipercard/external/js-lru/js-lru.d.ts
  type Entry (line 2) | interface Entry<K, V> {
  class LRUMap (line 7) | class LRUMap<K, V> {

FILE: vipercard/vipercard/external/js-lru/js-lru.js
  function LRUMap (line 30) | function LRUMap(limit, entries) {
  function Entry (line 52) | function Entry(key, value) {

FILE: vipercard/vipercard/external/jsgif-dynamic/jsgifcombined.js
  function ByteArray (line 824) | function ByteArray() {
  function encode64 (line 1381) | function encode64(input) {

FILE: vipercard/vipercard/external/lz-string-1.4.4/lz-string.js
  function getBaseValue (line 18) | function getBaseValue(alphabet, character) {

FILE: vipercard/vipercard/external/lz-string-1.4.4/lzstring.d.ts
  type LZStringStatic (line 10) | interface LZStringStatic {

FILE: vipercard/vipercard/external/manualbundle.py
  function go (line 7) | def go(smaller):
  function tabsToSpaces (line 43) | def tabsToSpaces(s):
  function goAll (line 46) | def goAll():

FILE: vipercard/vipercard/external/pizzicato-dynamic/Pizzicato.js
  function getDescriptionError (line 268) | function getDescriptionError(description) {
  function initializeWithWave (line 288) | function initializeWithWave(waveOptions, callback) {
  function initializeWithUrl (line 307) | function initializeWithUrl(paths, callback) {
  function initializeWithInput (line 355) | function initializeWithInput(options, callback) {
  function initializeWithFunction (line 383) | function initializeWithFunction(options, callback) {
  function initializeWithSoundObject (line 403) | function initializeWithSoundObject(options, callback) {
  function Filter (line 1325) | function Filter(options, type) {
  function buildImpulse (line 1966) | function buildImpulse() {
  function getDistortionCurve (line 2487) | function getDistortionCurve(gain) {

FILE: vipercard/vipercard/external/text-encoding-types-notbundled/index.d.ts
  type TextDecoderOptions (line 7) | interface TextDecoderOptions {
  type TextDecodeOptions (line 12) | interface TextDecodeOptions {
  type TextEncoderOptions (line 16) | interface TextEncoderOptions {
  type TextDecoder (line 20) | interface TextDecoder {
  type TextEncoder (line 27) | interface TextEncoder {
  type TextEncodeOptions (line 32) | interface TextEncodeOptions {
  type TextEncoderStatic (line 36) | interface TextEncoderStatic {
  type TextDecoderStatic (line 41) | interface TextDecoderStatic {
  type TextEncodingStatic (line 46) | interface TextEncodingStatic {

FILE: vipercard/vipercard/resources03a/intro/introjs.js
  function cerror (line 2) | function cerror(s) {
  function newBrowserDetect (line 8) | function newBrowserDetect() {
  function oldBrowserDetect (line 24) | function oldBrowserDetect() {
  function goImpl (line 92) | function goImpl() {
  function goCanonicalUrl (line 128) | function goCanonicalUrl() {
  function go (line 135) | function go() {

FILE: vipercard/vipercard/src/bridge/bridgeBrowserInfo.ts
  type BowserBrowsers (line 9) | enum BowserBrowsers {
  type BowserOS (line 52) | enum BowserOS {
  type BowserPlatform (line 70) | enum BowserPlatform {
  function mapToBowserBrowsers (line 79) | function mapToBowserBrowsers(s: string): BowserBrowsers {
  function mapToBowserOs (line 102) | function mapToBowserOs(s: string): BowserOS {
  function mapToBowserPlatform (line 125) | function mapToBowserPlatform(s: string): BowserPlatform {
  function bridgedGetAllBrowserInfo (line 148) | function bridgedGetAllBrowserInfo(

FILE: vipercard/vipercard/src/bridge/bridgeFileSaver.ts
  function bridgedSaveAs (line 7) | function bridgedSaveAs() {

FILE: vipercard/vipercard/src/bridge/bridgeJsGif.ts
  class GIFEncoderInterface (line 7) | class GIFEncoderInterface {
  function getGIFEncoderInst (line 18) | function getGIFEncoderInst() {

FILE: vipercard/vipercard/src/bridge/bridgeJsLru.ts
  type BridgedLRUMap (line 11) | type BridgedLRUMap<K, V> = LRUMap<K, V>;
  function BridgedLRUMap (line 12) | function BridgedLRUMap() {

FILE: vipercard/vipercard/src/bridge/bridgeLzString.ts
  function BridgedLZString (line 8) | function BridgedLZString() {

FILE: vipercard/vipercard/src/bridge/bridgePbkdf2.ts
  function pbkdf2 (line 15) | async function pbkdf2(

FILE: vipercard/vipercard/src/bridge/bridgePizzicato.ts
  class Sound (line 8) | class Sound {

FILE: vipercard/vipercard/src/bridge/bridgeTextEncoding.ts
  class TextEncoder (line 8) | class TextEncoder {
  class TextDecoder (line 14) | class TextDecoder {
  type TextDecoderOptions (line 23) | interface TextDecoderOptions {
  type TextDecodeOptions (line 28) | interface TextDecodeOptions {
  type TextEncoderOptions (line 32) | interface TextEncoderOptions {
  type TextEncodeOptions (line 36) | interface TextEncodeOptions {
  type TextEncodingStatic (line 40) | interface TextEncodingStatic {
  type ExpTextEncoder (line 48) | type ExpTextEncoder = TextEncoder;
  type ExpTextDecoder (line 51) | type ExpTextDecoder = TextDecoder;

FILE: vipercard/vipercard/src/test/testUtils/testTop.ts
  method runTests (line 57) | async runTests(includeSlow: boolean) {
  method runCollection (line 163) | async runCollection(

FILE: vipercard/vipercard/src/test/testUtils/testUtils.ts
  function assertThrowsAsync (line 13) | async function assertThrowsAsync<T>(
  function assertThrows (line 35) | function assertThrows(msgWithMark: string, expectedErr: string, fn: Void...
  function assertAsserts (line 55) | function assertAsserts(msgWithMark: string, expectedErr: string, fn: Voi...
  function sorted (line 83) | function sorted(ar: any[]) {
  function YetToBeDefinedTestHelper (line 92) | function YetToBeDefinedTestHelper<T>(): T {
  function notifyUserIfDebuggerIsSetToAllExceptions (line 100) | function notifyUserIfDebuggerIsSetToAllExceptions() {
  class SimpleUtil512TestCollection (line 113) | class SimpleUtil512TestCollection {
    method constructor (line 114) | constructor(public name: string, public slow = false) {}
    method test (line 122) | public test(s: string, fn: VoidFn) {
    method atest (line 130) | public atest(s: string, fn: AsyncFn) {
    method say (line 139) | public say(context: string) {

FILE: vipercard/vipercard/src/test/testUtils/testUtilsCanvas.ts
  class TestUtilsCanvas (line 15) | class TestUtilsCanvas {
    method compareCanvas (line 21) | static compareCanvas(
    method drawDifferencesInRed (line 61) | private static drawDifferencesInRed(
    method callDrawUntilRenderComplete (line 100) | private static async callDrawUntilRenderComplete(
    method RenderAndCompareImage (line 137) | private static async RenderAndCompareImage(
    method RenderAndCompareImages (line 183) | static async RenderAndCompareImages(
    method getColorFromCanvasData (line 200) | private static getColorFromCanvasData(data: Uint8ClampedArray, i: numb...
  class CanvasTestParams (line 226) | class CanvasTestParams {
    method constructor (line 227) | constructor(
  type GetDrawParams (line 247) | type GetDrawParams = () => CanvasTestParams;

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoBasic.ts
  class UI512DemoBasic (line 22) | class UI512DemoBasic extends UI512Presenter {
    method init (line 25) | init() {
    method respondMouseUp (line 77) | protected static respondMouseUp(pr: UI512DemoBasic, d: MouseUpEventDet...

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoButtons.ts
  class UI512DemoButtons (line 30) | class UI512DemoButtons extends UI512Presenter {
    method init (line 37) | init() {
    method respondMouseUp (line 86) | protected static respondMouseUp(pr: UI512DemoButtons, d: MouseUpEventD...
    method respondKeyUp (line 123) | protected static respondKeyUp(pr: UI512DemoButtons, d: KeyDownEventDet...
    method respondMouseMove (line 130) | protected static respondMouseMove(pr: UI512DemoButtons, d: MouseMoveEv...

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoComposites.ts
  class UI512DemoComposites (line 25) | class UI512DemoComposites extends UI512TestCompositesPresenter {
    method init (line 28) | init() {
    method respondMouseUp (line 64) | protected static respondMouseUp(pr: UI512DemoComposites, d: MouseUpEve...
    method gotFromDlg (line 115) | gotFromDlg(n: number) {

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoMenus.ts
  class UI512DemoMenus (line 27) | class UI512DemoMenus extends UI512Presenter {
    method init (line 29) | init() {
    method respondMenuItemClick (line 64) | protected static respondMenuItemClick(pr: UI512DemoMenus, d: MenuItemC...
    method respondMouseUp (line 76) | protected static respondMouseUp(pr: UI512DemoMenus, d: MouseUpEventDet...

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoPaint.ts
  class UI512DemoPaint (line 28) | class UI512DemoPaint extends UI512TestPaintPresenter {
    method init (line 33) | init() {
    method respondMouseDown (line 84) | protected static respondMouseDown(pr: UI512DemoPaint, d: MouseDownEven...
    method respondMouseUp (line 93) | protected static respondMouseUp(pr: UI512DemoPaint, d: MouseUpEventDet...
    method respondOnIdle (line 134) | protected static respondOnIdle(pr: UI512DemoPaint, d: IdleEventDetails) {
    method beginDragDrop (line 143) | beginDragDrop(x: number, y: number, el: UI512Element) {
    method respondMouseMove (line 148) | static respondMouseMove(pr: UI512DemoPaint, d: MouseMoveEventDetails) {

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoText.ts
  class UI512DemoText (line 29) | class UI512DemoText extends UI512Presenter {
    method init (line 36) | init() {
    method drawTextDemo (line 115) | drawTextDemo() {
    method respondMouseUp (line 150) | protected static respondMouseUp(pr: UI512DemoText, d: MouseUpEventDeta...
    method runTest (line 194) | async runTest(params: string, dldOnly: boolean) {
    method dldTest5 (line 217) | protected static async dldTest5(dldOnly: boolean) {
    method dldTest6 (line 242) | protected static async dldTest6(dldOnly: boolean) {

FILE: vipercard/vipercard/src/test/ui512demo/uiDemoTextEdit.ts
  class UI512DemoTextEdit (line 30) | class UI512DemoTextEdit extends UI512Presenter {
    method init (line 32) | init() {
    method respondMouseUp (line 99) | protected static respondMouseUp(pr: UI512DemoTextEdit, d: MouseUpEvent...
    method respondKeyDown (line 133) | protected static respondKeyDown(pr: UI512DemoTextEdit, d: KeyDownEvent...
    method onTabKeyDown (line 144) | onTabKeyDown(el: O<UI512ElTextField>, d: KeyDownEventDetails, hasShift...

FILE: vipercard/vipercard/src/test/util512/testUtil512.ts
  function increment (line 15) | function increment(vv: ValHolder<number>) {
  function increment (line 24) | function increment() {
  function takesEnumVal (line 114) | function takesEnumVal(__unused_v: TestEnum) {}
  class Parent (line 145) | class Parent {
    method a (line 146) | public a() {
  class Child (line 150) | class Child extends Parent {
    method a (line 151) | public a() {
  class Other (line 155) | class Other {
    method a (line 156) | public a() {
  type TestEnum (line 507) | enum TestEnum {

FILE: vipercard/vipercard/src/test/util512/testUtil512Assert.ts
  class CustomToString (line 251) | class CustomToString {
    method toString (line 252) | public toString() {
  class RingBufferArray (line 274) | class RingBufferArray extends RingBuffer {
    method getAt (line 277) | getAt(index: number): string {
    method setAt (line 281) | setAt(index: number, s: string) {
    method getLatestIndex (line 285) | getLatestIndex() {
    method setLatestIndex (line 289) | setLatestIndex(index: number) {

FILE: vipercard/vipercard/src/test/util512/testUtil512Class.ts
  class MyClass (line 453) | class MyClass {
    method constructor (line 454) | constructor(public a: string) {}
  class TestClsEmpty (line 482) | class TestClsEmpty {}
  class TestClsOne (line 487) | class TestClsOne {
  class TestClsWithMethods (line 494) | class TestClsWithMethods {
    method goAbc (line 497) | goAbc(p1: boolean, p2: number) {
    method goZ (line 503) | goZ(p1: boolean, p2: number) {

FILE: vipercard/vipercard/src/test/util512/testUtil512Higher.ts
  class DemoSerializable (line 56) | class DemoSerializable implements IsUtil512Serializable {
  class NotMarked (line 235) | class NotMarked {
  class DemoChild (line 288) | class DemoChild extends DemoSerializable {
  function exampleAsyncFn (line 343) | async function exampleAsyncFn() {

FILE: vipercard/vipercard/src/test/util512ui/testUI512CodeEditor.ts
  function createFakeEd (line 523) | function createFakeEd() {
  function testAutoFormat (line 541) | function testAutoFormat(ed: UI512CompCodeEditor, initial: string, expect...

FILE: vipercard/vipercard/src/test/util512ui/testUI512Composites.ts
  class TestDrawUI512Composites (line 55) | class TestDrawUI512Composites {
    method addElements (line 57) | addElements(pr: UI512TestCompositesPresenter, bounds: number[]) {
    method addElementsCodeEditor (line 80) | protected addElementsCodeEditor(pr: UI512TestCompositesPresenter) {
    method addElementsToolbox (line 110) | protected addElementsToolbox(pr: UI512TestCompositesPresenter) {
    method addElementsChoiceGroups (line 132) | protected addElementsChoiceGroups(pr: UI512TestCompositesPresenter) {
    method drawTestCase (line 158) | drawTestCase(
    method drawTestCaseComposites1 (line 197) | drawTestCaseComposites1(pr: UI512TestCompositesPresenter) {
    method drawTestCaseComposites2 (line 213) | drawTestCaseComposites2(pr: UI512TestCompositesPresenter) {
    method testDrawComposites (line 236) | testDrawComposites() {
    method simulateKey (line 278) | simulateKey(
    method simulateText (line 291) | simulateText(pr: UI512TestCompositesPresenter, s: string) {
  class UI512TestCompositesPresenter (line 302) | class UI512TestCompositesPresenter extends UI512Presenter {
    method init (line 308) | init() {
    method respondKeyDown (line 322) | protected static respondKeyDown(

FILE: vipercard/vipercard/src/test/util512ui/testUI512DrawText.ts
  class TestDrawUI512Text (line 59) | class TestDrawUI512Text {
    method addFonts (line 66) | addFonts(listFonts: string[], sFaces: string, sSizes: string, sStyles:...
    method getFormattedText (line 79) | getFormattedText(list: string[], addNewlines: boolean, demo: string) {
    method draw1 (line 89) | draw1() {
    method draw2 (line 121) | draw2() {
    method draw3 (line 163) | draw3() {
    method draw4 (line 203) | draw4() {
    method drawTest5DrawAll (line 349) | drawTest5DrawAll() {
    method drawTest5DrawOne (line 364) | drawTest5DrawOne(font: string, size: string) {
    method drawTest6DrawOne (line 422) | drawTest6DrawOne(font: string, sizes: string, grayed: string) {
    method drawTest6DrawAll (line 462) | drawTest6DrawAll() {

FILE: vipercard/vipercard/src/test/util512ui/testUI512Elements.ts
  function makeFakeGroup (line 400) | function makeFakeGroup(): [UI512Application, UI512ElGroup] {
  function listElems (line 417) | function listElems(grp: UI512ElGroup) {
  class HigherNoReplication_TestOnly (line 429) | class HigherNoReplication_TestOnly implements VpcHandleLinkedVels {
    method setOnVelLinked (line 430) | setOnVelLinked(

FILE: vipercard/vipercard/src/test/util512ui/testUI512ElementsViewButtons.ts
  class TestDrawUI512Buttons (line 44) | class TestDrawUI512Buttons {
    method setBtnStyle (line 58) | setBtnStyle(btn: UI512ElButton, props: BtnPropsToTest, style: UI512Btn...
    method addBackgroundButtons (line 109) | addBackgroundButtons(
    method addButtons (line 126) | addButtons(
    method testDrawButtons (line 170) | testDrawButtons() {
  type BtnPropsToTest (line 227) | enum BtnPropsToTest {

FILE: vipercard/vipercard/src/test/util512ui/testUI512MenuRender.ts
  class TestDrawUI512Menus (line 42) | class TestDrawUI512Menus {
    method getDefn (line 45) | getDefn(): UI512MenuDefn[] {
    method addElements (line 110) | addElements(pr: UI512Presenter, bgtext: string, bounds: number[]) {
    method drawTestCase (line 141) | drawTestCase(
    method testDrawMenus (line 180) | testDrawMenus() {
  class UI512TestMenusPresenter (line 251) | class UI512TestMenusPresenter extends UI512Presenter {}

FILE: vipercard/vipercard/src/test/util512ui/testUI512Paint.ts
  class TestDrawUI512Paint (line 55) | class TestDrawUI512Paint {
    method testSetPixelAndSerialize (line 58) | protected testSetPixelAndSerialize(
    method testIrregularPoly (line 108) | protected testIrregularPoly(
    method drawBlackRectangle (line 127) | protected drawBlackRectangle(
    method testSmears (line 147) | protected testSmears(
    method drawShapes (line 200) | protected drawShapes(painter: UI512Painter, w: number, h: number) {
    method testShapes (line 214) | protected testShapes(
    method getIrregularPolygon (line 286) | protected getIrregularPolygon(x: number, y: number, w: number, h: numb...
    method addElements (line 298) | addElements(pr: UI512Presenter, bounds: number[]) {
    method drawTestCase (line 341) | drawTestCase(
    method testDrawShape (line 366) | testDrawShape() {
    method testDrawFloodFill (line 408) | testDrawFloodFill() {
  class UI512TestPaintPresenter (line 430) | class UI512TestPaintPresenter extends UI512Presenter {
    method init (line 435) | init() {

FILE: vipercard/vipercard/src/test/util512ui/testUI512PaintFlood.ts
  class FloodFillTest (line 23) | class FloodFillTest {
    method runFloodfill (line 29) | protected runFloodfill(painter: UI512PainterCvDataAndPatterns, spaceX:...
    method start (line 56) | start() {
    method floodFillTest (line 63) | floodFillTest(canvas: CanvasWrapper) {

FILE: vipercard/vipercard/src/test/util512ui/testUI512TextEdit.ts
  class TestDrawUI512TextEdit (line 53) | class TestDrawUI512TextEdit {
    method constructor (line 55) | constructor() {}
    method addElements (line 57) | addElements(pr: UI512Presenter, bounds: number[], wordWrap: boolean) {
    method getTextWithFonts (line 83) | getTextWithFonts() {
    method addElementsRight (line 115) | protected addElementsRight(pr: UI512Presenter, grp: UI512ElGroup) {
    method addElementsLeft (line 211) | protected addElementsLeft(
    method addElementsUpperLeft (line 268) | protected addElementsUpperLeft(
    method toggleScroll (line 303) | toggleScroll(pr: UI512Presenter) {
    method drawTestCase (line 314) | drawTestCase(
    method testDrawTextEdit (line 357) | testDrawTextEdit(wordWrap: boolean) {
    method geneva (line 400) | geneva(el: UI512ElTextField, s: string) {
  class UI512TestTextEditPresenter (line 413) | class UI512TestTextEditPresenter extends UI512Presenter {
    method init (line 414) | init() {

FILE: vipercard/vipercard/src/test/util512ui/testUI512TextEditInteractions.ts
  class TestTextEventInteractions (line 19) | class TestTextEventInteractions {
    method drawTestCaseScrolling (line 20) | drawTestCaseScrolling(pr: UI512Presenter) {
    method drawTestCaseSelection (line 81) | drawTestCaseSelection(pr: UI512Presenter) {
    method simulateClick (line 224) | simulateClick(
    method simulateTypeLetter (line 241) | simulateTypeLetter(pr: UI512Presenter, letter: string) {
    method simulateKey (line 246) | simulateKey(

FILE: vipercard/vipercard/src/test/util512ui/testUI512TextModify.ts
  type FnChangesSelection (line 268) | type FnChangesSelection = (...args: unknown[]) => [FormattedText, number...
  function runT (line 275) | function runT(
  class FormattedTextFromPlainText (line 301) | class FormattedTextFromPlainText {
    method fromPlainText (line 310) | static fromPlainText(s: string): [FormattedText, number, number] {

FILE: vipercard/vipercard/src/test/util512ui/testUI512TextSelectEvents.ts
  function testChangeSel (line 1225) | function testChangeSel(

FILE: vipercard/vipercard/src/test/vpc/vpcTestChunkResolution.ts
  function testGetChunk (line 473) | function testGetChunk(
  function testSetChunk (line 495) | function testSetChunk(
  class MockOutsideWorld (line 524) | class MockOutsideWorld {
    method SetVarContents (line 526) | SetVarContents(varName: string, v: VpcVal) {
    method ReadVarContents (line 531) | ReadVarContents(varName: string): VpcVal {
    method getMock (line 536) | getMock(): OutsideWorldReadWrite {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptEval.ts
  class UseFldInsteadOfBtn (line 442) | class UseFldInsteadOfBtn extends TestMultiplier {
    method secondTransformation (line 443) | secondTransformation(code: string, expected: string): O<[string, strin...

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptExprLvl.ts
  class TestVpcScriptRunBaseForScriptExpr (line 1147) | class TestVpcScriptRunBaseForScriptExpr extends TestVpcScriptRunBase {
    method testModelBgPartProps (line 1148) | testModelBgPartProps(newState: VpcState) {
    method modifyVcState (line 1162) | modifyVcState() {
    method testModelHasItAll (line 1249) | testModelHasItAll(newState: VpcState) {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptExtensiveChunk.ts
  class RunExtensiveChunkTests (line 55) | class RunExtensiveChunkTests {
    method loadTestData (line 62) | async loadTestData() {
    method go (line 71) | async go() {
    method expandTestData (line 120) | protected expandTestData(data: string[]): string[] {
    method doTestBatch (line 141) | protected doTestBatch(batch: string[], count: number) {
    method compareResultsWithExpected (line 172) | protected compareResultsWithExpected(
    method genTestCode (line 218) | protected genTestCode(entry: string, expecteds: string[], i: number) {
    method isADeleteWithFinalRange (line 259) | isADeleteWithFinalRange(s: string) {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptExtensiveIf.ts
  class RunExtensiveConditionalTests (line 33) | class RunExtensiveConditionalTests {
    method loadTestData (line 85) | async loadTestData() {
    method getLineFromExpected (line 94) | getLineFromExpected(expected: string[], i: number) {
    method testHelpers (line 105) | async testHelpers() {
    method go (line 145) | async go() {
    method goImpl (line 155) | async goImpl() {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptParseCmd.ts
  class TestParseHelpers (line 270) | class TestParseHelpers {
    method constructor (line 274) | constructor() {
    method instance (line 283) | static instance() {
    method testParse (line 298) | testParse(sInput: string, sTopRule: string, sExpected: string, sErrExp...
    method testParseRespondToErrs (line 345) | protected testParseRespondToErrs(sInput: string, sErrExpected: string,...
  function testCmdSet (line 378) | function testCmdSet(sInput: string, sExpected: string) {
  function assertFailsCmdSet (line 391) | function assertFailsCmdSet(sInput: string, sErrExpected: string) {
  function testCmd (line 405) | function testCmd(sInput: string, sExpected: string) {
  function assertFailsCmd (line 424) | function assertFailsCmd(sInput: string, sErrExpected: string) {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptParseExpr.ts
  function testExp (line 541) | function testExp(sInput: string, sExpected: string) {
  function assertFailsParseExp (line 553) | function assertFailsParseExp(sInput: string, sErrExpected: string) {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptRewrites.ts
  type IVpcCacheParsedASTForTest (line 25) | interface IVpcCacheParsedASTForTest {
  class VpcCacheParsedASTForTest (line 816) | class VpcCacheParsedASTForTest extends VpcCacheParsedAST {
    method constructor (line 817) | constructor() {
    method compareRewrittenCode (line 824) | compareRewrittenCode(script: string, expected: string) {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptRunBase.ts
  class ScriptTestBatch (line 34) | class ScriptTestBatch {
    method constructor (line 39) | constructor() {
    method t (line 48) | t(s1: string, s2: string) {
    method batchEvaluate (line 53) | batchEvaluate(
    method multiplyTests (line 87) | multiplyTests(
    method checkPending (line 121) | static checkPending() {
  class TestVpcScriptRunBase (line 147) | class TestVpcScriptRunBase {
    method constructor (line 156) | constructor(protected t: SimpleUtil512TestCollection) {}
    method initEnvironment (line 158) | async initEnvironment() {
    method startEnvironment (line 173) | async startEnvironment(): Promise<[VpcPresenter, VpcState]> {
    method setScript (line 178) | setScript(id: string, s: string) {
    method populateModel (line 185) | populateModel() {
    method onScriptErr (line 305) | protected onScriptErr(
    method runGeneralCode (line 382) | runGeneralCode(
    method assertPreparseErr (line 476) | assertPreparseErr(s: string, expectErrMsg?: string, expectErrLine?: nu...
    method assertPreparseErrLn (line 480) | assertPreparseErrLn(s: string, expectErrMsg?: string, expectErrLine?: ...
    method assertLineErr (line 484) | assertLineErr(s: string, expectErrMsg: string, expectErrLine?: number) {
    method testOneEvaluate (line 488) | testOneEvaluate(
    method testBatchEvaluate (line 507) | testBatchEvaluate(testsRaw: [string, string][], floatingPoint = false) {
    method confirmCorrectResult (line 604) | protected confirmCorrectResult(
  type BatchType (line 658) | enum BatchType {
  method firstTransformation (line 673) | firstTransformation(code: string, expected: string): O<[string, string]> {
  method secondTransformation (line 676) | secondTransformation(code: string, expected: string): O<[string, string]> {
  method thirdTransformation (line 679) | thirdTransformation(code: string, expected: string): O<[string, string]> {
  class TestMultiplierCommutative (line 684) | class TestMultiplierCommutative extends TestMultiplier {
    method firstTransformation (line 685) | firstTransformation(code: string, expected: string): [string, string] {
    method secondTransformation (line 688) | secondTransformation(code: string, expected: string): [string, string] {
  class TestMultiplierInvert (line 696) | class TestMultiplierInvert extends TestMultiplier {
    method firstTransformation (line 698) | firstTransformation(code: string, expected: string): [string, string] {
    method secondTransformation (line 705) | secondTransformation(code: string, expected: string): [string, string] {
    method flipOperation (line 715) | protected static flipOperation(op: string): O<[string, string]> {
    method flipOperationCommute (line 742) | static flipOperationCommute(op: string): string {
    method flipOperationInvert (line 746) | static flipOperationInvert(op: string): string {
    method flipBool (line 751) | static flipBool(s: string) {
  class TestMultiplierInvertLeaveUnderscores (line 764) | class TestMultiplierInvertLeaveUnderscores extends TestMultiplierInvert {

FILE: vipercard/vipercard/src/test/vpc/vpcTestScriptRunCustomFns.ts
  class TestVpcScriptRunCustomFns (line 893) | class TestVpcScriptRunCustomFns extends TestVpcScriptRunBase {
    method provideCustomFnInStackScript (line 897) | provideCustomFnInStackScript(addCode = '') {

FILE: vipercard/vipercard/src/test/vpc/vpcTestVpcVal.ts
  function testEquality (line 308) | function testEquality(exp: boolean, inp1: string, inp2: string) {

FILE: vipercard/vipercard/src/test/vpc03/props/test03chunk.ts
  function setupManyFonts (line 30) | function setupManyFonts(b: ScriptTestBatch) {

FILE: vipercard/vipercard/src/test/vpc03/test03chunkAdditional.ts
  class MakePutCmd (line 290) | class MakePutCmd extends TestMultiplier {
    method secondTransformation (line 291) | secondTransformation(code: string, expected: string): O<[string, strin...

FILE: vipercard/vipercard/src/test/vpc03/test03chunkBasic.ts
  class EvaluateWithVarAndFld (line 860) | class EvaluateWithVarAndFld extends TestMultiplier {
    method secondTransformation (line 861) | secondTransformation(code: string, expected: string): O<[string, strin...
    method doReplace (line 864) | protected doReplace(s: string) {

FILE: vipercard/vipercard/src/test/vpc03/test03exprObjectRef.ts
  class GoForBothFldAndBtn (line 634) | class GoForBothFldAndBtn extends TestMultiplier {
    method firstTransformation (line 635) | firstTransformation(code: string, expected: string): O<[string, string...
    method secondTransformation (line 642) | secondTransformation(code: string, expected: string): O<[string, strin...
  class AppendOfThisStack (line 652) | class AppendOfThisStack extends TestMultiplier {
    method secondTransformation (line 653) | secondTransformation(code: string, expected: string): O<[string, strin...
  class EvaluateThereIs (line 666) | class EvaluateThereIs extends TestMultiplier {
    method secondTransformation (line 667) | secondTransformation(code: string, expected: string): O<[string, strin...
    method convertCode (line 675) | protected convertCode(s: string) {
    method convertExpected (line 680) | protected convertExpected(s: string) {
  class EvaluateAsParsedFromAString (line 698) | class EvaluateAsParsedFromAString extends TestMultiplier {
    method secondTransformation (line 699) | secondTransformation(code: string, expected: string): O<[string, strin...

FILE: vipercard/vipercard/src/test/vpc03/test03lexer.ts
  class TestVpc03 (line 233) | class TestVpc03 extends TestVpcScriptRunBase {
    method populateModel (line 234) | populateModel() {

FILE: vipercard/vipercard/src/ui512/composites/ui512ButtonGroup.ts
  class UI512CompButtonGroup (line 21) | class UI512CompButtonGroup extends UI512CompBase {
    method createSpecific (line 31) | createSpecific(app: UI512Application) {
    method getWhichChecked (line 54) | getWhichChecked(app: UI512Application) {
    method setWhichChecked (line 71) | setWhichChecked(app: UI512Application, idlist: string[]) {
    method respondMouseUp (line 83) | respondMouseUp(app: UI512Application, d: MouseUpEventDetails) {

FILE: vipercard/vipercard/src/ui512/composites/ui512CodeEditor.ts
  class UI512CompCodeEditor (line 24) | class UI512CompCodeEditor extends UI512CompBase {
    method constructor (line 33) | constructor(compositeId: string) {
    method createSpecific (line 40) | createSpecific(app: UI512Application) {
    method setContent (line 71) | setContent(s: string) {
    method setCaption (line 80) | setCaption(app: UI512Application, s: string) {
    method respondKeydown (line 91) | respondKeydown(d: KeyDownEventDetails) {

FILE: vipercard/vipercard/src/ui512/composites/ui512CodeEditorAutoIndent.ts
  class UI512AutoIndent (line 21) | class UI512AutoIndent {
    method lineIsContinuation (line 41) | protected lineIsContinuation(s: string) {
    method getLevelChangeIsStartNewBlock (line 55) | getLevelChangeIsStartNewBlock(
    method lineDoesNotActuallyStartBlock (line 91) | lineDoesNotActuallyStartBlock(s: string) {
    method getLevelChangeIsEndOfBlock (line 98) | getLevelChangeIsEndOfBlock(s: string, stack: AutoIndentMatch[]) {
    method getLevelChange (line 112) | protected getLevelChange(
    method runAutoIndentAll (line 154) | runAutoIndentAll(el: UI512ElTextField) {
    method runAutoIndent (line 171) | protected runAutoIndent(lns: UI512Lines, el: UI512ElTextField): UI512L...
    method lineSetIndent (line 189) | protected lineSetIndent(s: string, n: number) {
    method runAutoIndentImpl (line 204) | protected runAutoIndentImpl(
    method createAutoBlock (line 284) | createAutoBlock(
  class UI512CompCodeEditorFont (line 321) | class UI512CompCodeEditorFont {
  class AutoIndentMatch (line 333) | class AutoIndentMatch {

FILE: vipercard/vipercard/src/ui512/composites/ui512Composites.ts
  method constructor (line 36) | constructor(compositeId: string) {
  method getElId (line 44) | getElId(suffix: string) {
  method fromFullId (line 51) | fromFullId(fullId: string) {
  method moveAllTo (line 63) | moveAllTo(newX: number, newY: number, app: UI512Application) {
  method genBtn (line 78) | protected genBtn(app: UI512Application, grp: UI512ElGroup, shortId: stri...
  method genChild (line 85) | protected genChild<T extends UI512Element>(
  method create (line 105) | create(pr: UI512PresenterBase, app: UI512Application, index = -1) {
  method destroy (line 124) | destroy(pr: UI512PresenterBase, app: UI512Application) {
  method drawWindowDecoration (line 133) | protected drawWindowDecoration(
  method setVisible (line 218) | setVisible(app: UI512Application, visible: boolean) {
  class BorderDecorationConsts (line 227) | class BorderDecorationConsts {
  class PalBorderDecorationConsts (line 246) | class PalBorderDecorationConsts extends BorderDecorationConsts {
  class WndBorderDecorationConsts (line 263) | class WndBorderDecorationConsts extends BorderDecorationConsts {

FILE: vipercard/vipercard/src/ui512/composites/ui512ModalDialog.ts
  class UI512CompModalDialog (line 36) | class UI512CompModalDialog extends UI512CompBase {
    method create (line 60) | create(pr: UI512Presenter, app: UI512Application) {
    method standardAnswer (line 68) | standardAnswer(
    method standardAsk (line 89) | standardAsk(
    method drawBtn (line 112) | protected drawBtn(
    method drawInputFld (line 137) | protected drawInputFld(
    method createSpecific (line 165) | createSpecific(app: UI512Application) {
    method showStandardModalDialog (line 209) | showStandardModalDialog(
    method onClickChoiceBtn (line 268) | onClickChoiceBtn() {
    method addReturnKeyListener (line 291) | addReturnKeyListener(cbs: FnEventCallback[], app: UI512Application) {
    method destroy (line 333) | destroy(pr: UI512PresenterBase, app: UI512Application) {
    method isCancelRect (line 341) | protected isCancelRect(x: number, y: number) {
    method getWhichBtnFromClick (line 363) | protected getWhichBtnFromClick(d: MouseUpEventDetails) {
    method getFullDimensions (line 380) | getFullDimensions() {
  class TemporarilyRedirectForModal (line 411) | class TemporarilyRedirectForModal extends TemporarilySuspendEvents {
    method constructor (line 414) | constructor(public callback: () => void) {
    method saveInteraction (line 421) | saveInteraction(app: UI512Application, grpid: string) {
    method restoreInteraction (line 434) | restoreInteraction(app: UI512Application, grpid: string) {
    method shouldRestore (line 445) | shouldRestore(ms: number) {
    method whenComplete (line 452) | whenComplete() {
  type UI512CompStdDialogType (line 460) | enum UI512CompStdDialogType {
  type UI512CompStdDialogResult (line 468) | enum UI512CompStdDialogResult {

FILE: vipercard/vipercard/src/ui512/composites/ui512Toolbox.ts
  class UI512CompToolbox (line 20) | class UI512CompToolbox extends UI512CompBase {
    method createSpecific (line 33) | createSpecific(app: UI512Application) {
    method getWhich (line 70) | getWhich() {
    method setWhich (line 77) | setWhich(app: UI512Application, subid: O<string>) {
    method widthOfIcon (line 85) | widthOfIcon(iconid: string) {
    method respondMouseUp (line 92) | respondMouseUp(app: UI512Application, d: MouseUpEventDetails) {
    method refreshHighlight (line 123) | protected refreshHighlight(app: UI512Application) {

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawBorders.ts
  class UI512ViewDrawBorders (line 18) | class UI512ViewDrawBorders {
    method constructor (line 20) | constructor(
    method dr (line 32) | dr(x: number, y: number, w: number, h: number, color: string) {
    method fallbackToSimpleRect (line 41) | fallbackToSimpleRect(highlight: boolean) {
    method drawosboxmodal (line 54) | drawosboxmodal() {
    method drawosboxshadow (line 263) | drawosboxshadow() {
    method drawosboxshadowclicked (line 346) | drawosboxshadowclicked() {
    method drawosbtn (line 423) | drawosbtn() {
    method drawosbtnclicked (line 590) | drawosbtnclicked() {
    method drawosdefaultbtn (line 725) | drawosdefaultbtn() {
    method drawosdefaultbtnclicked (line 1028) | drawosdefaultbtnclicked() {
    method drawvpcbtn (line 1307) | drawvpcbtn() {
    method drawvpcbtnclicked (line 1564) | drawvpcbtnclicked() {
    method drawvpcroundrect (line 1767) | drawvpcroundrect() {
    method drawvpcroundrectclicked (line 2030) | drawvpcroundrectclicked() {
    method drawboxthinborder (line 2237) | drawboxthinborder() {
    method drawboxthinborderclicked (line 2264) | drawboxthinborderclicked() {
    method drawboxnoborder (line 2268) | drawboxnoborder() {
    method drawboxnoborderclicked (line 2272) | drawboxnoborderclicked() {
    method drawCorners (line 2276) | drawCorners(corner: string) {

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawIconClasses.ts
  class IconInfo (line 12) | class IconInfo {
    method constructor (line 20) | constructor(public iconGroup: string, public iconNumber: number) {}
  class RenderIcon (line 26) | class RenderIcon {
    method constructor (line 27) | constructor(public set: RenderIconGroup, public srcRect: number[]) {}
    method drawIntoBox (line 28) | drawIntoBox(
    method drawAtLocationAndClipFromBox (line 74) | drawAtLocationAndClipFromBox(
  class RenderIconGroup (line 110) | class RenderIconGroup {
    method constructor (line 124) | constructor(public readonly groupId: string) {
    method getRectangle (line 140) | getRectangle(iconNumber: number) {
    method getIcon (line 168) | getIcon(iconNumber: number): RenderIcon {
    method lookupRectangle (line 177) | static lookupRectangle(iconGroupId: string, iconNumber: number): O<num...
  class IconGroupInfo (line 187) | class IconGroupInfo {

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawIconManager.ts
  class UI512IconManager (line 15) | class UI512IconManager implements UI512IsDrawIconInterface {
    method findIcon (line 21) | findIcon(iconGroupId: string, iconNumber: number): O<RenderIcon> {

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawPaintDispatch.ts
  type UI512PaintDispatchShapes (line 17) | enum UI512PaintDispatchShapes {
  class UI512PaintDispatch (line 35) | class UI512PaintDispatch {
    method constructor (line 38) | constructor(
    method fromMemoryOpts (line 51) | static fromMemoryOpts(
    method go (line 92) | static go(args: UI512PaintDispatch, painter: UI512Painter) {
    method paintBucketSlowButWorks (line 213) | static paintBucketSlowButWorks(

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawPainter.ts
  class UI512PainterCvData (line 14) | class UI512PainterCvData extends UI512Painter {
    method constructor (line 15) | constructor(
    method setPixel (line 23) | setPixel(x: number, y: number, color: number): void {
    method fillRect (line 49) | fillRect(xIn: number, yIn: number, wIn: number, hIn: number, color: nu...
    method readPixel (line 57) | readPixel(x: number, y: number) {
    method readPixelSupported (line 87) | readPixelSupported() {
    method getCanvasWidth (line 91) | getCanvasWidth() {
    method getCanvasHeight (line 95) | getCanvasHeight() {
    method getBackingSurface (line 99) | getBackingSurface() {
    method getSurfaceName (line 103) | getSurfaceName() {
    method supportsPatterns (line 107) | supportsPatterns() {
    method floodFill (line 111) | floodFill(xIn: number, yIn: number, color: number) {
    method floodFillInTwoStages (line 121) | protected floodFillInTwoStages(xIn: number, yIn: number, color: number) {
    method getOppositeColor (line 147) | protected getOppositeColor(clr: number) {
  class UI512PainterCvDataAndPatterns (line 159) | class UI512PainterCvDataAndPatterns extends UI512PainterCvData {
    method constructor (line 160) | constructor(
    method setPixel (line 168) | setPixel(x: number, y: number, color: number): void {
    method getSurfaceName (line 191) | getSurfaceName() {
    method supportsPatterns (line 195) | supportsPatterns() {
  class UI512PainterCvCanvas (line 204) | class UI512PainterCvCanvas extends UI512Painter {
    method constructor (line 205) | constructor(
    method setPixel (line 213) | setPixel(x: number, y: number, color: number): void {
    method fillRect (line 225) | fillRect(x: number, y: number, w: number, h: number, color: number): v...
    method readPixel (line 237) | readPixel(x: number, y: number): number {
    method readPixelSupported (line 241) | readPixelSupported() {
    method getCanvasWidth (line 245) | getCanvasWidth() {
    method getCanvasHeight (line 249) | getCanvasHeight() {
    method getBackingSurface (line 253) | getBackingSurface() {
    method getSurfaceName (line 257) | getSurfaceName() {
    method supportsPatterns (line 261) | supportsPatterns() {

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawPainterClasses.ts
  method publicSmearPencil (line 33) | publicSmearPencil(xPts: number[], yPts: number[], clrIn: number) {
  method publicSmearRectangle (line 43) | publicSmearRectangle(
  method publicSmearSmallBrush (line 65) | publicSmearSmallBrush(xPts: number[], yPts: number[], colorparam: number) {
  method publicSmearSpraycan (line 80) | publicSmearSpraycan(xPts: number[], yPts: number[], colorparam: number) {
  method publicStraightLine (line 118) | publicStraightLine(
  method publicRoundRect (line 142) | publicRoundRect(
  method publicRectangle (line 169) | publicRectangle(
  method publicCurve (line 196) | publicCurve(
  method publicPlotEllipse (line 223) | publicPlotEllipse(
  method smearShapeImpl (line 258) | protected smearShapeImpl(
  method drawShapeAdjustableBorderImpl (line 291) | protected drawShapeAdjustableBorderImpl(
  method floodFill (line 309) | floodFill(xIn: number, yIn: number, color: number) {
  method floodFillImpl (line 322) | protected floodFillImpl(
  method plotEllipse (line 384) | plotEllipse(
  method plotLine (line 410) | plotLine(x0: number, y0: number, x1: number, y1: number, color: number) {
  method plotEllipseAxis (line 444) | protected plotEllipseAxis(
  method plotCircle (line 500) | plotCircle(xm: number, ym: number, r: number, color: number, fillColor: ...
  method plotQuadBezierSeg (line 523) | plotQuadBezierSeg(
  method plotQuadBezier (line 601) | plotQuadBezier(

FILE: vipercard/vipercard/src/ui512/draw/ui512DrawPatterns.ts
  method defaultPatternData (line 68) | defaultPatternData() {
  method fillPolygon (line 92) | fillPolygon(
  method drawvpcroundrectPorted (line 159) | drawvpcroundrectPorted(
  method drawboxthinborderPorted (line 400) | drawboxthinborderPorted(
  method fillRectMightBeClear (line 427) | fillRectMightBeClear(x: number, y: number, w: number, h: number, fill: O...
  function needsPatternSupport (line 438) | function needsPatternSupport(fillColor: O<number>) {
  function simplifyPattern (line 447) | function simplifyPattern(colorOrPattern: number) {

FILE: vipercard/vipercard/src/ui512/draw/ui512ImageCollection.ts
  class UI512ImageCollectionCollection (line 13) | class UI512ImageCollectionCollection {
  class UI512ImageCollection (line 20) | class UI512ImageCollection {
    method constructor (line 23) | constructor(public id: string, public name: string, public readonly ur...
    method genChildren (line 24) | genChildren(largestNumber: number) {
  class UI512ImageCollectionImage (line 41) | class UI512ImageCollectionImage {
    method constructor (line 42) | constructor(public id: string, public name: string) {}
    method startLoad (line 46) | startLoad(cb: () => void) {
    method getSize (line 57) | getSize() {
    method getUrl (line 61) | getUrl() {

FILE: vipercard/vipercard/src/ui512/draw/ui512ImageDissolve.ts
  class UI512ImageDissolve (line 15) | class UI512ImageDissolve {
    method blendAtStage (line 18) | blendAtStage(

FILE: vipercard/vipercard/src/ui512/draw/ui512ImageSerialization.ts
  method loadFromString (line 30) | loadFromString(canvas: CanvasWrapper, compressed: string) {
  method writeToString (line 78) | writeToString(canvas: CanvasWrapper) {
  method writeToStringFromData (line 88) | writeToStringFromData(data: Uint8ClampedArray, w: number, h: number) {

FILE: vipercard/vipercard/src/ui512/draw/ui512Interfaces.ts
  type MenuOpenState (line 14) | enum MenuOpenState {
  type UI512EventType (line 24) | enum UI512EventType {
  type ClipManagerInterface (line 44) | interface ClipManagerInterface {
  type ChangeContext (line 56) | enum ChangeContext {
  type MouseDragStatus (line 67) | enum MouseDragStatus {
  type TemporarilySuspendEventsInterface (line 78) | interface TemporarilySuspendEventsInterface {
  type FnEventCallback (line 86) | type FnEventCallback = (
  type UI512PresenterInterface (line 96) | interface UI512PresenterInterface {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512ComplexFontChanges.ts
  method styleListToInt (line 19) | styleListToInt(list: string[]): TextFontStyling {
  method intToStyleList (line 62) | intToStyleList(style: TextFontStyling) {
  method styleListToLowString (line 106) | styleListToLowString(vpcStyles: string[]) {
  method lowStringToStyleList (line 114) | lowStringToStyleList(style: string) {
  method fitBounds (line 123) | fitBounds(txtlen: number, inStart: number, inLen: number, isGet: boolean) {
  method _getChunkTextAttribute (line 138) | _getChunkTextAttribute(
  method _setChunkTextAttribute (line 166) | _setChunkTextAttribute(
  method getChunkTextFaceOrMixed (line 186) | getChunkTextFaceOrMixed(
  method setChunkTextFace (line 199) | setChunkTextFace(
  method getChunkTextSizeOrMixed (line 213) | getChunkTextSizeOrMixed(
  method setChunkTextSize (line 228) | setChunkTextSize(
  method getChunkTextStyleOrMixed (line 243) | getChunkTextStyleOrMixed(
  method setChunkTextStyleSimple (line 257) | setChunkTextStyleSimple(
  method _setChunkTextStyleAddOrSub (line 272) | _setChunkTextStyleAddOrSub(
  method doAnyCharactersNotHaveThisStyle (line 310) | doAnyCharactersNotHaveThisStyle(
  method _setChunkTextStyleToggle (line 337) | _setChunkTextStyleToggle(
  method setChunkTextStyleAdvanced (line 394) | setChunkTextStyleAdvanced(
  method setGeneralTextStyleAdvanced (line 443) | setGeneralTextStyleAdvanced(low: string, spec: string) {
  method setGeneralTextStyleAdvancedInt (line 462) | setGeneralTextStyleAdvancedInt(n: number, spec: string) {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawText.ts
  class UI512DrawText (line 22) | class UI512DrawText implements UI512IsDrawTextInterface {
    method isFontSupported (line 30) | isFontSupported(font: string) {
    method measureString (line 39) | measureString(s: string) {
    method drawStringIntoBox (line 48) | drawStringIntoBox(
    method drawFormattedStringIntoBox (line 66) | drawFormattedStringIntoBox(
    method wrapTextIntoLinesOneCharAtATime (line 97) | protected wrapTextIntoLinesOneCharAtATime(
    method measureSpanOfText (line 123) | protected measureSpanOfText(measurements: DrawCharResult[], n1: number...
    method wrapTextIntoLines (line 139) | protected wrapTextIntoLines(
    method drawCaret (line 281) | protected drawCaret(args: DrawTextArgs, canvas: CanvasWrapper, bounds:...
    method drawSelected (line 298) | protected drawSelected(
    method callPerChar (line 320) | protected callPerChar(
    method drawStringIntoBoxImplLine (line 367) | protected drawStringIntoBoxImplLine(
    method makeAsteriskOnlyIfApplicable (line 480) | static makeAsteriskOnlyIfApplicable(textin: FormattedText, args: DrawT...
    method drawStringIntoBoxImpl (line 498) | protected drawStringIntoBoxImpl(
    method setFont (line 582) | static setFont(s: string, font: string) {
    method makeInitialTextGrayed (line 589) | static makeInitialTextGrayed(s: string) {
  class LineTextToRender (line 617) | class LineTextToRender {
    method measureHeight (line 628) | measureHeight(
    method measureWidth (line 662) | measureWidth(cache: UI512FontRequest, measurements: DrawCharResult[]) {
    method measureChar (line 678) | measureChar(i: number, measurements: DrawCharResult[]) {
  type ShouldContinueDrawing (line 687) | const enum ShouldContinueDrawing {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawTextArgs.ts
  class DrawTextArgs (line 13) | class DrawTextArgs {
    method constructor (line 14) | constructor(
  function drawTextArgsFromEl (line 42) | function drawTextArgsFromEl(
  type CanGetValue (line 98) | interface CanGetValue {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawTextChar.ts
  method draw (line 23) | draw(
  method _drawImpl (line 88) | _drawImpl(

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawTextCharGrayed.ts
  method ensureTempCanvas (line 12) | ensureTempCanvas(): CanvasWrapper {
  method go (line 25) | go(
  method makeCheckered (line 78) | makeCheckered(c: CanvasWrapper, parity: number) {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawTextClasses.ts
  class DrawCharResult (line 33) | class DrawCharResult {
    method constructor (line 34) | constructor(
    method update (line 39) | update(drawn: DrawCharResult) {
  class UI512FontGrid (line 54) | class UI512FontGrid {
    method freeze (line 62) | freeze() {
    method getLineHeight (line 70) | getLineHeight() {
    method getCapHeight (line 83) | getCapHeight() {
  type UI512FontMetrics (line 100) | interface UI512FontMetrics {
  class TextRendererFont (line 114) | class TextRendererFont {
    method constructor (line 119) | constructor(public readonly grid: UI512FontGrid) {}
  type CharRectType (line 129) | enum CharRectType {
  class FoundCharByLocation (line 139) | class FoundCharByLocation {
    method constructor (line 140) | constructor(
  type TextFontStyling (line 155) | enum TextFontStyling {
  function textFontStylingToString (line 170) | function textFontStylingToString(e: TextFontStyling): string {
  function stringToTextFontStyling (line 186) | function stringToTextFontStyling(s: string): TextFontStyling {
  function typefacenameToTypefaceId (line 231) | function typefacenameToTypefaceId(s: string): string {
  function typefacenameToTypefaceIdFull (line 261) | function typefacenameToTypefaceIdFull(s: string): string {
  class TextFontSpec (line 272) | class TextFontSpec {
    method constructor (line 273) | constructor(
    method fromString (line 278) | static fromString(s: string) {
    method toSpecString (line 286) | toSpecString() {
    method getTypeface (line 293) | static getTypeface(s: string) {
    method getFontSize (line 297) | static getFontSize(s: string) {
    method getFontStyle (line 301) | static getFontStyle(s: string) {
    method setTypeface (line 305) | static setTypeface(s: string, sNext: string) {
    method setFontSize (line 314) | static setFontSize(s: string, sNext: string) {
    method setFontStyle (line 323) | static setFontStyle(s: string, sNext: string) {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512DrawTextFontRequest.ts
  class UI512FontRequest (line 14) | class UI512FontRequest {
    method constructor (line 47) | constructor() {
    method findGrid (line 109) | findGrid(font: string): O<UI512FontGrid> {
    method findFont (line 164) | findFont(font: string): O<TextRendererFont> {
    method getFont (line 201) | getFont(font: string): TextRendererFont {
    method stripManuallyAddedStylingToGetGridKey (line 213) | stripManuallyAddedStylingToGetGridKey(s: string) {
  type CacheState (line 225) | enum CacheState {
  method go (line 262) | go(gridkey: string, obj: UI512FontGrid) {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512FormattedText.ts
  class FormattedText (line 17) | class FormattedText {
    method charAt (line 26) | charAt(i: number) {
    method fontAt (line 30) | fontAt(i: number) {
    method indexOf (line 34) | indexOf(c: number) {
    method setFontAt (line 38) | setFontAt(i: number, s: string) {
    method setCharAt (line 51) | setCharAt(i: number, n: number) {
    method setFontEverywhere (line 57) | setFontEverywhere(s: string) {
    method push (line 72) | push(char: number, font: string) {
    method slice (line 86) | slice(start: number, end: number) {
    method append (line 103) | append(other: FormattedText) {
    method lock (line 109) | lock() {
    method isLocked (line 113) | isLocked() {
    method getUnlockedCopy (line 117) | getUnlockedCopy() {
    method clone (line 123) | clone() {
    method splice (line 130) | splice(n: number, nDelete: number) {
    method deleteAll (line 136) | deleteAll() {
    method byInsertion (line 146) | static byInsertion(
    method newFromSerialized (line 184) | static newFromSerialized(s: string) {
    method filterAndConvertNewlines (line 193) | static filterAndConvertNewlines(s: string) {
    method newFromUnformatted (line 207) | static newFromUnformatted(s: string) {
    method fromExternalCharset (line 216) | static fromExternalCharset(s: string, info: BrowserOSInfo, fallback = ...
    method toExternalCharset (line 226) | static toExternalCharset(s: string, info: BrowserOSInfo, fallback = '?...
    method fromHostCharsetStrict (line 240) | static fromHostCharsetStrict(s: string, brinfo: BrowserOSInfo) {
    method appendSubstring (line 249) | appendSubstring(other: FormattedText, b1: number, b2: number) {
    method len (line 257) | len() {
    method toSerialized (line 269) | toSerialized() {
    method fromSerialized (line 290) | fromSerialized(s: string) {
    method toUnformatted (line 325) | toUnformatted() {
    method toUnformattedSubstr (line 335) | toUnformattedSubstr(from: number, len: number) {
    method throwIfContainsControlCharacters (line 347) | static throwIfContainsControlCharacters(s: string) {

FILE: vipercard/vipercard/src/ui512/drawtext/ui512TranslateCharset.ts
  method _getRomanToUn (line 23) | _getRomanToUn() {
  method _getUnToRoman (line 252) | _getUnToRoman() {
  method translateRomanToUn (line 481) | translateRomanToUn(s: string, fallback = '?') {
  method translateUnToRoman (line 488) | translateUnToRoman(s: string, fallback = '?') {
  method _translate (line 495) | _translate(s: string, map: { [key: number]: string }, fallback: string) {

FILE: vipercard/vipercard/src/ui512/elements/ui512Element.ts
  method setDimensions (line 25) | setDimensions(
  method setDimensionsX1Y1 (line 41) | setDimensionsX1Y1(
  method getFmTxt (line 51) | getFmTxt(): FormattedText {
  method setFmTxt (line 65) | setFmTxt(newTxt: FormattedText, context = ChangeContext.Default) {
  method enabled (line 70) | get enabled() {
  method visible (line 74) | get visible() {
  method x (line 78) | get x() {
  method y (line 82) | get y() {
  method w (line 86) | get w() {
  method h (line 90) | get h() {
  method bottom (line 94) | get bottom() {
  method right (line 98) | get right() {

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementApp.ts
  class UI512Application (line 18) | class UI512Application implements UI512ApplicationInterface {
    method constructor (line 23) | constructor(bounds: number[], observer: ElementObserver = elementObser...
    method getGroup (line 31) | getGroup(id: string) {
    method findGroup (line 38) | findGroup(id: string) {
    method findIndex (line 45) | findIndex(fn: (a: UI512ElGroup) => boolean): number {
    method iterGrps (line 60) | iterGrps() {
    method iterGrpsReversed (line 67) | iterGrpsReversed() {
    method addGroup (line 75) | addGroup(grp: UI512ElGroup, index = -1, context = ChangeContext.Defaul...
    method removeGroup (line 89) | removeGroup(id: string, context = ChangeContext.Default) {
    method coordsToElement (line 97) | coordsToElement(x: number, y: number) {
    method findElAndGroupById (line 129) | findElAndGroupById(elId: O<string>): O<[UI512ElGroup, UI512Element]> {
    method findEl (line 147) | findEl(elId: O<string>) {
    method getEl (line 165) | getEl(elId: string) {
  class GridLayout (line 173) | class GridLayout<RowType, ColType> {
    method constructor (line 174) | constructor(
    method getColWidth (line 188) | getColWidth() {
    method getRowHeight (line 195) | getRowHeight() {
    method getTotalWidth (line 202) | getTotalWidth() {
    method getTotalHeight (line 209) | getTotalHeight() {
    method boundsForNumber (line 216) | boundsForNumber(numX: number, numY: number) {
    method combinations (line 229) | combinations(fn: (n: number, a: ColType, b: RowType, bnds: number[]) =...
    method createElems (line 246) | createElems<T extends UI512Element>(

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementButton.ts
  class UI512ElButton (line 19) | class UI512ElButton extends UI512ElementButtonBase {}
  type UI512BtnStyle (line 24) | enum UI512BtnStyle {

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementCanvasPiece.ts
  class UI512ElCanvasPiece (line 13) | class UI512ElCanvasPiece extends UI512Element {
    method signalChange (line 24) | protected signalChange() {
    method setCanvas (line 32) | setCanvas(cv: CanvasWrapper) {
    method getCanvasForWrite (line 41) | getCanvasForWrite() {
    method getCanvasForRead (line 49) | getCanvasForRead() {
    method getCvWidth (line 56) | getCvWidth() {
    method getCvHeight (line 63) | getCvHeight() {
    method setCachedPainter (line 71) | setCachedPainter(pnter: UI512Painter) {
    method getCachedPainterForWrite (line 81) | getCachedPainterForWrite() {

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementGettable.ts
  type ElementObserverVal (line 12) | type ElementObserverVal = string | boolean | number | FormattedText;
  method getN (line 20) | getN(s: string): number {
  method getS (line 26) | getS(s: string): string {
  method getB (line 32) | getB(s: string): boolean {
  method getGeneric (line 38) | getGeneric(s: string): ElementObserverVal {
  method ui512GettableHas (line 44) | ui512GettableHas(s: string): boolean {
  method lock (line 65) | lock(locked: boolean) {
  method constructor (line 69) | constructor(id: string, observer: ElementObserver = elementObserverDefau...
  method setImplInternal (line 78) | protected setImplInternal(
  method getDirty (line 115) | getDirty() {
  method setDirty (line 119) | setDirty(newVal: boolean, context = ChangeContext.Default) {
  method setImpl (line 131) | protected setImpl(
  method set (line 140) | set(s: string, newVal: ElementObserverVal, context = ChangeContext.Defau...
  method id (line 144) | get id(): string {
  class MakeAccessDifficult (line 152) | class MakeAccessDifficult {}
  class ElementObserverToTwo (line 158) | class ElementObserverToTwo implements ElementObserver {
    method changeSeen (line 161) | changeSeen(
  type ElementObserver (line 175) | interface ElementObserver {
  class ElementObserverNoOp (line 187) | class ElementObserverNoOp implements ElementObserver {
    method changeSeen (line 188) | changeSeen(
  class ElementObserverDefault (line 198) | class ElementObserverDefault implements ElementObserver {
    method changeSeen (line 199) | changeSeen(

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementGroup.ts
  class UI512ElGroup (line 21) | class UI512ElGroup {
    method constructor (line 34) | constructor(id: string, observer: ElementObserver = elementObserverDef...
    method getVisible (line 42) | getVisible() {
    method setVisible (line 49) | setVisible(v: boolean, context = ChangeContext.Default) {
    method updateBoundsBasedOnChildren (line 62) | updateBoundsBasedOnChildren() {
    method getEl (line 95) | getEl(id: string): UI512Element {
    method findEl (line 102) | findEl(id: string): O<UI512Element> {
    method iterEls (line 109) | *iterEls() {
    method iterElsReversed (line 118) | *iterElsReversed() {
    method removeAllEls (line 127) | removeAllEls(context = ChangeContext.Default) {
    method addElementAfter (line 136) | addElementAfter(
    method addElement (line 186) | addElement(
    method removeElement (line 197) | removeElement(id: string, context = ChangeContext.Default): boolean {
    method countElems (line 209) | countElems() {
  type UI512ApplicationInterface (line 217) | interface UI512ApplicationInterface {

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementLabel.ts
  class UI512ElLabel (line 11) | class UI512ElLabel extends UI512ElementWithText {
    method constructor (line 14) | constructor(

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementMenu.ts
  class UI512MenuItem (line 14) | class UI512MenuItem extends UI512Element {
    method constructor (line 21) | constructor(id: string, observer: ElementObserver = elementObserverDef...
  class UI512MenuDropdown (line 29) | class UI512MenuDropdown extends UI512ElementButtonBase {
    method constructor (line 41) | constructor(idString: string, observer: ElementObserver = elementObser...
    method getChildren (line 47) | getChildren(app: UI512Application) {
  class UI512MenuRoot (line 55) | class UI512MenuRoot extends UI512Element {
    method getchildren (line 62) | getchildren(app: UI512Application) {
  function idsToList (line 70) | function idsToList<T extends UI512Element>(

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementTextField.ts
  class UI512ElTextField (line 18) | class UI512ElTextField extends UI512Element {
    method constructor (line 62) | constructor(idString: string, observer: ElementObserver = elementObser...
    method set (line 73) | set(s: string, newVal: ElementObserverVal, context = ChangeContext.Def...
    method setFmTxt (line 98) | setFmTxt(newTxt: FormattedText, context = ChangeContext.Default) {
    method setListChoices (line 109) | static setListChoices(el: UI512ElTextField, choices: string[]) {
    method makeChoiceBox (line 129) | static makeChoiceBox(
  type UI512FldStyle (line 157) | enum UI512FldStyle {

FILE: vipercard/vipercard/src/ui512/elements/ui512ElementView.ts
  class UI512ViewDraw (line 27) | class UI512ViewDraw {
    method getSubRect (line 33) | getSubRect(b: UI512ViewDrawBorders, padX: number, padY: number) {
    method drawFillIfDefined (line 40) | drawFillIfDefined(b: UI512ViewDrawBorders, rect: number[], fillStyle: ...
    method drawInvertIfDefined (line 59) | drawInvertIfDefined(b: UI512ViewDrawBorders, rect: number[]) {
    method drawTextIfDefined (line 77) | drawTextIfDefined(
    method drawTextIfDefinedFromEl (line 105) | drawTextIfDefinedFromEl(
    method drawText (line 124) | drawText(
    method drawIconIfDefined (line 147) | drawIconIfDefined(b: UI512ViewDrawBorders, rect: O<number[]>, iconInfo...
    method renderButtonImpl (line 162) | renderButtonImpl(
    method drawBothTextAndIcon (line 196) | drawBothTextAndIcon(
    method getIconInfo (line 262) | getIconInfo(el: UI512ElementWithHighlight): O<IconInfo> {
    method renderButtonCheckbox (line 285) | renderButtonCheckbox(b: UI512ViewDrawBorders, el: UI512ElementButtonBa...
    method renderOpaqueButton (line 317) | renderOpaqueButton(
    method renderButtonTransparent (line 353) | renderButtonTransparent(b: UI512ViewDrawBorders, el: UI512ElementButto...
    method goUI512ElementButtonBase (line 366) | goUI512ElementButtonBase(b: UI512ViewDrawBorders, el: UI512ElementButt...
    method renderStaticLabelTransparentExceptChars (line 447) | renderStaticLabelTransparentExceptChars(b: UI512ViewDrawBorders, el: U...
    method goUI512ElLabel (line 486) | goUI512ElLabel(b: UI512ViewDrawBorders, el: UI512ElLabel) {
    method goUI512MenuRoot (line 499) | goUI512MenuRoot(b: UI512ViewDrawBorders, el: UI512MenuRoot) {
    method goUI512MenuItem (line 519) | goUI512MenuItem(b: UI512ViewDrawBorders, el: UI512MenuItem) {
    method renderMenuItemDivider (line 530) | renderMenuItemDivider(b: UI512ViewDrawBorders, el: UI512MenuItem) {
    method renderMenuItemText (line 557) | renderMenuItemText(b: UI512ViewDrawBorders, el: UI512MenuItem) {
    method goUI512ElCanvasPiece (line 613) | goUI512ElCanvasPiece(b: UI512ViewDrawBorders, el: UI512ElCanvasPiece) {
    method getBorderAndMarginForField (line 634) | protected getBorderAndMarginForField(
    method getSubRectForField (line 656) | getSubRectForField(
    method goUI512ElTextField (line 674) | protected goUI512ElTextField(
    method renderAllElements (line 700) | renderAllElements(
    method renderElement (line 726) | renderElement(
    method renderApp (line 756) | renderApp(
    method renderBorders (line 790) | renderBorders(canvas: CanvasWrapper, complete: RenderComplete) {
    method renderCurvedCorner (line 867) | renderCurvedCorner(

FILE: vipercard/vipercard/src/ui512/lang/langBase.ts
  function lng (line 13) | function lng(s: string) {

FILE: vipercard/vipercard/src/ui512/menu/ui512Events.ts
  method constructor (line 17) | constructor() {}
  method handled (line 21) | handled() {
  method setHandled (line 25) | setHandled() {
  method getAffectedElements (line 29) | getAffectedElements() {
  method constructor (line 40) | constructor(
  method constructor (line 56) | constructor(
  class MouseMoveEventDetails (line 72) | class MouseMoveEventDetails extends EventDetails {
    method constructor (line 77) | constructor(
    method type (line 87) | type() {
    method getAffectedElements (line 91) | getAffectedElements() {
  class IdleEventDetails (line 107) | class IdleEventDetails extends EventDetails {
    method constructor (line 109) | constructor(public readonly milliseconds: number) {
    method type (line 113) | type() {
  class MouseEnterDetails (line 122) | class MouseEnterDetails extends EventDetails {
    method constructor (line 124) | constructor(public el: UI512Element) {
    method type (line 128) | type() {
    method getAffectedElements (line 132) | getAffectedElements() {
  class MouseLeaveDetails (line 145) | class MouseLeaveDetails extends EventDetails {
    method constructor (line 147) | constructor(public el: UI512Element) {
    method type (line 151) | type() {
    method getAffectedElements (line 155) | getAffectedElements() {
  class MenuItemClickedDetails (line 170) | class MenuItemClickedDetails extends EventDetails {
    method constructor (line 172) | constructor(public readonly id: string, public readonly mods: Modifier...
    method type (line 176) | type() {
  class KeyUpEventDetails (line 184) | class KeyUpEventDetails extends KeyEventDetails {
    method type (line 187) | type() {
  class KeyDownEventDetails (line 195) | class KeyDownEventDetails extends KeyEventDetails {
    method constructor (line 198) | constructor(
    method type (line 209) | type() {
  class MouseUpEventDetails (line 221) | class MouseUpEventDetails extends MouseUpOrDownDetails {
    method type (line 226) | type() {
    method getAffectedElements (line 230) | getAffectedElements() {
  class MouseDownEventDetails (line 248) | class MouseDownEventDetails extends MouseUpOrDownDetails {
    method type (line 251) | type() {
    method getAffectedElements (line 254) | getAffectedElements() {
  class MouseDownDoubleEventDetails (line 268) | class MouseDownDoubleEventDetails extends MouseUpOrDownDetails {
    method type (line 271) | type() {
    method getAffectedElements (line 275) | getAffectedElements() {
  class PasteTextEventDetails (line 288) | class PasteTextEventDetails extends EventDetails implements UI512IsEvent...
    method constructor (line 290) | constructor(
    method type (line 298) | type() {
  class FocusChangedEventDetails (line 306) | class FocusChangedEventDetails extends EventDetails {
    method constructor (line 310) | constructor(public readonly idPrev: O<string>, public readonly idNext:...
    method type (line 314) | type() {

FILE: vipercard/vipercard/src/ui512/menu/ui512MenuAnimation.ts
  class SuspendEventsForMenuBlinkAnimation (line 11) | class SuspendEventsForMenuBlinkAnimation extends TemporarilySuspendEvents {
    method constructor (line 16) | constructor(public item: UI512MenuItem, public callback: () => void) {
    method shouldRestore (line 23) | shouldRestore(ms: number) {
    method goStage (line 40) | goStage() {
    method whenComplete (line 50) | whenComplete() {

FILE: vipercard/vipercard/src/ui512/menu/ui512MenuListeners.ts
  method setwhichIsExpanded (line 23) | setwhichIsExpanded(
  method myAdd (line 43) | myAdd(n1: number, n2: number) {
  method setActiveMenu (line 50) | setActiveMenu(pr: UI512PresenterWithMenuInterface, chosenid: string) {
  method canHighlightMenuItem (line 66) | canHighlightMenuItem(el: UI512Element) {
  method closeAllActiveMenus (line 77) | closeAllActiveMenus(pr: UI512PresenterWithMenuInterface) {
  method isAnyMenuActive (line 85) | isAnyMenuActive(pr: UI512PresenterWithMenuInterface) {
  method respondToMenuItemClick (line 94) | respondToMenuItemClick(
  method onMouseDown (line 119) | onMouseDown(pr: UI512PresenterWithMenuInterface, d: MouseDownEventDetail...
  method onMouseUp (line 137) | onMouseUp(pr: UI512PresenterWithMenuInterface, d: MouseUpEventDetails) {
  method onMouseEnter (line 170) | onMouseEnter(pr: UI512PresenterWithMenuInterface, d: MouseEnterDetails) {
  method onMouseLeave (line 199) | onMouseLeave(pr: UI512PresenterWithMenuInterface, d: MouseLeaveDetails) {

FILE: vipercard/vipercard/src/ui512/menu/ui512MenuPositioning.ts
  type UI512MenuDefn (line 23) | type UI512MenuDefn = [string, string[]] | [string, number, string[]];
  class MenuPositioning (line 29) | class MenuPositioning {
    method createMenuHelperEls (line 33) | static createMenuHelperEls(
    method removeMenuHelperObjects (line 50) | static removeMenuHelperObjects(
    method removeMenuRoot (line 62) | static removeMenuRoot(
    method setMenuItemPositions (line 85) | static setMenuItemPositions(
    method setMenuDropdownPosition (line 142) | static setMenuDropdownPosition(
    method setMenuPositions (line 198) | static setMenuPositions(
    method getWidestString (line 242) | protected static getWidestString(items: UI512MenuItem[]): O<number> {
    method buildFromArray (line 263) | static buildFromArray(pr: UI512PresenterWithMenuInterface, st: UI512Me...
    method buildDropdnFromArray (line 293) | protected static buildDropdnFromArray(
    method getMenuGroups (line 353) | static getMenuGroups(
    method getOrCreateGrp (line 366) | static getOrCreateGrp(app: UI512Application, s: string, createIfNeeded...
    method getMenuRoot (line 381) | static getMenuRoot(app: UI512Application, createIfNeeded = true): UI51...
    method setItemStatus (line 397) | static setItemStatus(

FILE: vipercard/vipercard/src/ui512/menu/ui512PresenterWithMenu.ts
  type UI512PresenterWithMenuInterface (line 15) | interface UI512PresenterWithMenuInterface extends UI512PresenterInterface {

FILE: vipercard/vipercard/src/ui512/menu/ui512SuspendEvents.ts
  method start (line 33) | start(pr: UI512PresenterWithMenuInterface) {
  method pulse (line 43) | pulse(pr: UI512PresenterWithMenuInterface, ms: number) {

FILE: vipercard/vipercard/src/ui512/presentation/ui512Presenter.ts
  method init (line 30) | init() {
  method removeEl (line 38) | removeEl(gpid: string, elId: string, context = ChangeContext.Default) {
  method getStandardWindowBounds (line 54) | getStandardWindowBounds() {
  method rebuildFieldScrollbars (line 62) | rebuildFieldScrollbars() {
  method setPositionsForRender (line 87) | protected setPositionsForRender(cmpTotal: RenderComplete) {

FILE: vipercard/vipercard/src/ui512/presentation/ui512PresenterBase.ts
  method importMouseTracking (line 55) | importMouseTracking(other: UI512PresenterWithMenuInterface) {
  method getCurrentFocus (line 68) | getCurrentFocus() {
  method setCurrentFocus (line 75) | setCurrentFocus(next: O<string>, skipCloseFieldMsg = false) {
  method listenEvent (line 105) | listenEvent(
  method rawEventCanThrow (line 120) | rawEventCanThrow(d: EventDetails) {
  method canInteract (line 153) | canInteract(el: O<UI512Element>) {
  method canSelectTextInField (line 164) | canSelectTextInField(el: UI512ElTextField): boolean {
  method changeSeen (line 172) | changeSeen(context: ChangeContext): void {
  method invalidateAll (line 179) | invalidateAll() {
  method render (line 186) | render(canvas: CanvasWrapper, ms: number, cmpTotal: RenderComplete): boo...
  method placeCallbackInQueue (line 221) | placeCallbackInQueue(cb: () => void) {
  method queueRefreshCursor (line 228) | queueRefreshCursor(): void {}

FILE: vipercard/vipercard/src/ui512/root/rootSetupHelpers.ts
  class RootSetupHelpers (line 16) | class RootSetupHelpers {
    method mainOnResize (line 21) | static mainOnResize(root: RootHigher, gly: any) {
    method useNewResize (line 36) | static useNewResize() {
    method mainOnResizeNew (line 69) | static mainOnResizeNew(root: RootHigher, gly: any): [number, number] {
    method mainOnResizeNewAdvanced (line 90) | static mainOnResizeNewAdvanced(root: RootHigher, gly: any): [number, n...
    method mainOnResizeClassic (line 118) | static mainOnResizeClassic(root: RootHigher, gly: any): [number, numbe...

FILE: vipercard/vipercard/src/ui512/root/rootStartCanvas.ts
  function mainVPCStartCanvas (line 14) | function mainVPCStartCanvas(fnMakeGolly: any) {

FILE: vipercard/vipercard/src/ui512/root/rootUI512.ts
  class FullRootUI512 (line 22) | class FullRootUI512 implements RootHigher {
    method init (line 37) | init(gly: any) {
    method useMinified (line 66) | protected useMinified() {
    method beginDelayLoad (line 76) | protected beginDelayLoad() {
    method invalidateAll (line 103) | invalidateAll() {
    method getDrawText (line 108) | getDrawText() {
    method getDrawIcon (line 112) | getDrawIcon() {
    method getSession (line 116) | getSession() {
    method setSession (line 120) | setSession(ss: O<UI512IsSessionInterface>) {
    method replaceCurrentPresenter (line 126) | replaceCurrentPresenter(newPrIn: any) {
    method sendEvent (line 138) | sendEvent(evt: UI512IsEventInterface) {
    method event (line 144) | event(details: EventDetails, skipScaleMouseClickEvent?: boolean) {
    method rawResize (line 200) | rawResize(width: number, height: number) {
    method sendMissedEvents (line 204) | sendMissedEvents(buttons: number) {
    method drawFrame (line 231) | drawFrame(frameCount: number, milliseconds: number) {
    method setTimerRate (line 260) | setTimerRate(s: string): void {
    method runTests (line 271) | runTests(all: boolean) {
  function adjustMouseCoord (line 280) | function adjustMouseCoord(c: number, scaleMouseCoords: number) {

FILE: vipercard/vipercard/src/ui512/textedit/ui512BasicHandlers.ts
  class BasicHandlers (line 15) | class BasicHandlers {
    method trackMouseStatusMouseDown (line 19) | static trackMouseStatusMouseDown(
    method trackMouseStatusMouseUp (line 33) | static trackMouseStatusMouseUp(
    method trackCurrentElMouseDown (line 50) | static trackCurrentElMouseDown(
    method trackCurrentElMouseUp (line 71) | static trackCurrentElMouseUp(
    method trackCurrentElMouseMove (line 89) | static trackCurrentElMouseMove(
    method trackMouseDoubleDown (line 103) | static trackMouseDoubleDown(
    method trackHighlightedButtonMouseDown (line 113) | static trackHighlightedButtonMouseDown(
    method trackHighlightedButtonMouseUp (line 131) | static trackHighlightedButtonMouseUp(
    method trackHighlightedButtonMouseEnter (line 149) | static trackHighlightedButtonMouseEnter(
    method trackHighlightedButtonMouseLeave (line 167) | static trackHighlightedButtonMouseLeave(
    method trackKeyUp (line 181) | static trackKeyUp(pr: UI512PresenterWithMenuInterface, d: KeyUpEventDe...
    method basicKeyShortcuts (line 188) | static basicKeyShortcuts(
    method showTestImage (line 225) | static showTestImage() {
    method onIdleRunCallbackQueueFromAsyncs (line 243) | static onIdleRunCallbackQueueFromAsyncs(

FILE: vipercard/vipercard/src/ui512/textedit/ui512ClipManager.ts
  class ClipManager (line 19) | class ClipManager implements ClipManagerInterface {
    method constructor (line 24) | constructor() {
    method ensureReadyForPaste (line 32) | ensureReadyForPaste(milliseconds: number) {
    method paste (line 43) | paste(useOSClipboard: boolean) {
    method copy (line 55) | copy(s: string, useOSClipboard: boolean) {
    method goEnsureReadyForPaste (line 76) | goEnsureReadyForPaste() {
    method ensureReadyForPasteImplDoesNotThrow (line 84) | protected static ensureReadyForPasteImplDoesNotThrow(
    method getOrCreateHidden (line 97) | protected getOrCreateHidden() {

FILE: vipercard/vipercard/src/ui512/textedit/ui512GenericField.ts
  type GenericTextField (line 19) | interface GenericTextField {
  class UI512ElTextFieldAsGeneric (line 37) | class UI512ElTextFieldAsGeneric implements GenericTextField {
    method constructor (line 38) | constructor(protected el: UI512ElTextField) {}
    method setFmtTxt (line 39) | setFmtTxt(newTxt: FormattedText, context: ChangeContext) {
    method getFmtTxt (line 43) | getFmtTxt(): FormattedText {
    method canEdit (line 47) | canEdit() {
    method canSelectText (line 51) | canSelectText(): boolean {
    method isMultiline (line 55) | isMultiline(): boolean {
    method setSel (line 59) | setSel(a: number, b: number): void {
    method getSel (line 64) | getSel(): [number, number] {
    method getHeight (line 68) | getHeight(): number {
    method getDefaultFont (line 72) | getDefaultFont(): string {
    method getReadOnlyUI512 (line 76) | getReadOnlyUI512(): UI512ElTextField {
    method getScrollAmt (line 80) | getScrollAmt(): number {
    method setScrollAmt (line 84) | setScrollAmt(n: O<number>): void {

FILE: vipercard/vipercard/src/ui512/textedit/ui512Scrollbar.ts
  class ScrollbarImpl (line 28) | class ScrollbarImpl {
    method gelFromEl (line 32) | protected gelFromEl(el: O<UI512Element>): O<GenericTextField> {
    method buildScrollbar (line 41) | buildScrollbar(app: UI512Application, grp: UI512ElGroup, el: UI512ElTe...
    method removeScrollbar (line 90) | removeScrollbar(app: UI512Application, grp: UI512ElGroup, el: UI512ElT...
    method setPositions (line 102) | setPositions(
    method setPositionsImpl (line 143) | protected setPositionsImpl(
    method getScrollbarPieces (line 235) | protected getScrollbarPieces(
    method removeScrollbarField (line 251) | removeScrollbarField(app: UI512Application, grp: UI512ElGroup, el: UI5...
    method isThereSpaceToShowScrollbar (line 263) | isThereSpaceToShowScrollbar(el: UI512Element) {
    method simulateDrawField (line 271) | protected simulateDrawField(
    method fromMouseCoordsToCaretPosition (line 317) | fromMouseCoordsToCaretPosition(el: UI512ElTextField, x: number, y: num...
    method getCoordToCharInField (line 352) | getCoordToCharInField(
    method getCharacterInFieldToCoords (line 394) | getCharacterInFieldToCoords(el: UI512ElTextField, index: number) {
    method getScrollPosThatWouldMakeStartCaretVisible (line 420) | getScrollPosThatWouldMakeStartCaretVisible(el: UI512ElTextField): O<nu...
    method getCachedHeightOfField (line 467) | getCachedHeightOfField(el: UI512ElTextField) {
    method repositionScrollbarGetThumbPos (line 492) | repositionScrollbarGetThumbPos(el: UI512ElTextField) {
    method onScrollArrowClicked (line 511) | onScrollArrowClicked(
    method getApproxLineHeight (line 543) | getApproxLineHeight(el: UI512ElTextField, index: number) {
  function fldIdToScrollbarPartId (line 570) | function fldIdToScrollbarPartId(elId: string, partName: string) {
  function scrollbarPartIdToFldId (line 577) | function scrollbarPartIdToFldId(s: string) {
  function getAmountIfScrollArrowClicked (line 587) | function getAmountIfScrollArrowClicked(elId: string) {

FILE: vipercard/vipercard/src/ui512/textedit/ui512TextEvents.ts
  class UI512TextEvents (line 25) | class UI512TextEvents {
    method gelFromEl (line 33) | protected gelFromEl(el: O<UI512ElTextField>): O<GenericTextField> {
    method getScrollbarImpl (line 41) | protected getScrollbarImpl() {
    method onMouseDownScroll (line 48) | onMouseDownScroll(pr: UI512PresenterWithMenuInterface, d: MouseDownEve...
    method onMouseDownSelect (line 61) | onMouseDownSelect(pr: UI512PresenterWithMenuInterface, d: MouseDownEve...
    method onMouseMoveSelect (line 98) | onMouseMoveSelect(pr: UI512PresenterWithMenuInterface, d: MouseMoveEve...
    method onMouseMoveSetTextEditCursor (line 128) | onMouseMoveSetTextEditCursor(
    method onMouseDoubleDown (line 148) | onMouseDoubleDown(
    method onMouseUp (line 173) | onMouseUp(pr: UI512PresenterWithMenuInterface, d: MouseUpEventDetails) {
    method onKeyDown (line 180) | onKeyDown(pr: UI512PresenterWithMenuInterface, d: KeyDownEventDetails) {
    method keyDownProbablyCausesTextChange (line 349) | static keyDownProbablyCausesTextChange(d: KeyDownEventDetails) {
    method onPasteText (line 380) | onPasteText(pr: UI512PresenterWithMenuInterface, d: PasteTextEventDeta...
    method sendCutOrCopy (line 396) | sendCutOrCopy(
    method onBlinkCaret (line 428) | protected onBlinkCaret(pr: UI512PresenterWithMenuInterface, d: IdleEve...
    method onIdle (line 446) | onIdle(pr: UI512PresenterWithMenuInterface, d: IdleEventDetails) {
  function addDefaultListeners (line 479) | function addDefaultListeners(listeners: { [t: number]: FnEventCallback[]...

FILE: vipercard/vipercard/src/ui512/textedit/ui512TextLines.ts
  class UI512Lines (line 20) | class UI512Lines {
    method constructor (line 22) | constructor(txt: FormattedText) {
    method flatten (line 38) | flatten() {
    method indexToLineNumber (line 50) | indexToLineNumber(n: number) {
    method lineNumberToIndex (line 68) | lineNumberToIndex(lineNum: number) {
    method lineNumberToLineEndIndex (line 82) | lineNumberToLineEndIndex(lineNum: number) {
    method fastLineNumberToIndex (line 98) | static fastLineNumberToIndex(txt: FormattedText, lineNum: number) {
    method fastLineNumberAndEndToIndex (line 116) | static fastLineNumberAndEndToIndex(txt: FormattedText, lineNum: number) {
    method length (line 131) | length() {
    method getLineUnformatted (line 143) | getLineUnformatted(linenum: number) {
    method alterSelectedLines (line 151) | static alterSelectedLines(
    method getNonSpaceStartOfLine (line 173) | static getNonSpaceStartOfLine(txt: FormattedText, okToExceedLength: bo...
    method getIndentLevel (line 191) | static getIndentLevel(txt: FormattedText) {

FILE: vipercard/vipercard/src/ui512/textedit/ui512TextSelModify.ts
  class TextSelModify (line 22) | class TextSelModify {
    method getSelectedField (line 28) | static getSelectedField(pr: UI512PresenterWithMenuInterface): O<UI512E...
    method changeTextInField (line 48) | protected static changeTextInField(
    method changeSelInField (line 89) | protected static changeSelInField(
    method fixSelection (line 113) | static fixSelection(el: GenericTextField) {
    method changeSelSelectAll (line 123) | static changeSelSelectAll(el: GenericTextField) {
    method changeTextBackspace (line 130) | static changeTextBackspace(
    method changeTextDuplicate (line 143) | static changeTextDuplicate(el: GenericTextField) {
    method changeTextDeleteLine (line 154) | static changeTextDeleteLine(el: GenericTextField) {
    method changeTextIndentation (line 163) | static changeTextIndentation(el: GenericTextField, isLeft: boolean) {
    method changeTextToggleLinePrefix (line 179) | static changeTextToggleLinePrefix(el: GenericTextField, prefix: string) {
    method changeTextToggleBlockComment (line 194) | static changeTextToggleBlockComment(
    method changeTextInsert (line 214) | static changeTextInsert(el: GenericTextField, s: string) {
    method changeSelLeftRight (line 227) | static changeSelLeftRight(
    method changeSelCurrentWord (line 248) | static changeSelCurrentWord(el: GenericTextField) {
    method changeSelGoLineHomeEnd (line 257) | static changeSelGoLineHomeEnd(
    method changeSelGoDocHomeEnd (line 270) | static changeSelGoDocHomeEnd(
    method changeSelPageUpDown (line 283) | static changeSelPageUpDown(el: GenericTextField, isUp: boolean, isExte...
    method mouseClickCoordsToSetCaret (line 302) | static mouseClickCoordsToSetCaret(
    method mouseClickCoordsAdjustSelection (line 329) | static mouseClickCoordsAdjustSelection(el: GenericTextField, x: number...
    method mouseClickSelectByLines (line 347) | static mouseClickSelectByLines(el: GenericTextField, x: number, y: num...
    method selectLineInField (line 374) | static selectLineInField(el: GenericTextField, n: number) {
    method selectByLinesWhichLine (line 389) | static selectByLinesWhichLine(el: GenericTextField) {
    method changeSelArrowKeyUpDownVisual (line 415) | static changeSelArrowKeyUpDownVisual(
    method getSelectedText (line 453) | static getSelectedText(el: GenericTextField) {
    method getSelectedTextBounds (line 467) | static getSelectedTextBounds(el: GenericTextField): O<[number, number]> {

FILE: vipercard/vipercard/src/ui512/textedit/ui512TextSelModifyImpl.ts
  class TextSelModifyImpl (line 28) | class TextSelModifyImpl {
    method changeSelSelectAll (line 33) | static changeSelSelectAll(
    method changeSelGoDocHomeEnd (line 46) | static changeSelGoDocHomeEnd(
    method changeSelGoLineHomeEnd (line 62) | static changeSelGoLineHomeEnd(
    method changeSelLeftRight (line 91) | static changeSelLeftRight(
    method changeSelCurrentWord (line 113) | static changeSelCurrentWord(
    method changeTextInsert (line 130) | static changeTextInsert(
    method changeTextDeleteSelection (line 156) | static changeTextDeleteSelection(
    method changeTextBackspace (line 170) | static changeTextBackspace(
    method changeTextDuplicate (line 199) | static changeTextDuplicate(
    method changeTextDeleteLine (line 231) | static changeTextDeleteLine(
    method setIndentLevel (line 258) | static setIndentLevel(
    method changeTextIndentation (line 279) | static changeTextIndentation(
    method changeTextToggleLinePrefix (line 312) | static changeTextToggleLinePrefix(
    method changeTextToggleBlockComment (line 360) | static changeTextToggleBlockComment(
    method getLeftRight (line 400) | static getLeftRight(

FILE: vipercard/vipercard/src/ui512/utils/util512.ts
  method isValidNumber (line 15) | isValidNumber(value: unknown) {
  method range (line 22) | range(start: number, end: O<number>, inc = 1) {
  method repeat (line 43) | repeat<T>(amount: number, item: T) {
  method setarr (line 55) | setarr<T>(ar: O<T>[], index: number, val: T, fill: T) {
  method extendArray (line 70) | extendArray<T>(ar: T[], added: T[]) {
  method parseIntStrict (line 79) | parseIntStrict(s: O<string>): O<number> {
  method parseInt (line 95) | parseInt(s: O<string>): O<number> {
  method truncateWithEllipsis (line 111) | truncateWithEllipsis(s: string, maxLen: number) {
  method unused (line 127) | unused(...args: unknown[]) {}
  method add (line 132) | add(n1: number, n2: number) {
  method isMapEmpty (line 139) | isMapEmpty<U>(map: { [key: string]: U }) {
  method shallowClone (line 152) | shallowClone<T extends object>(o: object): T {
  method freezeProperty (line 159) | freezeProperty(o: object, propName: string) {
  method freezeRecurse (line 168) | freezeRecurse(o: object) {
  method escapeForRegex (line 186) | escapeForRegex(s: string) {
  method capitalizeFirst (line 193) | capitalizeFirst(s: string) {
  method callAsMethodOnClass (line 210) | callAsMethodOnClass(
  method isMethodOnClass (line 249) | isMethodOnClass(me: object, s: string) {
  method getMapKeys (line 256) | getMapKeys(map: object): string[] {
  method getMapVals (line 270) | getMapVals<T>(map: { [key: string]: T }): T[] {
  method padStart (line 285) | padStart(sIn: string | number, targetLength: number, padString: string) {
  method arrayToBase64 (line 304) | arrayToBase64(b: number[] | Uint8Array) {
  method toBase64UrlSafe (line 317) | toBase64UrlSafe(s: string) {
  method fromBase64UrlSafe (line 325) | fromBase64UrlSafe(s: string) {
  method stringToCharArray (line 336) | stringToCharArray(s: string) {
  method stringToByteArray (line 349) | stringToByteArray(s: string) {
  method sortStringArray (line 364) | sortStringArray(arr: string[]) {
  method sortDecorated (line 374) | sortDecorated<T>(ar: T[], fn: (a: T) => unknown): T[] {
  method normalizeNewlines (line 386) | normalizeNewlines(s: string) {
  method keepOnlyUnique (line 393) | keepOnlyUnique(ar: string[]) {
  method constructor (line 412) | constructor(vals: T[] = []) {
  method lock (line 415) | lock() {
  method push (line 418) | push(v: T) {
  method set (line 422) | set(i: number, v: T) {
  method len (line 426) | len() {
  method at (line 429) | at(i: number) {
  method getUnlockedCopy (line 432) | getUnlockedCopy() {
  class ValHolder (line 491) | class ValHolder<T> {
    method constructor (line 492) | constructor(public val: T) {}
  type AnyJsonInner (line 498) | type AnyJsonInner =
  type AnyJson (line 509) | type AnyJson = { [property: string]: AnyJsonInner } | AnyJsonInner[];
  type AnyUnshapedJson (line 510) | type AnyUnshapedJson = any;
  type NoParameterCtor (line 511) | type NoParameterCtor<T> = { new (): T };
  type AnyParameterCtor (line 512) | type AnyParameterCtor<T> = { new (...args: unknown[]): T };
  type TypeLikeAnEnum (line 517) | type TypeLikeAnEnum<E> = Record<keyof E, number | string> & {
  function listEnumValsIncludingAlternates (line 524) | function listEnumValsIncludingAlternates<T>(Enm: T) {
  function listEnumVals (line 547) | function listEnumVals<T>(Enm: T, makeLowercase: boolean) {
  function findStrToEnum (line 568) | function findStrToEnum<T>(Enm: any, s: string): O<T> {
  function getStrToEnum (line 596) | function getStrToEnum<T>(Enm: any, msgContext: string, s: string): T {
  function findEnumToStr (line 617) | function findEnumToStr<E>(Enm: TypeLikeAnEnum<E>, n: number): O<string> {
  function getEnumToStrOrFallback (line 643) | function getEnumToStrOrFallback<E>(
  function slength (line 654) | function slength(s: string | null | undefined) {
  function cast (line 670) | function cast<T>(
  function castVerifyIsNum (line 685) | function castVerifyIsNum(instance: unknown, context?: string): number {
  function castVerifyIsStr (line 696) | function castVerifyIsStr(instance: unknown, context?: string): string {
  function fitIntoInclusive (line 707) | function fitIntoInclusive(n: number, min: number, max: number) {
  function util512Sort (line 719) | function util512Sort(a: unknown, b: unknown, silent?: boolean): number {
  class OrderedHash (line 758) | class OrderedHash<TValue> {
    method deleteAll (line 762) | deleteAll() {
    method insertNew (line 767) | insertNew(k: string, v: TValue) {
    method insertAt (line 775) | insertAt(k: string, v: TValue, n: number) {
    method getIndex (line 783) | getIndex(k: string) {
    method atIndex (line 789) | atIndex(n: number): O<TValue> {
    method find (line 797) | find(k: string): O<TValue> {
    method get (line 801) | get(k: string): TValue {
    method delete (line 805) | delete(k: string): boolean {
    method length (line 817) | length() {
    method iterKeys (line 821) | *iterKeys() {
    method iter (line 827) | *iter() {
    method iterReversed (line 834) | *iterReversed() {
  function orderedHashSummary (line 844) | function orderedHashSummary<T>(hash: OrderedHash<T>) {
  class MapKeyToObject (line 859) | class MapKeyToObject<T> {
    method exists (line 861) | exists(key: string) {
    method get (line 865) | get(key: string) {
    method getOrFallback (line 869) | getOrFallback(key: string, fallback: T) {
    method find (line 874) | find(key: O<string>): O<T> {
    method add (line 882) | add(key: string, obj: T) {
    method freeze (line 892) | freeze() {
    method remove (line 896) | remove(key: string) {
    method getVals (line 900) | getVals(): T[] {
    method getKeys (line 904) | getKeys(): string[] {
  class MapKeyToObjectCanSet (line 912) | class MapKeyToObjectCanSet<T> extends MapKeyToObject<T> {
    method set (line 913) | set(key: string, obj: T) {
  function assertEq (line 923) | function assertEq<T>(
  function assertWarnEq (line 939) | function assertWarnEq(
  function checkThrowEq512 (line 955) | function checkThrowEq512<T>(
  function arLast (line 971) | function arLast<T>(ar: T[]): T {
  function lastIfThere (line 979) | function lastIfThere<T>(ar: T[]): O<T> {
  function longstr (line 986) | function longstr(s: string, newlinesBecome = ' ') {

FILE: vipercard/vipercard/src/ui512/utils/util512Assert.ts
  class Util512BaseErr (line 43) | class Util512BaseErr {
    method constructor (line 45) | protected constructor(public message: string, public level: string) {}
    method errIfExactCls (line 53) | static errIfExactCls<T extends Util512BaseErr>(nm: string, e: Error): ...
    method clsAsErr (line 64) | clsAsErr() {
    method addErr (line 74) | addErr(e: Error) {
    method createErrorImpl (line 86) | static createErrorImpl<T extends Util512BaseErr>(
    method gen (line 106) | protected static gen(message: string, level: string) {
    method createError (line 113) | static createError(...params: unknown[]) {
  class Util512Warn (line 122) | class Util512Warn extends Util512BaseErr {
    method gen (line 124) | protected static gen(message: string, level: string) {
    method createError (line 127) | static createError(...params: unknown[]) {
  class Util512Message (line 135) | class Util512Message extends Util512BaseErr {
    method gen (line 137) | protected static gen(message: string, level: string) {
    method createError (line 140) | static createError(...params: unknown[]) {
  function makeUtil512BaseErrGeneric (line 148) | function makeUtil512BaseErrGeneric(
  function make512Error (line 162) | function make512Error(msg: string, s1?: unknown, s2?: unknown, s3?: unkn...
  function assertTrue (line 169) | function assertTrue(
  function assertWarn (line 190) | function assertWarn(condition: unknown, s1: string, s2?: unknown, s3?: u...
  function checkThrow512 (line 226) | function checkThrow512(
  class UI512ErrorHandling (line 242) | class UI512ErrorHandling {
    method encodeErrMsg (line 254) | protected static encodeErrMsg(s: string) {
    method decodeErrMsg (line 259) | protected static decodeErrMsg(compressed: string) {
    method appendErrMsgToLogs (line 264) | static appendErrMsgToLogs(severity: boolean, s: string) {
    method getLatestErrLogs (line 274) | static getLatestErrLogs(amount: number): string[] {
  function respondUI512Error (line 287) | function respondUI512Error(e: Error, context: string, logOnly = false) {
  function joinIntoMessage (line 360) | function joinIntoMessage(
  function findMarkers (line 386) | function findMarkers(s: unknown, markers: string[]): O<string> {
  function ensureDefined (line 400) | function ensureDefined<T>(

FILE: vipercard/vipercard/src/ui512/utils/util512Base.ts
  function bool (line 10) | function bool(x: unknown): boolean {
  function trueIfDefinedAndNotNull (line 18) | function trueIfDefinedAndNotNull<T>(x: O<T>): x is T {
  function tostring (line 27) | function tostring(s: unknown): string {
  function coalesceIfFalseLike (line 35) | function coalesceIfFalseLike<T>(instance: T | null | undefined, defaultv...
  function checkIsProductionBuild (line 48) | function checkIsProductionBuild(): boolean {
  function callDebuggerIfNotInProduction (line 67) | function callDebuggerIfNotInProduction(context?: string) {
  method constructor (line 78) | constructor(protected size: number) {}
  method append (line 83) | append(s: string) {
  method retrieve (line 93) | retrieve(howMany: number) {
  method mod (line 108) | mod(a: number, n: number) {
  class RingBufferLocalStorage (line 122) | class RingBufferLocalStorage extends RingBuffer {
    method getAt (line 123) | getAt(index: number): string {
    method setAt (line 131) | setAt(index: number, s: string) {
    method getLatestIndex (line 137) | getLatestIndex() {
    method setLatestIndex (line 150) | setLatestIndex(index: number) {
  type O (line 170) | type O<T> = T | undefined;
  class UI512Compress (line 176) | class UI512Compress {
    method compressString (line 180) | static compressString(s: string): string {
    method decompressString (line 185) | static decompressString(s: string): string {

FILE: vipercard/vipercard/src/ui512/utils/util512Higher.ts
  class Util512Higher (line 14) | class Util512Higher {
    method weakUuid (line 19) | static weakUuid() {
    method getRandIntInclusiveWeak (line 32) | static getRandIntInclusiveWeak(min: number, max: number) {
    method getRandIntInclusiveStrong (line 46) | static getRandIntInclusiveStrong(min: number, max: number) {
    method makeCryptRandString (line 77) | static makeCryptRandString(bytes: number) {
    method generateUniqueBase64UrlSafe (line 86) | static generateUniqueBase64UrlSafe(nBytes: number, charPrefix: string) {
    method beginLoadImage (line 100) | static beginLoadImage(url: string, img: HTMLImageElement, callback: ()...
    method loadJsonImpl (line 133) | private static loadJsonImpl(
    method asyncLoadJsonString (line 165) | static asyncLoadJsonString(url: string): Promise<string> {
    method asyncLoadJson (line 184) | static async asyncLoadJson(url: string): Promise<AnyUnshapedJson> {
    method asyncLoadJsIfNotAlreadyLoaded (line 193) | static asyncLoadJsIfNotAlreadyLoaded(url: string): Promise<void> {
    method syncToAsyncTransition (line 237) | static syncToAsyncTransition<T>(
    method syncToAsyncAfterPause (line 255) | static syncToAsyncAfterPause<T>(
    method sleep (line 272) | static sleep(ms: number) {
    method runAsyncWithTimeout (line 287) | static async runAsyncWithTimeout<T>(fn: Promise<T>, ms: number): Promi...
    method runAsyncWithMinimumTime (line 306) | static async runAsyncWithMinimumTime<T>(fn: Promise<T>, ms: number): P...
    method getdatestring (line 319) | static getdatestring(includeSeconds = false) {
  type RespondToErr (line 342) | enum RespondToErr {
  function showMsgIfExceptionThrown (line 351) | function showMsgIfExceptionThrown(fn: () => void, context: string) {
  function justConsoleMsgIfExceptionThrown (line 364) | function justConsoleMsgIfExceptionThrown(fn: () => void, context: string) {
  type VoidFn (line 377) | type VoidFn = () => void;
  type AsyncVoidFn (line 378) | type AsyncVoidFn = () => Promise<void>;
  type AsyncFn (line 379) | type AsyncFn = () => Promise<unknown>;
  function SetToInvalidObjectAtEndOfExecution (line 384) | function SetToInvalidObjectAtEndOfExecution<T>(_useToGetType: T): T {
  type UI512IsDrawTextInterface (line 391) | interface UI512IsDrawTextInterface {}
  type UI512IsDrawIconInterface (line 392) | interface UI512IsDrawIconInterface {}
  type UI512IsSessionInterface (line 393) | interface UI512IsSessionInterface {}
  type UI512IsPresenterInterface (line 394) | interface UI512IsPresenterInterface {}
  type UI512IsEventInterface (line 395) | interface UI512IsEventInterface {}
  type Root (line 396) | interface Root {
  function getRoot (line 412) | function getRoot(): Root {
  function setRoot (line 420) | function setRoot(r: Root) {
  type BrowserOSInfo (line 427) | enum BrowserOSInfo {
  class BrowserInfo (line 438) | class BrowserInfo {
    method get (line 444) | static get() {
    method constructor (line 455) | constructor(nav?: string) {
  class RepeatingManualTimer (line 478) | class RepeatingManualTimer {
    method constructor (line 482) | constructor(periodInMilliseconds: number) {
    method update (line 486) | update(ms: number) {
    method isDue (line 490) | isDue(): boolean {
    method reset (line 494) | reset() {
  class RenderComplete (line 502) | class RenderComplete {
    method and (line 504) | and(other: RenderComplete) {
    method andB (line 508) | andB(other: boolean) {
  class RepeatingTimer (line 516) | class RepeatingTimer {
    method constructor (line 520) | constructor(periodInMilliseconds: number) {
    method update (line 524) | update(ms: number) {
    method isDue (line 528) | isDue(): boolean {
    method reset (line 532) | reset() {
  type CharClass (line 548) | enum CharClass {
  class GetCharClass (line 559) | class GetCharClass {
    method get (line 577) | static get(c: number) {
    method getLeftRight (line 613) | static getLeftRight(

FILE: vipercard/vipercard/src/ui512/utils/util512Serialize.ts
  method serializeObj (line 19) | serializeObj<T extends IsUtil512Serializable>(obj: T) {
  method serializeToJson (line 52) | serializeToJson<T extends IsUtil512Serializable>(obj: T) {
  method deserializeObj (line 60) | deserializeObj<T extends IsUtil512Serializable>(
  method deserializeObjLoose (line 113) | deserializeObjLoose<T extends IsUtil512Serializable>(
  method deserializeFromJson (line 137) | deserializeFromJson<T extends IsUtil512Serializable>(
  method isAPropertyOnAllObjects (line 149) | isAPropertyOnAllObjects(prop: string) {
  method shouldSerializeProperty (line 156) | shouldSerializeProperty(obj: { [key: string]: any }, prop: string) {
  method getClone (line 174) | static getClone<T extends object>(me: IsUtil512Serializable): T {
  method getKeys (line 181) | static getKeys(me: IsUtil512Serializable) {

FILE: vipercard/vipercard/src/ui512/utils/utilsCanvasDraw.ts
  class CanvasWrapper (line 12) | class CanvasWrapper {
    method constructor (line 15) | constructor(canvas: O<HTMLCanvasElement>) {
    method createMemoryCanvas (line 35) | static createMemoryCanvas(width: number, height: number) {
    method fillPixelUnchecked (line 47) | fillPixelUnchecked(x: number, y: number, fillStyle: string) {
    method fillPixel (line 54) | fillPixel(
    method fillRectUnchecked (line 77) | fillRectUnchecked(
    method fillRect (line 111) | fillRect(
    method outlineRect (line 156) | outlineRect(
    method invertColorsRectUnchecked (line 177) | protected invertColorsRectUnchecked(
    method invertColorsRect (line 208) | invertColorsRect(
    method drawFromImageUnchecked (line 251) | protected drawFromImageUnchecked(
    method drawFromImage (line 294) | drawFromImage(
    method drawFromImageCentered (line 338) | drawFromImageCentered(
    method temporarilyChangeCompositeMode (line 372) | temporarilyChangeCompositeMode(s: string, fn: () => void) {
    method clear (line 384) | clear() {
    method resizeAndClear (line 392) | resizeAndClear(newWidth: number, newHeight: number) {
    method resetTransform (line 402) | resetTransform() {
    method setDebugRenderingWithChangingColors (line 412) | static setDebugRenderingWithChangingColors(b: boolean) {
  class RectUtils (line 420) | class RectUtils {
    method getRectClipped (line 424) | static getRectClipped(
    method getOverlap (line 485) | static getOverlap(
    method hasPoint (line 517) | static hasPoint(
    method getSubRectRaw (line 531) | static getSubRectRaw(
  type DrawableImage (line 551) | type DrawableImage = HTMLCanvasElement | HTMLImageElement;
  type RectOverlapType (line 556) | enum RectOverlapType {

FILE: vipercard/vipercard/src/ui512/utils/utilsCursors.ts
  type UI512Cursors (line 74) | enum UI512Cursors {
  type Constants (line 213) | const enum Constants {
  class UI512CursorAccess (line 224) | class UI512CursorAccess {
    method getCursor (line 240) | static getCursor(): UI512Cursors {
    method setCursor (line 247) | static setCursor(nextCursor: UI512Cursors, always = false) {
    method setCursorSupportRotate (line 284) | static setCursorSupportRotate(nextCursor: UI512Cursors) {
    method notifyScreenMult (line 306) | static notifyScreenMult(mult: number) {
    method onmousemove (line 319) | static onmousemove(x: number, y: number) {
    method suggestPreloadCursors (line 327) | static suggestPreloadCursors() {
    method drawFinalWithCursor (line 348) | static drawFinalWithCursor(

FILE: vipercard/vipercard/src/ui512/utils/utilsDrawConstants.ts
  type MenuConsts (line 7) | enum MenuConsts {
  type ScrollConsts (line 22) | enum ScrollConsts {
  type ScreenConsts (line 34) | enum ScreenConsts {
  function getUI512WindowBounds (line 52) | function getUI512WindowBounds() {

FILE: vipercard/vipercard/src/ui512/utils/utilsKeypressHelpers.ts
  type ModifierKeys (line 10) | enum ModifierKeys {
  function ui512TranslateModifiers (line 20) | function ui512TranslateModifiers(
  function toShortcutString (line 57) | function toShortcutString(mods: ModifierKeys, code: string) {

FILE: vipercard/vipercard/src/vpc/codeexec/vpcScriptCaches.ts
  class VpcCacheParsedCST (line 28) | class VpcCacheParsedCST {
    method constructor (line 32) | constructor() {
    method getParsedLine (line 39) | getParsedLine(ln: VpcCodeLine) {
    method callParser (line 65) | protected callParser(ln: VpcCodeLine, firstRule: ChvRuleFnType) {
  class VpcCacheParsedAST (line 102) | class VpcCacheParsedAST {
    method constructor (line 104) | constructor(public idGen: CountNumericId) {}
    method getParsedCodeCollectionOrThrow (line 110) | protected getParsedCodeCollectionOrThrow(code: string, velIdForErrMsg:...
    method getHandlerOrThrow (line 139) | getHandlerOrThrow(

FILE: vipercard/vipercard/src/vpc/codeexec/vpcScriptExecAsync.ts
  class VpcScriptExecAsync (line 36) | class VpcScriptExecAsync {
    method goAsyncWait (line 41) | static goAsyncWait(
    method goAsyncDial (line 64) | static goAsyncDial(
    method goAsyncAnswer (line 82) | static goAsyncAnswer(
    method goAsyncAsk (line 128) | static goAsyncAsk(
  class VpcPendingAsyncOps (line 171) | class VpcPendingAsyncOps {
    method markCompleted (line 178) | markCompleted(asyncId: string, data: any) {
    method go (line 187) | go(asyncId: string, op: () => void, isblocked: ValHolder<AsyncCodeOpSt...
  type FnAnswerMsgCallback (line 209) | type FnAnswerMsgCallback = (
  type FnAskMsgCallback (line 218) | type FnAskMsgCallback = (prompt: string, deftxt: string, fnOnResult: (re...
  type AsyncCodeOpState (line 221) | enum AsyncCodeOpState {

FILE: vipercard/vipercard/src/vpc/codeexec/vpcScriptExecFrame.ts
  class VpcExecFrame (line 36) | class VpcExecFrame {
    method constructor (line 44) | constructor(
    method getOffset (line 65) | getOffset() {
    method next (line 72) | next() {
    method jumpToOffset (line 84) | jumpToOffset(newOffset: number, okToStartHandler?: boolean) {
    method getMessageChain (line 124) | static getMessageChain(velId: string, statedParent: O<string>, outside...

FILE: vipercard/vipercard/src/vpc/codeexec/vpcScriptExecFrameStack.ts
  class VpcExecFrameStack (line 57) | class VpcExecFrameStack {
    method constructor (line 60) | constructor(
    method getAndRunHandlerOrThrow (line 88) | getAndRunHandlerOrThrow() {
    method startHandlerMsgBox (line 112) | startHandlerMsgBox(obj: VpcScriptMessageMsgBoxCode) {
    method pushStackFrame (line 136) | protected pushStackFrame(
    method validatedGoto (line 157) | protected validatedGoto(frame: VpcExecFrame, ref: VpcCodeLineReference...
    method runTimesliceOrThrow (line 166) | runTimesliceOrThrow(ms: number) {
    method runOneLineOrThrow (line 211) | protected runOneLineOrThrow(blocked: ValHolder<AsyncCodeOpState>): boo...
    method runOneLineOrThrowImpl (line 238) | protected runOneLineOrThrowImpl(curFrame: VpcExecFrame, curLine: VpcCo...
    method evalRequestedExpression (line 260) | protected evalRequestedExpression(parsed: VpcParsed, curLine: VpcCodeL...
    method evalGeneralVisit (line 280) | protected evalGeneralVisit(parsed: VpcParsed, curLine: VpcCodeLine, ok...
    method getHandlerUpwardsOrThrow (line 299) | getHandlerUpwardsOrThrow(velIdStart: string, chain: string[], handlern...
    method getHandlerUpwardsOrThrowImpl (line 319) | getHandlerUpwardsOrThrowImpl(
    method visitStatement (line 350) | visitStatement(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: V...
    method visitDeclareGlobal (line 374) | visitDeclareGlobal(curFrame: VpcExecFrame, curLine: VpcCodeLine, parse...
    method visitHandlerStart (line 391) | visitHandlerStart(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed...
    method visitHandlerEnd (line 409) | visitHandlerEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: ...
    method visitProductExit (line 416) | visitProductExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method visitHandlerExit (line 425) | visitHandlerExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method visitHandlerPass (line 433) | visitHandlerPass(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method visitReturnExpr (line 455) | visitReturnExpr(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: ...
    method getBlockInfo (line 470) | protected getBlockInfo(curLine: VpcCodeLine, nAtLeast: number): VpcCod...
    method visitIfStart (line 481) | visitIfStart(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: Vpc...
    method visitIfElsePlain (line 511) | visitIfElsePlain(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method visitIfEnd (line 528) | visitIfEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: VpcPa...
    method visitRepeatExit (line 535) | visitRepeatExit(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: ...
    method visitRepeatEnd (line 545) | visitRepeatEnd(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: V...
    method visitRepeatNext (line 554) | visitRepeatNext(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed: ...
    method visitRepeatForever (line 561) | visitRepeatForever(curFrame: VpcExecFrame, curLine: VpcCodeLine, parse...
    method visitCallHandler (line 568) | visitCallHandler(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method callHandlerAndThrowIfNotExist (line 581) | protected callHandlerAndThrowIfNotExist(curFrame: VpcExecFrame, curLin...
    method visitSendStatement (line 621) | protected visitSendStatement(curLine: VpcCodeLine, parsed: VpcParsed):...
    method visitCallDynamic (line 651) | visitCallDynamic(curFrame: VpcExecFrame, curLine: VpcCodeLine, parsed:...
    method visitCallDynamicHelper (line 688) | visi
Copy disabled (too large) Download .json
Condensed preview — 821 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,718K chars).
[
  {
    "path": "README.md",
    "chars": 1183,
    "preview": "ViperCard is an open source rewrite of 1987's HyperCard.\n\nYou can use it to make animations, games, and interactive art!"
  },
  {
    "path": "vipercard/.gitignore",
    "chars": 610,
    "preview": "\n\n# python\n\n*.pyc\n__pycache__/\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for inst"
  },
  {
    "path": "vipercard/LICENSE",
    "chars": 35682,
    "preview": "The following files are released under the MIT License:\nCopyright 2019 moltenform (Ben Fisher)\n  src/ui512/utils/util512"
  },
  {
    "path": "vipercard/building.md",
    "chars": 823,
    "preview": "\n### How to build ViperCard:\n\n- install node.js\n\n- download vipercard source\n\n- cd to `vipercard/vipercard`\n\n- run `npm "
  },
  {
    "path": "vipercard/doc/gendocs.py",
    "chars": 2146,
    "preview": "\n\n# gendocs.py\n# Ben Fisher, 2017\n\nimport re\nimport json\nimport sys\nfrom collections import OrderedDict\nimport enum\n\n# i"
  },
  {
    "path": "vipercard/doc/gendocs_to_md.py",
    "chars": 12202,
    "preview": "\nfrom gendocs import *\nimport os\n\ndef addFormattingMarkdown(s):\n    # first, escape characters that happen to be markdow"
  },
  {
    "path": "vipercard/doc/gendocs_tovipercard.py",
    "chars": 2951,
    "preview": "\nfrom gendocs import *\nspecialCharFontChange = \"\\x02\"\nchangeFontTitle = f'{specialCharFontChange}times_24_biuosdce{speci"
  },
  {
    "path": "vipercard/doc/libraries.txt",
    "chars": 1346,
    "preview": "\nUses:\nchevrotain\n    https://github.com/SAP/chevrotain\n    Shahar Soel, Apache-2.0\n\nFileSaver.js\n    https://github.com"
  },
  {
    "path": "vipercard/doc/page_404.md",
    "chars": 135,
    "preview": "\nThe requested page was not found.\n\n<a href=\"/\"><img border=\"0\" src=\"/resources03a/intro/err/back.png\"  alt=\"Back to Vip"
  },
  {
    "path": "vipercard/doc/page_terms.md",
    "chars": 13546,
    "preview": "\n#### Terms and Content Policies\n\nThe following terms and conditions govern all use of the *ViperCard* website and all c"
  },
  {
    "path": "vipercard/doc/page_video.md",
    "chars": 471,
    "preview": "<iframe width=\"450\" height=\"240\" src=\"https://www.youtube.com/embed/9Jyh-EXsH4w?rel=0&autoplay=1\" style=\"border:0px\" all"
  },
  {
    "path": "vipercard/doc/page_video1.md",
    "chars": 231,
    "preview": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/gF4KI_4mFY0?rel=0&autoplay=1\" style=\"border:0px\" all"
  },
  {
    "path": "vipercard/doc/page_video2.md",
    "chars": 231,
    "preview": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/VYnXucRurY0?rel=0&autoplay=1\" style=\"border:0px\" all"
  },
  {
    "path": "vipercard/doc/page_video3.md",
    "chars": 231,
    "preview": "<iframe width=\"900\" height=\"480\" src=\"https://www.youtube.com/embed/oCaGCMDwZPc?rel=0&autoplay=1\" style=\"border:0px\" all"
  },
  {
    "path": "vipercard/doc/page_why.md",
    "chars": 4817,
    "preview": "\n\n# Why\n\nViperCard is a fun project for creating games and animations, but it also makes me reflect on the process of wr"
  },
  {
    "path": "vipercard/doc/readme.md",
    "chars": 383,
    "preview": "\nHere's the ViperCard script reference, as it is shown within the application.\n\n* [01 Overview](reference_01_overview.md"
  },
  {
    "path": "vipercard/doc/reference_01_overview",
    "chars": 28109,
    "preview": "\n \n============================================================\n========================= Introduction\n================="
  },
  {
    "path": "vipercard/doc/reference_01_overview.md",
    "chars": 26919,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\nOverview | [Commands](./reference_02_commands.md) | [Syntax]("
  },
  {
    "path": "vipercard/doc/reference_02_commands",
    "chars": 16152,
    "preview": "\n\n============================================================\n========================= add\n==========================="
  },
  {
    "path": "vipercard/doc/reference_02_commands.md",
    "chars": 12375,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | Commands | [Syntax]("
  },
  {
    "path": "vipercard/doc/reference_03_syntax",
    "chars": 7645,
    "preview": "\n\n\n============================================================\n========================= (Operators)\n=================="
  },
  {
    "path": "vipercard/doc/reference_03_syntax.md",
    "chars": 6593,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./referen"
  },
  {
    "path": "vipercard/doc/reference_04_properties",
    "chars": 17967,
    "preview": "\n \n\n============================================================\n========================= id\n=========================="
  },
  {
    "path": "vipercard/doc/reference_04_properties.md",
    "chars": 11184,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./referen"
  },
  {
    "path": "vipercard/doc/reference_05_functions",
    "chars": 21089,
    "preview": "\n \n============================================================\n========================= abs(x)\n======================="
  },
  {
    "path": "vipercard/doc/reference_05_functions.md",
    "chars": 13380,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./referen"
  },
  {
    "path": "vipercard/doc/reference_06_events",
    "chars": 8732,
    "preview": "\n \n\n============================================================\n========================= afterKeyDown\n================"
  },
  {
    "path": "vipercard/doc/reference_06_events.md",
    "chars": 6839,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./referen"
  },
  {
    "path": "vipercard/doc/reference_07_compatibility",
    "chars": 9437,
    "preview": "\n\n============================================================\n========================= (Compatibility)\n==============="
  },
  {
    "path": "vipercard/doc/reference_07_compatibility.md",
    "chars": 5691,
    "preview": "<!---\nthis is a generated file, changes will be lost.\n-->\n\n[Overview](./reference_01_overview.md) | [Commands](./referen"
  },
  {
    "path": "vipercard/vipercard/.eslintrc.js",
    "chars": 7053,
    "preview": "/* Useful references:\nhttps://www.npmjs.com/package/eslint-config-react-app\nhttps://github.com/facebook/create-react-app"
  },
  {
    "path": "vipercard/vipercard/.gitignore",
    "chars": 600,
    "preview": "\nnocpy_*\ndist/\n*.pyc\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented l"
  },
  {
    "path": "vipercard/vipercard/.prettierrc.js",
    "chars": 547,
    "preview": "module.exports = {\n    /* note: because prettier strips most formatting on its way down to an AST, */\n    /* it strips p"
  },
  {
    "path": "vipercard/vipercard/.prettierrc_longer.js",
    "chars": 152,
    "preview": "module.exports = {\n    semi: true,\n    trailingComma: 'none',\n    singleQuote: true,\n    printWidth: 130,\n    tabWidth: "
  },
  {
    "path": "vipercard/vipercard/.vscode/launch.json",
    "chars": 315,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"chrome\",\n            \"request\": \"launch"
  },
  {
    "path": "vipercard/vipercard/.vscode/settings.json",
    "chars": 760,
    "preview": "{\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    \"[javascript]\": {\n        \"editor.defaultFormatter\": \"esb"
  },
  {
    "path": "vipercard/vipercard/.vscode/tasks.json",
    "chars": 1631,
    "preview": "{\n    /* See https://go.microsoft.com/fwlink/?LinkId=733558 \n    for the documentation about the tasks.json format\n    t"
  },
  {
    "path": "vipercard/vipercard/0.3/html/404.html",
    "chars": 1887,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/github-markdown.css",
    "chars": 13378,
    "preview": "@font-face {\n  font-family: octicons-link;\n  src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAA"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_01_overview.html",
    "chars": 35516,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_02_commands.html",
    "chars": 17154,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_03_syntax.html",
    "chars": 10267,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_04_properties.html",
    "chars": 16960,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_05_functions.html",
    "chars": 18979,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_06_events.html",
    "chars": 10104,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/reference_07_compatibility.html",
    "chars": 9435,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/script_reference/smalltheme.css",
    "chars": 3702,
    "preview": "/* \n    smalltheme.css\n    Ben Fisher\n*/\n\n.markdown-body {\n    box-sizing: border-box;\n    min-width: 200px;\n    max-wid"
  },
  {
    "path": "vipercard/vipercard/0.3/html/terms.html",
    "chars": 16347,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video.html",
    "chars": 2297,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video1.html",
    "chars": 2103,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video2.html",
    "chars": 2106,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/video3.html",
    "chars": 2133,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/html/why.html",
    "chars": 6825,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\t<head><!-- Styles by GithubMarkdown, MIT license, Sindre Sorhus -->\n<meta name=\"descri"
  },
  {
    "path": "vipercard/vipercard/0.3/index.dev.html",
    "chars": 2702,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"Content-Security-Policy\" co"
  },
  {
    "path": "vipercard/vipercard/0.3/style.css",
    "chars": 888,
    "preview": "\ncanvas {\n    image-rendering: optimizeSpeed;\n    image-rendering: -moz-crisp-edges;\n    image-rendering: -webkit-optimi"
  },
  {
    "path": "vipercard/vipercard/BingSiteAuth.xml",
    "chars": 85,
    "preview": "<?xml version=\"1.0\"?>\n<users>\n\t<user>8A1E5D2B537BBA3E6ADDC00E6B7B2E7C</user>\n</users>"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/CHANGELOG.md",
    "chars": 2500,
    "preview": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changel"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.d.ts",
    "chars": 698,
    "preview": "// Type definitions for FileSaver.js\n// Project: https://github.com/eligrey/FileSaver.js/\n// Definitions by: Cyril Schum"
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/FileSaver.js",
    "chars": 5671,
    "preview": "(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([], factory);\n  } else if ("
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/LICENSE.md",
    "chars": 1100,
    "preview": "The MIT License\n\nCopyright © 2016 [Eli Grey][1].\n\nPermission is hereby granted, free of charge, to any person obtaining "
  },
  {
    "path": "vipercard/vipercard/external/FileSaver.js-2.0.2/README.md",
    "chars": 6059,
    "preview": "If you need to save really large files bigger then the blob's size limitation or don't have\nenough RAM, then have a look"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Jameson Little\n\nPermission is hereby granted, free of charge, to any person ob"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/README.md",
    "chars": 967,
    "preview": "base64-js\n=========\n\n`base64-js` does basic base64 encoding/decoding in pure JS.\n\n[![build status](https://secure.travis"
  },
  {
    "path": "vipercard/vipercard/external/base64-js-1.3.1/base64js.js",
    "chars": 3944,
    "preview": "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nv"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/LICENSE",
    "chars": 1797,
    "preview": "Copyright 2015, Dustin Diaz (the \"Original Author\")\nAll rights reserved.\n\nMIT License\n\nPermission is hereby granted, fre"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/README.md",
    "chars": 7296,
    "preview": "## Bowser\nA small, fast and rich-API browser/platform/engine detector for both browser and node.\n- **Small.** Use plain "
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/bowser-2.9-bundled.js",
    "chars": 113349,
    "preview": "!function(t,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.am"
  },
  {
    "path": "vipercard/vipercard/external/bowser-2.9/bowser.d.ts",
    "chars": 5786,
    "preview": "// Type definitions for Bowser v2\n// Project: https://github.com/lancedikson/bowser\n// Definitions by: Alexander P. Ceru"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/README.md",
    "chars": 272,
    "preview": "# Chevrotain\n\nFor details see:\n\n-   Chevrotain's [website](https://sap.github.io/chevrotain/docs/).\n-   Chevrotain's roo"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/chevrotain.js",
    "chars": 421287,
    "preview": "/*! chevrotain - v6.5.0 */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' &"
  },
  {
    "path": "vipercard/vipercard/external/chevrotain-6.5.0/chevrotaintyping.d.ts",
    "chars": 88978,
    "preview": "export as namespace chevrotain\n\nexport declare const VERSION: string\n\n/**\n * This class does not actually exists nor is "
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/LICENSE",
    "chars": 1062,
    "preview": "MIT License\n\nCopyright (c) Zeno Rocha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof t"
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/clipboard.js",
    "chars": 29861,
    "preview": "/*!\n * clipboard.js v2.0.6\n * https://clipboardjs.com/\n * \n * Licensed MIT © Zeno Rocha\n */\n(function webpackUniversalMo"
  },
  {
    "path": "vipercard/vipercard/external/clipboard.js-2.0.6-notbundled/readme.md",
    "chars": 8301,
    "preview": "# clipboard.js\n\n[![Build Status](http://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://tra"
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/(already in typescript)",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/LICENSE",
    "chars": 193,
    "preview": "easy.filter Bresenham\nhttp://members.chello.at/easyfilter/bresenham.html\nAlois Zingl, Vienna, Austria\nBresenham Curve Ra"
  },
  {
    "path": "vipercard/vipercard/external/easyfilter-notbundled/bresenham.js",
    "chars": 68792,
    "preview": "/**\n * Bresenham Curve Rasterizing Algorithms\n * @author  Zingl Alois\n * @date    17.12.2014\n * @version 1.3\n * @url    "
  },
  {
    "path": "vipercard/vipercard/external/externaldelaybundlebig.js",
    "chars": 449218,
    "preview": "\n// externaldelaybundle\n// changes here will be overwritten\n\n\n\n// begin:./chevrotain-6.5.0/chevrotain.js\n/*! chevrotain "
  },
  {
    "path": "vipercard/vipercard/external/externaldelaybundlemin.js",
    "chars": 171395,
    "preview": "\n// externaldelaybundle\n// changes here will be overwritten\n\n\n\n// begin:./chevrotain-6.5.0/chevrotain.min.js\n/*! chevrot"
  },
  {
    "path": "vipercard/vipercard/external/externalmanualbundlebig.js",
    "chars": 125749,
    "preview": "\n// externalmanualbundle\n// changes here will be overwritten\n\n\n\n// begin:./base64-js-1.3.1/base64js.min.js\n(function(r){"
  },
  {
    "path": "vipercard/vipercard/external/externalmanualbundlemin.js",
    "chars": 125749,
    "preview": "\n// externalmanualbundle\n// changes here will be overwritten\n\n\n\n// begin:./base64-js-1.3.1/base64js.min.js\n(function(r){"
  },
  {
    "path": "vipercard/vipercard/external/golly/golly.js",
    "chars": 9849,
    "preview": "/* golly.js : v0.0.1 on 09/12/2012\n* http://dannygarcia.github.com/golly/\n* Copyright (c) 2012 Danny Garcia; Licensed MI"
  },
  {
    "path": "vipercard/vipercard/external/golly/golly.txt",
    "chars": 1467,
    "preview": "https://github.com/dannygarcia/golly\n\ngolly.js (gee.js)\ngolly.js is a library that makes it quick to start sketching wit"
  },
  {
    "path": "vipercard/vipercard/external/golly/license.txt",
    "chars": 1162,
    "preview": "MIT License\n\ngolly.js is freely distributable under the terms of the MIT license.\n\nCopyright (c) 2012, Danny Garcia. All"
  },
  {
    "path": "vipercard/vipercard/external/js-lru/js-lru.d.ts",
    "chars": 2124,
    "preview": "// An entry holds the key and value, and pointers to any older and newer entries.\ninterface Entry<K, V> {\n    key: K;\n  "
  },
  {
    "path": "vipercard/vipercard/external/js-lru/js-lru.js",
    "chars": 5763,
    "preview": "// https://github.com/rsms/js-lru/blob/master/lru.js\n/**\n * A doubly linked list-based Least Recently Used (LRU) cache. "
  },
  {
    "path": "vipercard/vipercard/external/js-lru/license.txt",
    "chars": 1095,
    "preview": "MIT license\n\nCopyright (c) 2010-2016 Rasmus Andersson https://rsms.me/\n\nPermission is hereby granted, free of charge, to"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/(loaded dynamically)",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/LICENSE",
    "chars": 1084,
    "preview": "Copyright (c) 2010-2014 Kevin Kwok <antimatter15@gmail.com>\n\nPermission is hereby granted, free of charge, to any person"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/jsgif.txt",
    "chars": 3308,
    "preview": "https://github.com/antimatter15/jsgif\n\nPure JavaScript HTML5 to (Animated) GIF Conversion\nBased on as3gif Ported by Kevi"
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/jsgifcombined.js",
    "chars": 41246,
    "preview": "/**\n * This class handles LZW encoding\n * Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott.\n * @author "
  },
  {
    "path": "vipercard/vipercard/external/jsgif-dynamic/modified_to_expose_getblob.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/LICENSE.txt",
    "chars": 479,
    "preview": "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE \n                    Version 2, December 2004 \n\n Copyright (C) 2004 Sam Hoce"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/README.md",
    "chars": 625,
    "preview": "lz-string\n=========\nLZ-based compression algorithm for JavaScript\n\n## Warning (migrating from version 1.3.4 - nov 2014)\n"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/base64-string.js",
    "chars": 8233,
    "preview": "// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// un"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/lz-string.js",
    "chars": 15870,
    "preview": "// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// un"
  },
  {
    "path": "vipercard/vipercard/external/lz-string-1.4.4/lzstring.d.ts",
    "chars": 3570,
    "preview": "// Type definitions for lz-string 1.3\n// Project: https://github.com/pieroxy/lz-string, http://pieroxy.net/blog/pages/lz"
  },
  {
    "path": "vipercard/vipercard/external/manualbundle.py",
    "chars": 1925,
    "preview": "\nimport os\nimport sys\nsys.path.append('../tools/typescript-super-auto-import/bn_python_common.zip')\nfrom bn_python_commo"
  },
  {
    "path": "vipercard/vipercard/external/pbkdf2/pbkdf2.txt",
    "chars": 111,
    "preview": " * pbkdf2, gist by Chris Veness\n * takes a user-typed password, and uses a salt to generate a ArrayBuffer key.\n"
  },
  {
    "path": "vipercard/vipercard/external/pizzicato-dynamic/LICENSE",
    "chars": 1092,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Alejandro Mantecon Guillen\n\nPermission is hereby granted, free of charge, to a"
  },
  {
    "path": "vipercard/vipercard/external/pizzicato-dynamic/Pizzicato.js",
    "chars": 82858,
    "preview": "(function(root) {\n    'use strict';\n\n    var Pizzicato = {};\n    var Pz = Pizzicato;\n    var commonJS = typeof module =="
  },
  {
    "path": "vipercard/vipercard/external/pizzicato-dynamic/README.md",
    "chars": 37368,
    "preview": "<img align=\"center\" src=\"https://alemangui.github.io/pizzicato/img/horizontal-logo-outline.svg\" alt=\"Pizzicato.js\">\n\n[!["
  },
  {
    "path": "vipercard/vipercard/external/text-encoding-types-notbundled/index.d.ts",
    "chars": 1655,
    "preview": "// Type definitions for text-encoding\n// Project: https://github.com/inexorabletash/text-encoding\n// Definitions by: MIZ"
  },
  {
    "path": "vipercard/vipercard/external/text-encoding-types-notbundled/license.txt",
    "chars": 1083,
    "preview": "Definitions by: MIZUNE Pine <https://github.com/pine613>\n\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "vipercard/vipercard/index.html",
    "chars": 5872,
    "preview": "\n\n\n<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IE"
  },
  {
    "path": "vipercard/vipercard/package.json",
    "chars": 1982,
    "preview": "{\n  \"name\": \"vipercard\",\n  \"version\": \"0.0.3\",\n  \"description\": \"vipercard\",\n  \"scripts\": {\n    \"prestart\": \"node ./tool"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_anim.json",
    "chars": 11415,
    "preview": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_game.json",
    "chars": 3816,
    "preview": "{\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002060\",\"uuid\":\"e39fc80b-e84d-4b8b-bede-87a68"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_glider.json",
    "chars": 68511,
    "preview": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_graphics.json",
    "chars": 3903,
    "preview": "{\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002060\",\"uuid\":\"f883a96e-33db-4c81-9128-cf855"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/demo_spacegame.json",
    "chars": 497643,
    "preview": "{\"__isUtil512Serializable\":true,\"product\":\"vpc\",\"fileformatmajor\":3,\"fileformatminor\":0,\"buildnumber\":\"00002061\",\"uuid\":"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refcommands.json",
    "chars": 18713,
    "preview": "{\"name\": \"lngCommands\", \"entries\": [{\"title\": \"add\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u0002"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refcompatibility.json",
    "chars": 11861,
    "preview": "{\"name\": \"lngCompatibility\", \"entries\": [{\"title\": \"(Compatibility)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refevents.json",
    "chars": 10407,
    "preview": "{\"name\": \"lngEvent Handlers\", \"entries\": [{\"title\": \"afterKeyDown\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/reffunctions.json",
    "chars": 25193,
    "preview": "{\"name\": \"lngFunctions\", \"entries\": [{\"title\": \"abs(x)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refoverview.json",
    "chars": 37502,
    "preview": "{\"name\": \"lngOverview\", \"entries\": [{\"title\": \"Introduction\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuos"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refproperties.json",
    "chars": 21264,
    "preview": "{\"name\": \"lngProperties\", \"entries\": [{\"title\": \"id\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce\\u000"
  },
  {
    "path": "vipercard/vipercard/resources03a/docs/refsyntax.json",
    "chars": 10416,
    "preview": "{\"name\": \"lngSyntax\", \"entries\": [{\"title\": \"(Operators)\", \"body\": \"\\u0002times_12_biuosdce\\u0002\\u0002times_24_biuosdce"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+b+iu+osdce.json",
    "chars": 6495,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+b+iuosdce.json",
    "chars": 6334,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+biu+osdce.json",
    "chars": 6504,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_+biuosdce.json",
    "chars": 6286,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_b+iu+osdce.json",
    "chars": 6438,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_b+iuosdce.json",
    "chars": 6268,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_biu+osdce.json",
    "chars": 6414,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_10_biuosdce.json",
    "chars": 6208,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 13, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+b+iu+osdce.json",
    "chars": 6548,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+b+iuosdce.json",
    "chars": 6460,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+biu+osdce.json",
    "chars": 6551,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_+biuosdce.json",
    "chars": 6445,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_b+iu+osdce.json",
    "chars": 6537,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_b+iuosdce.json",
    "chars": 6438,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biu+osdce.json",
    "chars": 6533,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 2, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biuos+dce.json",
    "chars": 6401,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_12_biuosdce.json",
    "chars": 6401,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 16, \"leftmost\": 3, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+b+iu+osdce.json",
    "chars": 6538,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+b+iuosdce.json",
    "chars": 6497,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+biu+osdce.json",
    "chars": 6565,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_+biuosdce.json",
    "chars": 6518,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_b+iu+osdce.json",
    "chars": 6528,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_b+iuosdce.json",
    "chars": 6476,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_biu+osdce.json",
    "chars": 6547,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 15, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_14_biuosdce.json",
    "chars": 6488,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+b+iu+osdce.json",
    "chars": 6576,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+b+iuosdce.json",
    "chars": 6567,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+biu+osdce.json",
    "chars": 6630,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_+biuosdce.json",
    "chars": 6625,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_b+iu+osdce.json",
    "chars": 6575,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_b+iuosdce.json",
    "chars": 6544,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_biu+osdce.json",
    "chars": 6628,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 26, \"leftmost\": 2, \"capHeight\": 19, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_18_biuosdce.json",
    "chars": 6589,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 24, \"leftmost\": 3, \"capHeight\": 18, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+b+iu+osdce.json",
    "chars": 6623,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+b+iuosdce.json",
    "chars": 6613,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+biu+osdce.json",
    "chars": 6671,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_+biuosdce.json",
    "chars": 6671,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_b+iu+osdce.json",
    "chars": 6623,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_b+iuosdce.json",
    "chars": 6611,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_biu+osdce.json",
    "chars": 6671,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 34, \"leftmost\": 2, \"capHeight\": 25, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_24_biuosdce.json",
    "chars": 6669,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 32, \"leftmost\": 3, \"capHeight\": 24, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+b+iu+osdce.json",
    "chars": 6396,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+b+iuosdce.json",
    "chars": 6230,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+biu+osdce.json",
    "chars": 6383,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_+biuosdce.json",
    "chars": 6158,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_b+iu+osdce.json",
    "chars": 6303,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_b+iuosdce.json",
    "chars": 6076,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_biu+osdce.json",
    "chars": 6231,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/00_9_biuosdce.json",
    "chars": 5978,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+b+iu+osdce.json",
    "chars": 6441,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+b+iuosdce.json",
    "chars": 6347,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+biu+osdce.json",
    "chars": 6463,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_+biuosdce.json",
    "chars": 6332,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_b+iu+osdce.json",
    "chars": 6414,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_b+iuosdce.json",
    "chars": 6122,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_biu+osdce.json",
    "chars": 6417,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_10_biuosdce.json",
    "chars": 5912,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+b+iu+osdce.json",
    "chars": 6519,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+b+iuosdce.json",
    "chars": 6413,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+biu+osdce.json",
    "chars": 6540,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_+biuosdce.json",
    "chars": 6438,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_b+iu+osdce.json",
    "chars": 6515,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_b+iuosdce.json",
    "chars": 6408,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_biu+osdce.json",
    "chars": 6540,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 14, \"leftmost\": 2, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_12_biuosdce.json",
    "chars": 6434,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 12, \"leftmost\": 3, \"capHeight\": 10, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+b+iu+osdce.json",
    "chars": 6530,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+b+iuosdce.json",
    "chars": 6455,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+biu+osdce.json",
    "chars": 6565,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_+biuosdce.json",
    "chars": 6476,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_b+iu+osdce.json",
    "chars": 6527,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_b+iuosdce.json",
    "chars": 6453,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_biu+osdce.json",
    "chars": 6565,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 17, \"leftmost\": 2, \"capHeight\": 12, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_14_biuosdce.json",
    "chars": 6476,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 15, \"leftmost\": 3, \"capHeight\": 11, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+b+iu+osdce.json",
    "chars": 6556,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+b+iuosdce.json",
    "chars": 6530,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+biu+osdce.json",
    "chars": 6595,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_+biuosdce.json",
    "chars": 6566,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_b+iu+osdce.json",
    "chars": 6555,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_b+iuosdce.json",
    "chars": 6530,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_biu+osdce.json",
    "chars": 6593,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 20, \"leftmost\": 2, \"capHeight\": 14, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  },
  {
    "path": "vipercard/vipercard/resources03a/fonts/01_18_biuosdce.json",
    "chars": 6566,
    "preview": "{\"version\": \"0.1\", \"lineheight\": 18, \"leftmost\": 3, \"capHeight\": 13, \"bounds\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0"
  }
]

// ... and 621 more files (download for full content)

About this extraction

This page contains the full source code of the downpoured/vipercard GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 821 files (25.2 MB), approximately 2.6M tokens, and a symbol index with 3915 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!